iS>ζΦ¦o°σoςΞfsO 9 .νώιβ\"ΠF
lσ20επE!Qα¦ηΛD9dΡBW4\0ϋy`RoF>FΔa0ωΚσ0 ΐ2η<IΟP'\\ρηΘIΜ\0\$\n R aUΠ.sΠ«ζ\"ω1Π
eΊYη ’Zκqρ1 |Ηχ#―G!±PP\0|HΗFnp>Wό:’`YP%Δβ\nΘa8ΓP>ΑΑθ`]4`<Πr\0ωΓη¨ϋ‘z4Ω₯Λ8ωΞΠ4σ`mγh:’Ξͺ¬HDͺγΐjΟ+p>*δΓΔκ8δΥ 08AΈΘ:ΐ»Ρ΄]wκΓΊωz>9\n+―ηηΝΐρΨ:°iiPoG0°Φφ1ώ¬)μZ°Ϊθn€ΘμΧeRΦάνg£M’ΰΐgsLC½rη8Π!°ΐ3R)Ξϊ0³0τs¨IιJVPpK\n|9e[αΦΗΛ²D0‘Υ ΰz4Οͺo₯Τιαθΰ΄,N8nεΨs΅#{θ·z3π>ΈBSύ\";ΐe5VD0±¬[\$7z0¬ΊψΓΛγ=8ώ T 3χ»¨Qχ'R±ΨnΘΌLΠyΕμφ'£\0oδΫ,»\0:[}(’|ΧϊX>xvqWα?tBE1wG;σ!έ5Ξ|Η0―»JI@―¨#’ήuΕIαψ\\p8Ϋ!']ίl-lεSίBΨπ,Σ·»ς]θρ¬1ΤHφNΒ8%%€ Ε/;FGSτςτhι\\ΩΣcΤt²‘α2|ωWΪ\$tψΞ<ΛhέO¬+#¦BκaN1ωη{ΨΠyΚwς°2\\Z&)½d°b',XxmΓ~Hη@:d >=-¦lK―άώJν\0ΜΜσ@rΟ₯²@\"(AΑροͺύZΌ7Εh>₯χ½\\Νζϊ¨#>¬υψ\0XrγYψοYxΕζq=:ΤΉσ\rloζmgbφφΐΏΐοD_ΰTx·C³ί0.τyR]Ϊ_έλΗZρΗ»WφIΰλGΤο MΙͺ(Ι|@\0SO¬Θsή {ξ£ψ@k}δFXSΫb8ΰε=ΎΘ_ΤΉl²\0ε=ΘgΑΚ{ HΙyGόΥαΫ s_ώJ\$hkϊFΌqΰχ’Ιd4Οψ»ζΦ'ψ½>vΟ¬ !_7ωVqΣ@1zλ€uSe
υjKdyuλΫΒS©.2\"―{ϊΜKώΨΛ?s·δ¬Λ¦hίRνdι`:yΩεϋGΪΎ\nQιύ·Ωίow'φοhSξ>ρ©ΆLΦX}πe·§ΈGΎβ@9ύγνόWέ|νψΟΉϋ@_χuZ=©,ΈεΜ!}₯ήΒ\0δI@δ#·Ά\"±'γY`Ώ\\?Μίpσ·κ,Gϊ―΅ύΧ_±'εGϊ²Π T#ϋoΝH\rώ\"Κλϊoγ}§ς?¬ώOιΌ7η|'ΞΑ΄=8³M±ρQyτaΘH?±
ί ³\0±φbUdθ67ώΑΎI Oφδοϋ\"-€2_0\rυ?ψ« hOΧΏΆt\0\0002°~ώΒ° 4²’ΜK,ΦohΌΞ Pc£·z`@Ϊΐ\"ξβΰΗH; ,=Μ 'S.bΛΗSΎψΰCcκμ‘R,~ρX@ '
8Z0&ν(np<6]#ψ₯;νCχ.’ΛΠ8»Pπ3ώ°;@ζͺL,+>½p(#Π-f1Δz°Αͺ,8»ί ΖΖPΰ:9ΐο·RπΫ³―Ή)e\0Ϊ’R²°!΅\nr{ΖξeψΞGA@*ΫΚnDφ6Α»πςσνNΈ\rRΤψ8QK²0»ΰι’½ΐ>PN°ά©IQ=r<α;&ΐ°fΑNGJ;πUAυά¦ΧAP&ώυΨγ`©Αόΐ);ψ!Πs\0ξ£Αpp\rΆΰΎn(ψ@
%& S²dY«ήμοuCΪ,₯Ί8O#ΟΑσςoͺκRθ¬v,―#θ―|7Ω\"Cp‘Bτ`μj¦X3«~οRΠ@€ΒvΒψ¨£ΐ9B#Ή @\nπ0>Tνυαΐ-5/‘=θ ΎέE―Η\nηΒd\"!;ήΔp*n¬ΌZ²\08/jX°\r¨>F PΟe>ΐO’LΔ―‘¬O0³\0Ω)kΐΒΊγ¦[ ΐΘΟ³Βκ'LΩ Γερι1 1\0ψ‘Cλ 1TΊ`©ΎμRΚzΌΔ£ξp’°ΑάΆμΐ< .£>ξ¨5έ\0δ»Ή> BnΛ<\"he>ΠΊΊΓ£ηsυ!ΊHύ{ά!\rΠ\rΐ\"¬δ| >R1dΰφχ\"U@ΘD6ΠεΑ’3£ηπ>o\r³ηαΏvL:K2ε+Ζ0μΎ>°Θ\0δν ·Bι{!r*HξΉ§y;`8\0ΘΛΨ―τ½dώ³ϋι\rΓ0Νΐ2Aώΐ£ξΌ?°υ+ϋ\0ΫΓ
\0A―wSϋlΑ²Ώ°\r[Τ‘ͺ6τco=ΆόΌ0§z/J+κψW[·¬~C0ωeό30HQPχDPY}4#YDφ
Ίp) Ί|ϋ@₯&γ-ΐ/F αT «¦aH5#λH.A>Ππ0;.¬ώYΔ‘ Γ*ϋD2 =3· pBnuDw\n!ΔzϋCQ \0ΨΜHQ4DΛ*ρ7\0JΔρ%Δ±puD (τO=!°>u,7»ω1γTM+3ω1:\"PΈΔχRQ?ΏόP°Ό+ω11= M\$ZΔΧlT7Ε,Nq%E!ΜS±2Ε&φU*>GDS&Όͺισozh8881\\:ΡΨZ0hΑΘT C+#Κ±A%€€D!\0ΨοςρΑXDAΐ3\0!\\ν#hΌͺν9bΟT!dͺΟΔYj2τSλΘΕΚ\nA+Ν½€HΘwD`ν(AB*χͺ+%ΥEο¬X.Λ Bι#ΊΘΏΈ&ΩΔXeEo\"Χθ|©rΌͺ8ΔW2@8Daο|ψχNϊhτ₯ΚJ8[¬Ϋ³φΒφWzΨ{Z\"L\0Ά\0Θ8ΨxΫΆX@ΐ E£Νολh;ΏafΌ1Βώ;nΓΞhZ3¨EΒ«0|Ό μφAΰ£tB,~τW£8^»Η Χυ<2/ Ί8’+΄¨ΫO+ %P#Ξ\n?»ί?½ώeΛΑO\\]7(#ϋ©DΫΎ(!c) NφΊΡMFE£#DXξgο)Ύ0Aͺ\0:άrBΖΧ`` ΪθQ³Hc !\n5Ό 9€MX‘pQ^GN‘Hκ'ΔΞΰz5Θ 9{M\0^Ϊ \0'!fWβΟs \0 (γω3τ\n°w@Ή5ΜF\"}.^Δ‘ΈΗB ΔtjGMA9ΓϊΓ‘XώBΗbΨγ`-4Ρch)ΥvΓηΗ|@QqCqθ΄Τ}²9¨ΪLzυξάx\"16β+νΊΆΘ7ΛqI~Gπe{qΞEΈ&Ϋ9D H\0/JκJ2°αiΘ*\nΠIͺζΛΘR\n\$ °Γzρ!ΰ
V0ΐΒ`3ΌPάRΘT0Δ\rHjMΝ\\! WΰΈ!p`ζμN#Θ]!Α―H\" Ο\"pZr\$BΪCqθΉγ2\0Δ\$s’Ί\$€ς)#ω 0Θ\$ή#Ε6wΡωΘΰΔHΰλΐ
ΘΚ1S²6FLεό2/Η€Ϋ²1± Ρω‘Ήz@΄tlΗ>ϊ`)Όr@σ\0? ,΅\$°\n7ή>°ϋπ€&ΐϋi Ι<@ϋο\0 ς5Ι ΐD>θϋςIφΔ2X¬ #>€²U¬²L +ΊμΒ2ΰ £\\λJBγκ\0©%\0 ΐ#%,θό \"ΙZd2b?0ΘΜI #ν£η\$Έ\n` £zs@+IΔ¨\n &\n>Έϋ#ι
½& *£%‘ͺ\0(ςc£h \$Ι>π &ψ8jv΄(0ΐ«\0ͺp )\nd'I](*NιΚXϊ`&Α\$ώ (\$Μx2Io%‘ςuΚ+(@3J4%L£Κ>€(\\ΙnKTCκJ)'l₯\0JU(άς#K)€@Ι(ύ`Βφ4rq\$λx \"\0ΰ #I#* 2¨<μ?θr¨#bz5v\$&\\θπ°ιΜ !Κ±*hόΓχ£x\\\0&Iλ8ΙΎtcλΞΐ!?\n/Ι»+L―`\"€BϊI£ς,°rΒMΙΊ?ΪCΓξ\$>\n£ιK\$0ϊΙ+,Ό³ \"ΚύΓξ\0,d«²e³\$ό°R§€Ω&Έ\nΣ\0°ΐ)°όΐ#Iςά¬N‘€Ν&ξΉ#HΫ¨rΚΌΆp θθ\0ψ@2`\0; #:Σ-μ·n΄Ιω,π 2Ι%t³dIύ.¬ 0£\\tΧKlHύ&'Ίσ° R:δX°£1*¨ΞIόκΠϋD΄’κΤ½@'#Ε/ΰ\n\$Κ«0Λ`'Λ00Ι2:ΌλLΙ «.,ͺrbΊε1βλ-CωJ`δ‘Σ\r£K-όΓμK0?ο;°Δ²#ρ#M&±ΛI%ΘΓπΤ?<Ή \"Κ=+ όθΜω(Μ£ΐJ«2:ί(\\‘ *Μ¬ΆRεω'4ΕψΈώμ¨Ε-·Zνκ*±θΡα θ±<ΛΖΧLΎ\"H :Α\rΨPͺAλ έ·ρ.ιΰθΓs.νΗ\r¨Eΐ`82cηΊθΔX ¨?2Έp31ΌX\$_\0/ΑΘLX«bΖΤ 3ΗΣ*½Jπ@EΖχΑπΕDξr[Σ½^ [₯3OΊΉ2»₯°ΠΈ»€jG κ1ξςψογΤ;τΗϊσ5¨ ½^ιΐl&BΑ\0`ΑPΈ<`ΊK3Κ‘':xFHNδξkHα\$hrGΨΚ P«Ίl¬ο\0Q΅ο4²k[2¬Ψ`μV’ΕQ§+ΈZαΝΎύBΐ©6¬)Σx,O \"v,%ψί\"U±8Ηο\"\0ΪSόnQ±¬N°¨Ηύ@_ξΝ΄¬Ϋ
4 αϊΔON4\rΣμΥόmLΔ\0ΖpάkΐΈν\"MΘ98μn―Mζe€E@1όΨν+Χ²2νκ¦ΝΝ!pε,r£ΰΥ£πY?―1fA Y@Ξb?Ξ¬αQ8Έe>Ξή Νΰ?7;N₯iVLθ\nΐX`Μη\"`£Nά²\0Iώ7ΜξpιyΤ`;E!4ΡDLι<ο΄«6#ΐϊD\"J€<¬Nh@δpγ6ΚΛλ±Α2Ο7[+NΩ2α θcβΏΖx\"σν=<ξgΗ8½©―JΖO! zΡθςΐΑ³ψ~ ");}else{header("Content-Type: image/gif");switch($_GET["file"]){case"plus.gif":echo"GIF89a\0\0\0001ξξξ\0\0\0\0\0!ω\0\0\0,\0\0\0\0\0\0!©ΛνMρΜ*)Ύoϊ―) q‘e΅ξ#ΔςLΛ\0;";break;case"cross.gif":echo"GIF89a\0\0\0001ξξξ\0\0\0\0\0!ω\0\0\0,\0\0\0\0\0\0#©Λν#\naΦFo~yΓ._waα1η±JξGΒLΧ6]\0\0;";break;case"up.gif":echo"GIF89a\0\0\0001ξξξ\0\0\0\0\0!ω\0\0\0,\0\0\0\0\0\0 ©ΛνMQN\nο}τa8yaΕΆ\0Ης\0;";break;case"down.gif":echo"GIF89a\0\0\0001ξξξ\0\0\0\0\0!ω\0\0\0,\0\0\0\0\0\0 ©ΛνMρΜ*)Ύ[Wώ\\’ΗL&ΩΖΆ\0Ης\0;";break;case"arrow.gif":echo"GIF89a\0\n\0\0\0!ω\0\0\0,\0\0\0\0\0\n\0\0i±ͺΣ²ή»\0\0;";break;}}exit;}if($_GET["script"]=="version"){$r=file_open_lock(get_temp_dir()."/adminer.version");if($r)file_write_unlock($r,serialize(array("signature"=>$_POST["signature"],"version"=>$_POST["version"])));exit;}global$b,$f,$k,$zb,$Gb,$Qb,$l,$uc,$yc,$aa,$Qc,$y,$ba,$gd,$Wd,$De,$Of,$Cc,$U,$xg,$Cg,$Jg,$da;if(!$_SERVER["REQUEST_URI"])$_SERVER["REQUEST_URI"]=$_SERVER["ORIG_PATH_INFO"];if(!strpos($_SERVER["REQUEST_URI"],'?')&&$_SERVER["QUERY_STRING"]!="")$_SERVER["REQUEST_URI"].="?$_SERVER[QUERY_STRING]";if($_SERVER["HTTP_X_FORWARDED_PREFIX"])$_SERVER["REQUEST_URI"]=$_SERVER["HTTP_X_FORWARDED_PREFIX"].$_SERVER["REQUEST_URI"];$aa=($_SERVER["HTTPS"]&&strcasecmp($_SERVER["HTTPS"],"off"))||ini_bool("session.cookie_secure");@ini_set("session.use_trans_sid",false);if(!defined("SID")){session_cache_limiter("");session_name("adminer_sid");$ue=array(0,preg_replace('~\?.*~','',$_SERVER["REQUEST_URI"]),"",$aa);if(version_compare(PHP_VERSION,'5.2.0')>=0)$ue[]=true;call_user_func_array('session_set_cookie_params',$ue);session_start();}remove_slashes(array(&$_GET,&$_POST,&$_COOKIE),$kc);if(function_exists("get_magic_quotes_runtime")&&get_magic_quotes_runtime())set_magic_quotes_runtime(false);@set_time_limit(0);@ini_set("zend.ze1_compatibility_mode",false);@ini_set("precision",15);function
+get_lang(){return'fr';}function
+lang($wg,$Qd=null){if(is_array($wg)){$Ie=($Qd==1?0:(!$Qd?0:1));$wg=$wg[$Ie];}$wg=str_replace("%d","%s",$wg);$Qd=format_number($Qd);return
+sprintf($wg,$Qd);}if(extension_loaded('pdo')){class
+Min_PDO{var$_result,$server_info,$affected_rows,$errno,$error,$pdo;function
+__construct(){global$b;$Ie=array_search("SQL",$b->operators);if($Ie!==false)unset($b->operators[$Ie]);}function
+dsn($Db,$Rg,$_e,$de=array()){$de[PDO::ATTR_ERRMODE]=PDO::ERRMODE_SILENT;$de[PDO::ATTR_STATEMENT_CLASS]=array('Min_PDOStatement');try{$this->pdo=new
+PDO($Db,$Rg,$_e,$de);}catch(Exception$Vb){auth_error(h($Vb->getMessage()));}$this->server_info=@$this->pdo->getAttribute(PDO::ATTR_SERVER_VERSION);}function
+quote($Q){return$this->pdo->quote($Q);}function
+query($I,$Dg=false){$J=$this->pdo->query($I);$this->error="";if(!$J){list(,$this->errno,$this->error)=$this->pdo->errorInfo();if(!$this->error)$this->error='Unknown error.';return
+false;}$this->store_result($J);return$J;}function
+multi_query($I){return$this->_result=$this->query($I);}function
+store_result($J=null){if(!$J){$J=$this->_result;if(!$J)return
+false;}if($J->columnCount()){$J->num_rows=$J->rowCount();return$J;}$this->affected_rows=$J->rowCount();return
+true;}function
+next_result(){if(!$this->_result)return
+false;$this->_result->_offset=0;return@$this->_result->nextRowset();}function
+result($I,$m=0){$J=$this->query($I);if(!$J)return
+false;$L=$J->fetch();return$L[$m];}}class
+Min_PDOStatement
+extends
+PDOStatement{var$_offset=0,$num_rows;function
+fetch_assoc(){return$this->fetch(PDO::FETCH_ASSOC);}function
+fetch_row(){return$this->fetch(PDO::FETCH_NUM);}function
+fetch_field(){$L=(object)$this->getColumnMeta($this->_offset++);$L->orgtable=$L->table;$L->orgname=$L->name;$L->charsetnr=(in_array("blob",(array)$L->flags)?63:0);return$L;}}}$zb=array();function
+add_driver($v,$F){global$zb;$zb[$v]=$F;}class
+Min_SQL{var$_conn;function
+__construct($f){$this->_conn=$f;}function
+select($R,$N,$Z,$t,$fe=array(),$_=1,$G=0,$Qe=false){global$b,$y;$Wc=(count($t)selectQueryBuild($N,$Z,$t,$fe,$_,$G);if(!$I)$I="SELECT".limit(($_GET["page"]!="last"&&$_!=""&&$t&&$Wc&&$y=="sql"?"SQL_CALC_FOUND_ROWS ":"").implode(", ",$N)."\nFROM ".table($R),($Z?"\nWHERE ".implode(" AND ",$Z):"").($t&&$Wc?"\nGROUP BY ".implode(", ",$t):"").($fe?"\nORDER BY ".implode(", ",$fe):""),($_!=""?+$_:null),($G?$_*$G:0),"\n");$Lf=microtime(true);$K=$this->_conn->query($I);if($Qe)echo$b->selectQuery($I,$Lf,!$K);return$K;}function
+delete($R,$Xe,$_=0){$I="FROM ".table($R);return
+queries("DELETE".($_?limit1($R,$I,$Xe):" $I$Xe"));}function
+update($R,$P,$Xe,$_=0,$xf="\n"){$Ug=array();foreach($P
+as$z=>$X)$Ug[]="$z = $X";$I=table($R)." SET$xf".implode(",$xf",$Ug);return
+queries("UPDATE".($_?limit1($R,$I,$Xe,$xf):" $I$Xe"));}function
+insert($R,$P){return
+queries("INSERT INTO ".table($R).($P?" (".implode(", ",array_keys($P)).")\nVALUES (".implode(", ",$P).")":" DEFAULT VALUES"));}function
+insertUpdate($R,$M,$Oe){return
+false;}function
+begin(){return
+queries("BEGIN");}function
+commit(){return
+queries("COMMIT");}function
+rollback(){return
+queries("ROLLBACK");}function
+slowQuery($I,$kg){}function
+convertSearch($Kc,$X,$m){return$Kc;}function
+value($X,$m){return(method_exists($this->_conn,'value')?$this->_conn->value($X,$m):(is_resource($X)?stream_get_contents($X):$X));}function
+quoteBinary($pf){return
+q($pf);}function
+warnings(){return'';}function
+tableHelp($F){}}$zb["sqlite"]="SQLite 3";$zb["sqlite2"]="SQLite 2";if(isset($_GET["sqlite"])||isset($_GET["sqlite2"])){define("DRIVER",(isset($_GET["sqlite"])?"sqlite":"sqlite2"));if(class_exists(isset($_GET["sqlite"])?"SQLite3":"SQLiteDatabase")){if(isset($_GET["sqlite"])){class
+Min_SQLite{var$extension="SQLite3",$server_info,$affected_rows,$errno,$error,$_link;function
+__construct($o){$this->_link=new
+SQLite3($o);$Xg=$this->_link->version();$this->server_info=$Xg["versionString"];}function
+query($I){$J=@$this->_link->query($I);$this->error="";if(!$J){$this->errno=$this->_link->lastErrorCode();$this->error=$this->_link->lastErrorMsg();return
+false;}elseif($J->numColumns())return
+new
+Min_Result($J);$this->affected_rows=$this->_link->changes();return
+true;}function
+quote($Q){return(is_utf8($Q)?"'".$this->_link->escapeString($Q)."'":"x'".reset(unpack('H*',$Q))."'");}function
+store_result(){return$this->_result;}function
+result($I,$m=0){$J=$this->query($I);if(!is_object($J))return
+false;$L=$J->_result->fetchArray();return$L[$m];}}class
+Min_Result{var$_result,$_offset=0,$num_rows;function
+__construct($J){$this->_result=$J;}function
+fetch_assoc(){return$this->_result->fetchArray(SQLITE3_ASSOC);}function
+fetch_row(){return$this->_result->fetchArray(SQLITE3_NUM);}function
+fetch_field(){$d=$this->_offset++;$V=$this->_result->columnType($d);return(object)array("name"=>$this->_result->columnName($d),"type"=>$V,"charsetnr"=>($V==SQLITE3_BLOB?63:0),);}function
+__desctruct(){return$this->_result->finalize();}}}else{class
+Min_SQLite{var$extension="SQLite",$server_info,$affected_rows,$error,$_link;function
+__construct($o){$this->server_info=sqlite_libversion();$this->_link=new
+SQLiteDatabase($o);}function
+query($I,$Dg=false){$Fd=($Dg?"unbufferedQuery":"query");$J=@$this->_link->$Fd($I,SQLITE_BOTH,$l);$this->error="";if(!$J){$this->error=$l;return
+false;}elseif($J===true){$this->affected_rows=$this->changes();return
+true;}return
+new
+Min_Result($J);}function
+quote($Q){return"'".sqlite_escape_string($Q)."'";}function
+store_result(){return$this->_result;}function
+result($I,$m=0){$J=$this->query($I);if(!is_object($J))return
+false;$L=$J->_result->fetch();return$L[$m];}}class
+Min_Result{var$_result,$_offset=0,$num_rows;function
+__construct($J){$this->_result=$J;if(method_exists($J,'numRows'))$this->num_rows=$J->numRows();}function
+fetch_assoc(){$L=$this->_result->fetch(SQLITE_ASSOC);if(!$L)return
+false;$K=array();foreach($L
+as$z=>$X)$K[idf_unescape($z)]=$X;return$K;}function
+fetch_row(){return$this->_result->fetch(SQLITE_NUM);}function
+fetch_field(){$F=$this->_result->fieldName($this->_offset++);$Be='(\[.*]|"(?:[^"]|"")*"|(.+))';if(preg_match("~^($Be\\.)?$Be\$~",$F,$C)){$R=($C[3]!=""?$C[3]:idf_unescape($C[2]));$F=($C[5]!=""?$C[5]:idf_unescape($C[4]));}return(object)array("name"=>$F,"orgname"=>$F,"orgtable"=>$R,);}}}}elseif(extension_loaded("pdo_sqlite")){class
+Min_SQLite
+extends
+Min_PDO{var$extension="PDO_SQLite";function
+__construct($o){$this->dsn(DRIVER.":$o","","");}}}if(class_exists("Min_SQLite")){class
+Min_DB
+extends
+Min_SQLite{function
+__construct(){parent::__construct(":memory:");$this->query("PRAGMA foreign_keys = 1");}function
+select_db($o){if(is_readable($o)&&$this->query("ATTACH ".$this->quote(preg_match("~(^[/\\\\]|:)~",$o)?$o:dirname($_SERVER["SCRIPT_FILENAME"])."/$o")." AS a")){parent::__construct($o);$this->query("PRAGMA foreign_keys = 1");$this->query("PRAGMA busy_timeout = 500");return
+true;}return
+false;}function
+multi_query($I){return$this->_result=$this->query($I);}function
+next_result(){return
+false;}}}class
+Min_Driver
+extends
+Min_SQL{function
+insertUpdate($R,$M,$Oe){$Ug=array();foreach($M
+as$P)$Ug[]="(".implode(", ",$P).")";return
+queries("REPLACE INTO ".table($R)." (".implode(", ",array_keys(reset($M))).") VALUES\n".implode(",\n",$Ug));}function
+tableHelp($F){if($F=="sqlite_sequence")return"fileformat2.html#seqtab";if($F=="sqlite_master")return"fileformat2.html#$F";}}function
+idf_escape($Kc){return'"'.str_replace('"','""',$Kc).'"';}function
+table($Kc){return
+idf_escape($Kc);}function
+connect(){global$b;list(,,$_e)=$b->credentials();if($_e!="")return'Database does not support password.';return
+new
+Min_DB;}function
+get_databases(){return
+array();}function
+limit($I,$Z,$_,$Sd=0,$xf=" "){return" $I$Z".($_!==null?$xf."LIMIT $_".($Sd?" OFFSET $Sd":""):"");}function
+limit1($R,$I,$Z,$xf="\n"){global$f;return(preg_match('~^INTO~',$I)||$f->result("SELECT sqlite_compileoption_used('ENABLE_UPDATE_DELETE_LIMIT')")?limit($I,$Z,1,0,$xf):" $I WHERE rowid = (SELECT rowid FROM ".table($R).$Z.$xf."LIMIT 1)");}function
+db_collation($j,$Pa){global$f;return$f->result("PRAGMA encoding");}function
+engines(){return
+array();}function
+logged_user(){return
+get_current_user();}function
+tables_list(){return
+get_key_vals("SELECT name, type FROM sqlite_master WHERE type IN ('table', 'view') ORDER BY (name = 'sqlite_sequence'), name");}function
+count_tables($i){return
+array();}function
+table_status($F=""){global$f;$K=array();foreach(get_rows("SELECT name AS Name, type AS Engine, 'rowid' AS Oid, '' AS Auto_increment FROM sqlite_master WHERE type IN ('table', 'view') ".($F!=""?"AND name = ".q($F):"ORDER BY name"))as$L){$L["Rows"]=$f->result("SELECT COUNT(*) FROM ".idf_escape($L["Name"]));$K[$L["Name"]]=$L;}foreach(get_rows("SELECT * FROM sqlite_sequence",null,"")as$L)$K[$L["name"]]["Auto_increment"]=$L["seq"];return($F!=""?$K[$F]:$K);}function
+is_view($S){return$S["Engine"]=="view";}function
+fk_support($S){global$f;return!$f->result("SELECT sqlite_compileoption_used('OMIT_FOREIGN_KEY')");}function
+fields($R){global$f;$K=array();$Oe="";foreach(get_rows("PRAGMA table_info(".table($R).")")as$L){$F=$L["name"];$V=strtolower($L["type"]);$ob=$L["dflt_value"];$K[$F]=array("field"=>$F,"type"=>(preg_match('~int~i',$V)?"integer":(preg_match('~char|clob|text~i',$V)?"text":(preg_match('~blob~i',$V)?"blob":(preg_match('~real|floa|doub~i',$V)?"real":"numeric")))),"full_type"=>$V,"default"=>(preg_match("~'(.*)'~",$ob,$C)?str_replace("''","'",$C[1]):($ob=="NULL"?null:$ob)),"null"=>!$L["notnull"],"privileges"=>array("select"=>1,"insert"=>1,"update"=>1),"primary"=>$L["pk"],);if($L["pk"]){if($Oe!="")$K[$Oe]["auto_increment"]=false;elseif(preg_match('~^integer$~i',$V))$K[$F]["auto_increment"]=true;$Oe=$F;}}$Hf=$f->result("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = ".q($R));preg_match_all('~(("[^"]*+")+|[a-z0-9_]+)\s+text\s+COLLATE\s+(\'[^\']+\'|\S+)~i',$Hf,$ud,PREG_SET_ORDER);foreach($ud
+as$C){$F=str_replace('""','"',preg_replace('~^"|"$~','',$C[1]));if($K[$F])$K[$F]["collation"]=trim($C[3],"'");}return$K;}function
+indexes($R,$g=null){global$f;if(!is_object($g))$g=$f;$K=array();$Hf=$g->result("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = ".q($R));if(preg_match('~\bPRIMARY\s+KEY\s*\((([^)"]+|"[^"]*"|`[^`]*`)++)~i',$Hf,$C)){$K[""]=array("type"=>"PRIMARY","columns"=>array(),"lengths"=>array(),"descs"=>array());preg_match_all('~((("[^"]*+")+|(?:`[^`]*+`)+)|(\S+))(\s+(ASC|DESC))?(,\s*|$)~i',$C[1],$ud,PREG_SET_ORDER);foreach($ud
+as$C){$K[""]["columns"][]=idf_unescape($C[2]).$C[4];$K[""]["descs"][]=(preg_match('~DESC~i',$C[5])?'1':null);}}if(!$K){foreach(fields($R)as$F=>$m){if($m["primary"])$K[""]=array("type"=>"PRIMARY","columns"=>array($F),"lengths"=>array(),"descs"=>array(null));}}$Kf=get_key_vals("SELECT name, sql FROM sqlite_master WHERE type = 'index' AND tbl_name = ".q($R),$g);foreach(get_rows("PRAGMA index_list(".table($R).")",$g)as$L){$F=$L["name"];$w=array("type"=>($L["unique"]?"UNIQUE":"INDEX"));$w["lengths"]=array();$w["descs"]=array();foreach(get_rows("PRAGMA index_info(".idf_escape($F).")",$g)as$of){$w["columns"][]=$of["name"];$w["descs"][]=null;}if(preg_match('~^CREATE( UNIQUE)? INDEX '.preg_quote(idf_escape($F).' ON '.idf_escape($R),'~').' \((.*)\)$~i',$Kf[$F],$hf)){preg_match_all('/("[^"]*+")+( DESC)?/',$hf[2],$ud);foreach($ud[2]as$z=>$X){if($X)$w["descs"][$z]='1';}}if(!$K[""]||$w["type"]!="UNIQUE"||$w["columns"]!=$K[""]["columns"]||$w["descs"]!=$K[""]["descs"]||!preg_match("~^sqlite_~",$F))$K[$F]=$w;}return$K;}function
+foreign_keys($R){$K=array();foreach(get_rows("PRAGMA foreign_key_list(".table($R).")")as$L){$p=&$K[$L["id"]];if(!$p)$p=$L;$p["source"][]=$L["from"];$p["target"][]=$L["to"];}return$K;}function
+view($F){global$f;return
+array("select"=>preg_replace('~^(?:[^`"[]+|`[^`]*`|"[^"]*")* AS\s+~iU','',$f->result("SELECT sql FROM sqlite_master WHERE name = ".q($F))));}function
+collations(){return(isset($_GET["create"])?get_vals("PRAGMA collation_list",1):array());}function
+information_schema($j){return
+false;}function
+error(){global$f;return
+h($f->error);}function
+check_sqlite_name($F){global$f;$dc="db|sdb|sqlite";if(!preg_match("~^[^\\0]*\\.($dc)\$~",$F)){$f->error=sprintf('Veuillez utiliser l\'une des extensions %s.',str_replace("|",", ",$dc));return
+false;}return
+true;}function
+create_database($j,$Oa){global$f;if(file_exists($j)){$f->error='Le fichier existe.';return
+false;}if(!check_sqlite_name($j))return
+false;try{$A=new
+Min_SQLite($j);}catch(Exception$Vb){$f->error=$Vb->getMessage();return
+false;}$A->query('PRAGMA encoding = "UTF-8"');$A->query('CREATE TABLE adminer (i)');$A->query('DROP TABLE adminer');return
+true;}function
+drop_databases($i){global$f;$f->__construct(":memory:");foreach($i
+as$j){if(!@unlink($j)){$f->error='Le fichier existe.';return
+false;}}return
+true;}function
+rename_database($F,$Oa){global$f;if(!check_sqlite_name($F))return
+false;$f->__construct(":memory:");$f->error='Le fichier existe.';return@rename(DB,$F);}function
+auto_increment(){return" PRIMARY KEY".(DRIVER=="sqlite"?" AUTOINCREMENT":"");}function
+alter_table($R,$F,$n,$oc,$Ta,$Ob,$Oa,$ta,$ye){global$f;$Og=($R==""||$oc);foreach($n
+as$m){if($m[0]!=""||!$m[1]||$m[2]){$Og=true;break;}}$oa=array();$oe=array();foreach($n
+as$m){if($m[1]){$oa[]=($Og?$m[1]:"ADD ".implode($m[1]));if($m[0]!="")$oe[$m[0]]=$m[1][0];}}if(!$Og){foreach($oa
+as$X){if(!queries("ALTER TABLE ".table($R)." $X"))return
+false;}if($R!=$F&&!queries("ALTER TABLE ".table($R)." RENAME TO ".table($F)))return
+false;}elseif(!recreate_table($R,$F,$oa,$oe,$oc,$ta))return
+false;if($ta){queries("BEGIN");queries("UPDATE sqlite_sequence SET seq = $ta WHERE name = ".q($F));if(!$f->affected_rows)queries("INSERT INTO sqlite_sequence (name, seq) VALUES (".q($F).", $ta)");queries("COMMIT");}return
+true;}function
+recreate_table($R,$F,$n,$oe,$oc,$ta,$x=array()){global$f;if($R!=""){if(!$n){foreach(fields($R)as$z=>$m){if($x)$m["auto_increment"]=0;$n[]=process_field($m,$m);$oe[$z]=idf_escape($z);}}$Pe=false;foreach($n
+as$m){if($m[6])$Pe=true;}$Bb=array();foreach($x
+as$z=>$X){if($X[2]=="DROP"){$Bb[$X[1]]=true;unset($x[$z]);}}foreach(indexes($R)as$bd=>$w){$e=array();foreach($w["columns"]as$z=>$d){if(!$oe[$d])continue
+2;$e[]=$oe[$d].($w["descs"][$z]?" DESC":"");}if(!$Bb[$bd]){if($w["type"]!="PRIMARY"||!$Pe)$x[]=array($w["type"],$bd,$e);}}foreach($x
+as$z=>$X){if($X[0]=="PRIMARY"){unset($x[$z]);$oc[]=" PRIMARY KEY (".implode(", ",$X[2]).")";}}foreach(foreign_keys($R)as$bd=>$p){foreach($p["source"]as$z=>$d){if(!$oe[$d])continue
+2;$p["source"][$z]=idf_unescape($oe[$d]);}if(!isset($oc[" $bd"]))$oc[]=" ".format_foreign_key($p);}queries("BEGIN");}foreach($n
+as$z=>$m)$n[$z]=" ".implode($m);$n=array_merge($n,array_filter($oc));$fg=($R==$F?"adminer_$F":$F);if(!queries("CREATE TABLE ".table($fg)." (\n".implode(",\n",$n)."\n)"))return
+false;if($R!=""){if($oe&&!queries("INSERT INTO ".table($fg)." (".implode(", ",$oe).") SELECT ".implode(", ",array_map('idf_escape',array_keys($oe)))." FROM ".table($R)))return
+false;$Ag=array();foreach(triggers($R)as$zg=>$lg){$yg=trigger($zg);$Ag[]="CREATE TRIGGER ".idf_escape($zg)." ".implode(" ",$lg)." ON ".table($F)."\n$yg[Statement]";}$ta=$ta?0:$f->result("SELECT seq FROM sqlite_sequence WHERE name = ".q($R));if(!queries("DROP TABLE ".table($R))||($R==$F&&!queries("ALTER TABLE ".table($fg)." RENAME TO ".table($F)))||!alter_indexes($F,$x))return
+false;if($ta)queries("UPDATE sqlite_sequence SET seq = $ta WHERE name = ".q($F));foreach($Ag
+as$yg){if(!queries($yg))return
+false;}queries("COMMIT");}return
+true;}function
+index_sql($R,$V,$F,$e){return"CREATE $V ".($V!="INDEX"?"INDEX ":"").idf_escape($F!=""?$F:uniqid($R."_"))." ON ".table($R)." $e";}function
+alter_indexes($R,$oa){foreach($oa
+as$Oe){if($Oe[0]=="PRIMARY")return
+recreate_table($R,$R,array(),array(),array(),0,$oa);}foreach(array_reverse($oa)as$X){if(!queries($X[2]=="DROP"?"DROP INDEX ".idf_escape($X[1]):index_sql($R,$X[0],$X[1],"(".implode(", ",$X[2]).")")))return
+false;}return
+true;}function
+truncate_tables($T){return
+apply_queries("DELETE FROM",$T);}function
+drop_views($Zg){return
+apply_queries("DROP VIEW",$Zg);}function
+drop_tables($T){return
+apply_queries("DROP TABLE",$T);}function
+move_tables($T,$Zg,$dg){return
+false;}function
+trigger($F){global$f;if($F=="")return
+array("Statement"=>"BEGIN\n\t;\nEND");$Kc='(?:[^`"\s]+|`[^`]*`|"[^"]*")+';$_g=trigger_options();preg_match("~^CREATE\\s+TRIGGER\\s*$Kc\\s*(".implode("|",$_g["Timing"]).")\\s+([a-z]+)(?:\\s+OF\\s+($Kc))?\\s+ON\\s*$Kc\\s*(?:FOR\\s+EACH\\s+ROW\\s)?(.*)~is",$f->result("SELECT sql FROM sqlite_master WHERE type = 'trigger' AND name = ".q($F)),$C);$Rd=$C[3];return
+array("Timing"=>strtoupper($C[1]),"Event"=>strtoupper($C[2]).($Rd?" OF":""),"Of"=>idf_unescape($Rd),"Trigger"=>$F,"Statement"=>$C[4],);}function
+triggers($R){$K=array();$_g=trigger_options();foreach(get_rows("SELECT * FROM sqlite_master WHERE type = 'trigger' AND tbl_name = ".q($R))as$L){preg_match('~^CREATE\s+TRIGGER\s*(?:[^`"\s]+|`[^`]*`|"[^"]*")+\s*('.implode("|",$_g["Timing"]).')\s*(.*?)\s+ON\b~i',$L["sql"],$C);$K[$L["name"]]=array($C[1],$C[2]);}return$K;}function
+trigger_options(){return
+array("Timing"=>array("BEFORE","AFTER","INSTEAD OF"),"Event"=>array("INSERT","UPDATE","UPDATE OF","DELETE"),"Type"=>array("FOR EACH ROW"),);}function
+begin(){return
+queries("BEGIN");}function
+last_id(){global$f;return$f->result("SELECT LAST_INSERT_ROWID()");}function
+explain($f,$I){return$f->query("EXPLAIN QUERY PLAN $I");}function
+found_rows($S,$Z){}function
+types(){return
+array();}function
+schemas(){return
+array();}function
+get_schema(){return"";}function
+set_schema($rf){return
+true;}function
+create_sql($R,$ta,$Pf){global$f;$K=$f->result("SELECT sql FROM sqlite_master WHERE type IN ('table', 'view') AND name = ".q($R));foreach(indexes($R)as$F=>$w){if($F=='')continue;$K.=";\n\n".index_sql($R,$w['type'],$F,"(".implode(", ",array_map('idf_escape',$w['columns'])).")");}return$K;}function
+truncate_sql($R){return"DELETE FROM ".table($R);}function
+use_sql($jb){}function
+trigger_sql($R){return
+implode(get_vals("SELECT sql || ';;\n' FROM sqlite_master WHERE type = 'trigger' AND tbl_name = ".q($R)));}function
+show_variables(){global$f;$K=array();foreach(array("auto_vacuum","cache_size","count_changes","default_cache_size","empty_result_callbacks","encoding","foreign_keys","full_column_names","fullfsync","journal_mode","journal_size_limit","legacy_file_format","locking_mode","page_size","max_page_count","read_uncommitted","recursive_triggers","reverse_unordered_selects","secure_delete","short_column_names","synchronous","temp_store","temp_store_directory","schema_version","integrity_check","quick_check")as$z)$K[$z]=$f->result("PRAGMA $z");return$K;}function
+show_status(){$K=array();foreach(get_vals("PRAGMA compile_options")as$ce){list($z,$X)=explode("=",$ce,2);$K[$z]=$X;}return$K;}function
+convert_field($m){}function
+unconvert_field($m,$K){return$K;}function
+support($hc){return
+preg_match('~^(columns|database|drop_col|dump|indexes|descidx|move_col|sql|status|table|trigger|variables|view|view_trigger)$~',$hc);}function
+driver_config(){$Cg=array("integer"=>0,"real"=>0,"numeric"=>0,"text"=>0,"blob"=>0);return
+array('possible_drivers'=>array((isset($_GET["sqlite"])?"SQLite3":"SQLite"),"PDO_SQLite"),'jush'=>"sqlite",'types'=>$Cg,'structured_types'=>array_keys($Cg),'unsigned'=>array(),'operators'=>array("=","<",">","<=",">=","!=","LIKE","LIKE %%","IN","IS NULL","NOT LIKE","NOT IN","IS NOT NULL","SQL"),'functions'=>array("hex","length","lower","round","unixepoch","upper"),'grouping'=>array("avg","count","count distinct","group_concat","max","min","sum"),'edit_functions'=>array(array(),array("integer|real|numeric"=>"+/-","text"=>"||",)),);}}class
+Adminer{var$operators;function
+name(){return"Adminer ";}function
+credentials(){return
+array(SERVER,$_GET["username"],get_password());}function
+connectSsl(){}function
+permanentLogin($h=false){return
+password_file($h);}function
+bruteForceKey(){return$_SERVER["REMOTE_ADDR"];}function
+serverName($O){return
+h($O);}function
+database(){return
+DB;}function
+databases($mc=true){return
+get_databases($mc);}function
+schemas(){return
+schemas();}function
+queryTimeout(){return
+2;}function
+headers(){}function
+csp(){return
+csp();}function
+head(){return
+true;}function
+css(){$K=array();$o="adminer.css";if(file_exists($o))$K[]="$o?v=".crc32(file_get_contents($o));return$K;}function
+loginForm(){global$zb;echo"\n",$this->loginFormField('driver',''.'Système'.' ',html_select("auth[driver]",$zb,DRIVER,"loginDriver(this);")."\n"),$this->loginFormField('server',' '.'Serveur'.' ',' '."\n"),$this->loginFormField('username',' '.'Utilisateur'.' ',' '.script("focus(qs('#username')); qs('#username').form['auth[driver]'].onchange();")),$this->loginFormField('password',' '.'Mot de passe'.' ',' '."\n"),$this->loginFormField('db',' '.'Base de données'.' ',' '."\n"),"
\n"," \n",checkbox("auth[permanent]",1,$_COOKIE["adminer_permanent"],'Authentification permanente')."\n";}function
+loginFormField($F,$Ec,$Y){return$Ec.$Y;}function
+login($rd,$_e){if($_e=="")return
+sprintf('Adminer does not support accessing a database without a password, more information .',target_blank());return
+true;}function
+tableName($Vf){return
+h($Vf["Name"]);}function
+fieldName($m,$fe=0){return''.h($m["field"]).' ';}function
+selectLinks($Vf,$P=""){global$y,$k;echo'
';$qd=array("select"=>'Afficher les donnΓ©es');if(support("table")||support("indexes"))$qd["table"]='Afficher la structure';if(support("table")){if(is_view($Vf))$qd["view"]='Modifier une vue';else$qd["create"]='Modifier la table';}if($P!==null)$qd["edit"]='Nouvel Γ©lΓ©ment';$F=$Vf["Name"];foreach($qd
+as$z=>$X)echo" $X ";echo
+doc_link(array($y=>$k->tableHelp($F)),"?"),"\n";}function
+foreignKeys($R){return
+foreign_keys($R);}function
+backwardKeys($R,$Uf){return
+array();}function
+backwardKeysPrint($va,$L){}function
+selectQuery($I,$Lf,$fc=false){global$y,$k;$K="
\n";if(!$fc&&($ch=$k->warnings())){$v="warnings";$K=", ".'Warnings'." ".script("qsl('a').onclick = partial(toggle, '$v');","")."$K\n$ch
\n";}return"".h(str_replace("\n"," ",$I))." (".format_time($Lf).") ".(support("sql")?" ".'Modifier'." ":"").$K;}function
+sqlCommandQuery($I){return
+shorten_utf8(trim($I),1000);}function
+rowDescription($R){return"";}function
+rowDescriptions($M,$pc){return$M;}function
+selectLink($X,$m){}function
+selectVal($X,$A,$m,$ne){$K=($X===null?"NULL ":(preg_match("~char|binary|boolean~",$m["type"])&&!preg_match("~var~",$m["type"])?"$X":$X));if(preg_match('~blob|bytea|raw|file~',$m["type"])&&!is_utf8($X))$K="".lang(array('%d octet','%d octets'),strlen($ne))." ";if(preg_match('~json~',$m["type"]))$K="$K";return($A?"$K ":$K);}function
+editVal($X,$m){return$X;}function
+tableStructurePrint($n){echo"
\n";}function
+tableIndexesPrint($x){echo"\n";foreach($x
+as$F=>$w){ksort($w["columns"]);$Qe=array();foreach($w["columns"]as$z=>$X)$Qe[]="".h($X)." ".($w["lengths"][$z]?"(".$w["lengths"][$z].")":"").($w["descs"][$z]?" DESC":"");echo"$w[type] ".implode(", ",$Qe)."\n";}echo"
\n";}function
+selectColumnsPrint($N,$e){global$uc,$yc;print_fieldset("select",'SΓ©lectionner',$N);$u=0;$N[""]=array();foreach($N
+as$z=>$X){$X=$_GET["columns"][$z];$d=select_input(" name='columns[$u][col]'",$e,$X["col"],($z!==""?"selectFieldChange":"selectAddRow"));echo"".($uc||$yc?"".optionlist(array(-1=>"")+array_filter(array('Fonctions'=>$uc,'AgrΓ©gation'=>$yc)),$X["fun"])." ".on_help("getTarget(event).value && getTarget(event).value.replace(/ |\$/, '(') + ')'",1).script("qsl('select').onchange = function () { helpClose();".($z!==""?"":" qsl('select, input', this.parentNode).onchange();")." };","")."($d)":$d)."
\n";$u++;}echo"\n";}function
+selectSearchPrint($Z,$e,$x){print_fieldset("search",'Rechercher',$Z);foreach($x
+as$u=>$w){if($w["type"]=="FULLTEXT"){echo"(".implode(" , ",array_map('h',$w["columns"]))." ) AGAINST"," ",script("qsl('input').oninput = selectFieldChange;",""),checkbox("boolean[$u]",1,isset($_GET["boolean"][$u]),"BOOL"),"
\n";}}$Da="this.parentNode.firstChild.onchange();";foreach(array_merge((array)$_GET["where"],array(array()))as$u=>$X){if(!$X||("$X[col]$X[val]"!=""&&in_array($X["op"],$this->operators))){echo"".select_input(" name='where[$u][col]'",$e,$X["col"],($X?"selectFieldChange":"selectAddRow"),"(".'n\'importe oΓΉ'.")"),html_select("where[$u][op]",$this->operators,$X["op"],$Da)," ",script("mixin(qsl('input'), {oninput: function () { $Da }, onkeydown: selectSearchKeydown, onsearch: selectSearchSearch});",""),"
\n";}}echo"\n";}function
+selectOrderPrint($fe,$e,$x){print_fieldset("sort",'Trier',$fe);$u=0;foreach((array)$_GET["order"]as$z=>$X){if($X!=""){echo"".select_input(" name='order[$u]'",$e,$X,"selectFieldChange"),checkbox("desc[$u]",1,isset($_GET["desc"][$z]),'dΓ©croissant')."
\n";$u++;}}echo"".select_input(" name='order[$u]'",$e,"","selectAddRow"),checkbox("desc[$u]",1,false,'dΓ©croissant')."
\n","\n";}function
+selectLimitPrint($_){echo"".'Limite'." ";echo" ",script("qsl('input').oninput = selectFieldChange;",""),"
\n";}function
+selectLengthPrint($ig){if($ig!==null){echo"".'Longueur du texte'." "," ","
\n";}}function
+selectActionPrint($x){echo"".'Action'." "," "," ","\n","
\n";}function
+selectCommandPrint(){return!information_schema(DB);}function
+selectImportPrint(){return!information_schema(DB);}function
+selectEmailPrint($Lb,$e){}function
+selectColumnsProcess($e,$x){global$uc,$yc;$N=array();$t=array();foreach((array)$_GET["columns"]as$z=>$X){if($X["fun"]=="count"||($X["col"]!=""&&(!$X["fun"]||in_array($X["fun"],$uc)||in_array($X["fun"],$yc)))){$N[$z]=apply_sql_function($X["fun"],($X["col"]!=""?idf_escape($X["col"]):"*"));if(!in_array($X["fun"],$yc))$t[]=$N[$z];}}return
+array($N,$t);}function
+selectSearchProcess($n,$x){global$f,$k;$K=array();foreach($x
+as$u=>$w){if($w["type"]=="FULLTEXT"&&$_GET["fulltext"][$u]!="")$K[]="MATCH (".implode(", ",array_map('idf_escape',$w["columns"])).") AGAINST (".q($_GET["fulltext"][$u]).(isset($_GET["boolean"][$u])?" IN BOOLEAN MODE":"").")";}foreach((array)$_GET["where"]as$z=>$X){if("$X[col]$X[val]"!=""&&in_array($X["op"],$this->operators)){$Me="";$Va=" $X[op]";if(preg_match('~IN$~',$X["op"])){$Nc=process_length($X["val"]);$Va.=" ".($Nc!=""?$Nc:"(NULL)");}elseif($X["op"]=="SQL")$Va=" $X[val]";elseif($X["op"]=="LIKE %%")$Va=" LIKE ".$this->processInput($n[$X["col"]],"%$X[val]%");elseif($X["op"]=="ILIKE %%")$Va=" ILIKE ".$this->processInput($n[$X["col"]],"%$X[val]%");elseif($X["op"]=="FIND_IN_SET"){$Me="$X[op](".q($X["val"]).", ";$Va=")";}elseif(!preg_match('~NULL$~',$X["op"]))$Va.=" ".$this->processInput($n[$X["col"]],$X["val"]);if($X["col"]!="")$K[]=$Me.$k->convertSearch(idf_escape($X["col"]),$X,$n[$X["col"]]).$Va;else{$Qa=array();foreach($n
+as$F=>$m){if((preg_match('~^[-\d.'.(preg_match('~IN$~',$X["op"])?',':'').']+$~',$X["val"])||!preg_match('~'.number_type().'|bit~',$m["type"]))&&(!preg_match("~[\x80-\xFF]~",$X["val"])||preg_match('~char|text|enum|set~',$m["type"]))&&(!preg_match('~date|timestamp~',$m["type"])||preg_match('~^\d+-\d+-\d+~',$X["val"])))$Qa[]=$Me.$k->convertSearch(idf_escape($F),$X,$m).$Va;}$K[]=($Qa?"(".implode(" OR ",$Qa).")":"1 = 0");}}}return$K;}function
+selectOrderProcess($n,$x){$K=array();foreach((array)$_GET["order"]as$z=>$X){if($X!="")$K[]=(preg_match('~^((COUNT\(DISTINCT |[A-Z0-9_]+\()(`(?:[^`]|``)+`|"(?:[^"]|"")+")\)|COUNT\(\*\))$~',$X)?$X:idf_escape($X)).(isset($_GET["desc"][$z])?" DESC":"");}return$K;}function
+selectLimitProcess(){return(isset($_GET["limit"])?$_GET["limit"]:"50");}function
+selectLengthProcess(){return(isset($_GET["text_length"])?$_GET["text_length"]:"100");}function
+selectEmailProcess($Z,$pc){return
+false;}function
+selectQueryBuild($N,$Z,$t,$fe,$_,$G){return"";}function
+messageQuery($I,$jg,$fc=false){global$y,$k;restart_session();$Fc=&get_session("queries");if(!$Fc[$_GET["db"]])$Fc[$_GET["db"]]=array();if(strlen($I)>1e6)$I=preg_replace('~[\x80-\xFF]+$~','',substr($I,0,1e6))."\nβ¦";$Fc[$_GET["db"]][]=array($I,time(),$jg);$Jf="sql-".count($Fc[$_GET["db"]]);$K="".'RequΓͺte SQL'." \n";if(!$fc&&($ch=$k->warnings())){$v="warnings-".count($Fc[$_GET["db"]]);$K="".'Warnings'." , $K\n$ch
\n";}return" ".@date("H:i:s")." "." $K".shorten_utf8($I,1000)."".($jg?"
($jg) ":'').(support("sql")?'
'.'Modifier'.' ':'').'
';}function
+editRowPrint($R,$n,$L,$Kg){}function
+editFunctions($m){global$Gb;$K=($m["null"]?"NULL/":"");$Kg=isset($_GET["select"])||where($_GET);foreach($Gb
+as$z=>$uc){if(!$z||(!isset($_GET["call"])&&$Kg)){foreach($uc
+as$Be=>$X){if(!$Be||preg_match("~$Be~",$m["type"]))$K.="/$X";}}if($z&&!preg_match('~set|blob|bytea|raw|file|bool~',$m["type"]))$K.="/SQL";}if($m["auto_increment"]&&!$Kg)$K='IncrΓ©ment automatique';return
+explode("/",$K);}function
+editInput($R,$m,$ra,$Y){if($m["type"]=="enum")return(isset($_GET["select"])?"".'original'." ":"").($m["null"]?"NULL ":"").enum_input("radio",$ra,$m,$Y,0);return"";}function
+editHint($R,$m,$Y){return"";}function
+processInput($m,$Y,$s=""){if($s=="SQL")return$Y;$F=$m["field"];$K=q($Y);if(preg_match('~^(now|getdate|uuid)$~',$s))$K="$s()";elseif(preg_match('~^current_(date|timestamp)$~',$s))$K=$s;elseif(preg_match('~^([+-]|\|\|)$~',$s))$K=idf_escape($F)." $s $K";elseif(preg_match('~^[+-] interval$~',$s))$K=idf_escape($F)." $s ".(preg_match("~^(\\d+|'[0-9.: -]') [A-Z_]+\$~i",$Y)?$Y:$K);elseif(preg_match('~^(addtime|subtime|concat)$~',$s))$K="$s(".idf_escape($F).", $K)";elseif(preg_match('~^(md5|sha1|password|encrypt)$~',$s))$K="$s($K)";return
+unconvert_field($m,$K);}function
+dumpOutput(){$K=array('text'=>'ouvrir','file'=>'enregistrer');if(function_exists('gzencode'))$K['gz']='gzip';return$K;}function
+dumpFormat(){return
+array('sql'=>'SQL','csv'=>'CSV,','csv;'=>'CSV;','tsv'=>'TSV');}function
+dumpDatabase($j){}function
+dumpTable($R,$Pf,$Yc=0){if($_POST["format"]!="sql"){echo"\xef\xbb\xbf";if($Pf)dump_csv(array_keys(fields($R)));}else{if($Yc==2){$n=array();foreach(fields($R)as$F=>$m)$n[]=idf_escape($F)." $m[full_type]";$h="CREATE TABLE ".table($R)." (".implode(", ",$n).")";}else$h=create_sql($R,$_POST["auto_increment"],$Pf);set_utf8mb4($h);if($Pf&&$h){if($Pf=="DROP+CREATE"||$Yc==1)echo"DROP ".($Yc==2?"VIEW":"TABLE")." IF EXISTS ".table($R).";\n";if($Yc==1)$h=remove_definer($h);echo"$h;\n\n";}}}function
+dumpData($R,$Pf,$I){global$f,$y;$wd=($y=="sqlite"?0:1048576);if($Pf){if($_POST["format"]=="sql"){if($Pf=="TRUNCATE+INSERT")echo
+truncate_sql($R).";\n";$n=fields($R);}$J=$f->query($I,1);if($J){$Sc="";$Ca="";$cd=array();$Rf="";$ic=($R!=''?'fetch_assoc':'fetch_row');while($L=$J->$ic()){if(!$cd){$Ug=array();foreach($L
+as$X){$m=$J->fetch_field();$cd[]=$m->name;$z=idf_escape($m->name);$Ug[]="$z = VALUES($z)";}$Rf=($Pf=="INSERT+UPDATE"?"\nON DUPLICATE KEY UPDATE ".implode(", ",$Ug):"").";\n";}if($_POST["format"]!="sql"){if($Pf=="table"){dump_csv($cd);$Pf="INSERT";}dump_csv($L);}else{if(!$Sc)$Sc="INSERT INTO ".table($R)." (".implode(", ",array_map('idf_escape',$cd)).") VALUES";foreach($L
+as$z=>$X){$m=$n[$z];$L[$z]=($X!==null?unconvert_field($m,preg_match(number_type(),$m["type"])&&!preg_match('~\[~',$m["full_type"])&&is_numeric($X)?$X:q(($X===false?0:$X))):"NULL");}$pf=($wd?"\n":" ")."(".implode(",\t",$L).")";if(!$Ca)$Ca=$Sc.$pf;elseif(strlen($Ca)+4+strlen($pf)+strlen($Rf)<$wd)$Ca.=",$pf";else{echo$Ca.$Rf;$Ca=$Sc.$pf;}}}if($Ca)echo$Ca.$Rf;}elseif($_POST["format"]=="sql")echo"-- ".str_replace("\n"," ",$f->error)."\n";}}function
+dumpFilename($Jc){return
+friendly_url($Jc!=""?$Jc:(SERVER!=""?SERVER:"localhost"));}function
+dumpHeaders($Jc,$Id=false){$qe=$_POST["output"];$bc=(preg_match('~sql~',$_POST["format"])?"sql":($Id?"tar":"csv"));header("Content-Type: ".($qe=="gz"?"application/x-gzip":($bc=="tar"?"application/x-tar":($bc=="sql"||$qe!="file"?"text/plain":"text/csv")."; charset=utf-8")));if($qe=="gz")ob_start('ob_gzencode',1e6);return$bc;}function
+importServerPath(){return"adminer.sql";}function
+homepage(){echo''.($_GET["ns"]==""&&support("database")?''.'Modifier la base de données'." \n":""),(support("scheme")?"".($_GET["ns"]!=""?'Modifier le schéma':'Créer un schéma')." \n":""),($_GET["ns"]!==""?''.'Schéma de la base de données'." \n":""),(support("privileges")?"".'Privilèges'." \n":"");return
+true;}function
+navigation($Hd){global$da,$y,$zb,$f;echo'
+';if($Hd=="auth"){$qe="";foreach((array)$_SESSION["pwds"]as$Wg=>$zf){foreach($zf
+as$O=>$Sg){foreach($Sg
+as$Rg=>$_e){if($_e!==null){$mb=$_SESSION["db"][$Wg][$O][$Rg];foreach(($mb?array_keys($mb):array(""))as$j)$qe.="($zb[$Wg]) ".h($Rg.($O!=""?"@".$this->serverName($O):"").($j!=""?" - $j":""))." \n";}}}}if($qe)echo"\n".script("mixin(qs('#logins'), {onmouseover: menuOver, onmouseout: menuOut});");}else{$T=array();if($_GET["ns"]!==""&&!$Hd&&DB!=""){$f->select_db(DB);$T=table_status('',true);}echo
+script_src(preg_replace("~\\?.*~","",ME)."?file=jush.js&version=4.8.1");if(support("sql")){echo'
+';}$this->databasesPrint($Hd);if(DB==""||!$Hd){echo"".(support("sql")?"".'RequΓͺte SQL'." \n".'Importer'." \n":"")."";if(support("dump"))echo"".'Exporter'." \n";}if($_GET["ns"]!==""&&!$Hd&&DB!=""){echo'".'CrΓ©er une table'." \n";if(!$T)echo"
".'Aucune table.'."\n";else$this->tablesPrint($T);}}}function
+databasesPrint($Hd){global$b,$f;$i=$this->databases();if(DB&&$i&&!in_array(DB,$i))array_unshift($i,DB);echo'
\n";}function
+tablesPrint($T){echo"".script("mixin(qs('#tables'), {onmouseover: menuOver, onmouseout: menuOut});");foreach($T
+as$R=>$Mf){$F=$this->tableName($Mf);if($F!=""){echo'".'select'." ",(support("table")||support("indexes")?'$F ":"$F ")."\n";}}echo" \n";}}$b=(function_exists('adminer_object')?adminer_object():new
+Adminer);$Wa=driver_config();$Le=$Wa['possible_drivers'];$y=$Wa['jush'];$Cg=$Wa['types'];$Of=$Wa['structured_types'];$Jg=$Wa['unsigned'];$ae=$Wa['operators'];$uc=$Wa['functions'];$yc=$Wa['grouping'];$Gb=$Wa['edit_functions'];if($b->operators===null)$b->operators=$ae;define("SERVER",$_GET[DRIVER]);define("DB",$_GET["db"]);define("ME",preg_replace('~\?.*~','',relative_uri()).'?'.(sid()?SID.'&':'').(SERVER!==null?DRIVER."=".urlencode(SERVER).'&':'').(isset($_GET["username"])?"username=".urlencode($_GET["username"]).'&':'').(DB!=""?'db='.urlencode(DB).'&'.(isset($_GET["ns"])?"ns=".urlencode($_GET["ns"])."&":""):''));$da="4.8.1";function
+page_header($mg,$l="",$Ba=array(),$ng=""){global$ba,$da,$b,$zb,$y;page_headers();if(is_ajax()&&$l){page_messages($l);exit;}$og=$mg.($ng!=""?": $ng":"");$pg=strip_tags($og.(SERVER!=""&&SERVER!="localhost"?h(" - ".SERVER):"")." - ".$b->name());echo'
+
+
+
+',$pg,'
+
+',script_src(preg_replace("~\\?.*~","",ME)."?file=functions.js&version=4.8.1");if($b->head()){echo'
+
+';foreach($b->css()as$eb){echo'
+';}}echo'
+
+';$o=get_temp_dir()."/adminer.version";if(!$_COOKIE["adminer_version"]&&function_exists('openssl_verify')&&file_exists($o)&&filemtime($o)+86400>time()){$Xg=unserialize(file_get_contents($o));$Ve="-----BEGIN PUBLIC KEY-----
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwqWOVuF5uw7/+Z70djoK
+RlHIZFZPO0uYRezq90+7Amk+FDNd7KkL5eDve+vHRJBLAszF/7XKXe11xwliIsFs
+DFWQlsABVZB3oisKCBEuI71J4kPH8dKGEWR9jDHFw3cWmoH3PmqImX6FISWbG3B8
+h7FIx3jEaw5ckVPVTeo5JRm/1DZzJxjyDenXvBQ/6o9DgZKeNDgxwKzH+sw9/YCO
+jHnq1cFpOIISzARlrHMa/43YfeNRAm/tsBXjSxembBPo7aQZLAWHmaj5+K19H10B
+nCpz9Y++cipkVEiKRGih4ZEvjoFysEOdRLj6WiD/uUNky4xGeA6LaJqh5XpkFkcQ
+fQIDAQAB
+-----END PUBLIC KEY-----
+";if(openssl_verify($Xg["version"],base64_decode($Xg["signature"]),$Ve)==1)$_COOKIE["adminer_version"]=$Xg["version"];}echo'
+
+
+',script("mixin(qs('#help'), {onmouseover: function () { helpOpen = 1; }, onmouseout: helpMouseout});"),'
+
+';if($Ba!==null){$A=substr(preg_replace('~\b(username|db|ns)=[^&]*&~','',ME),0,-1);echo'
'.$zb[DRIVER].' » ';$A=substr(preg_replace('~\b(db|ns)=[^&]*&~','',ME),0,-1);$O=$b->serverName(SERVER);$O=($O!=""?$O:'Serveur');if($Ba===false)echo"$O\n";else{echo"$O » ";if($_GET["ns"]!=""||(DB!=""&&is_array($Ba)))echo''.h(DB).' » ';if(is_array($Ba)){if($_GET["ns"]!="")echo''.h($_GET["ns"]).' » ';foreach($Ba
+as$z=>$X){$sb=(is_array($X)?$X[1]:h($X));if($sb!="")echo"$sb » ";}}echo"$mg\n";}}echo"
$og \n","
\n";restart_session();page_messages($l);$i=&get_session("dbs");if(DB!=""&&$i&&!in_array(DB,$i,true))$i=null;stop_session();define("PAGE_HEADER",1);}function
+page_headers(){global$b;header("Content-Type: text/html; charset=utf-8");header("Cache-Control: no-cache");header("X-Frame-Options: deny");header("X-XSS-Protection: 0");header("X-Content-Type-Options: nosniff");header("Referrer-Policy: origin-when-cross-origin");foreach($b->csp()as$db){$Dc=array();foreach($db
+as$z=>$X)$Dc[]="$z $X";header("Content-Security-Policy: ".implode("; ",$Dc));}$b->headers();}function
+csp(){return
+array(array("script-src"=>"'self' 'unsafe-inline' 'nonce-".get_nonce()."' 'strict-dynamic'","connect-src"=>"'self'","frame-src"=>"https://www.adminer.org","object-src"=>"'none'","base-uri"=>"'none'","form-action"=>"'self'",),);}function
+get_nonce(){static$Nd;if(!$Nd)$Nd=base64_encode(rand_string());return$Nd;}function
+page_messages($l){$Lg=preg_replace('~^[^?]*~','',$_SERVER["REQUEST_URI"]);$Ed=$_SESSION["messages"][$Lg];if($Ed){echo"
".implode("
\n
",$Ed)."
".script("messagesPrint();");unset($_SESSION["messages"][$Lg]);}if($l)echo"
$l
\n";}function
+page_footer($Hd=""){global$b,$U;echo'
+
+';if($Hd!="auth"){echo'
+';}echo'
+',script("setupSubmitHighlight(document);");}function
+int32($E){while($E>=2147483648)$E-=4294967296;while($E<=-2147483649)$E+=4294967296;return(int)$E;}function
+long2str($W,$bh){$pf='';foreach($W
+as$X)$pf.=pack('V',$X);if($bh)return
+substr($pf,0,end($W));return$pf;}function
+str2long($pf,$bh){$W=array_values(unpack('V*',str_pad($pf,4*ceil(strlen($pf)/4),"\0")));if($bh)$W[]=strlen($pf);return$W;}function
+xxtea_mx($ih,$hh,$Sf,$ad){return
+int32((($ih>>5&0x7FFFFFF)^$hh<<2)+(($hh>>3&0x1FFFFFFF)^$ih<<4))^int32(($Sf^$hh)+($ad^$ih));}function
+encrypt_string($Nf,$z){if($Nf=="")return"";$z=array_values(unpack("V*",pack("H*",md5($z))));$W=str2long($Nf,true);$E=count($W)-1;$ih=$W[$E];$hh=$W[0];$H=floor(6+52/($E+1));$Sf=0;while($H-->0){$Sf=int32($Sf+0x9E3779B9);$Fb=$Sf>>2&3;for($re=0;$re<$E;$re++){$hh=$W[$re+1];$Jd=xxtea_mx($ih,$hh,$Sf,$z[$re&3^$Fb]);$ih=int32($W[$re]+$Jd);$W[$re]=$ih;}$hh=$W[0];$Jd=xxtea_mx($ih,$hh,$Sf,$z[$re&3^$Fb]);$ih=int32($W[$E]+$Jd);$W[$E]=$ih;}return
+long2str($W,false);}function
+decrypt_string($Nf,$z){if($Nf=="")return"";if(!$z)return
+false;$z=array_values(unpack("V*",pack("H*",md5($z))));$W=str2long($Nf,false);$E=count($W)-1;$ih=$W[$E];$hh=$W[0];$H=floor(6+52/($E+1));$Sf=int32($H*0x9E3779B9);while($Sf){$Fb=$Sf>>2&3;for($re=$E;$re>0;$re--){$ih=$W[$re-1];$Jd=xxtea_mx($ih,$hh,$Sf,$z[$re&3^$Fb]);$hh=int32($W[$re]-$Jd);$W[$re]=$hh;}$ih=$W[$E];$Jd=xxtea_mx($ih,$hh,$Sf,$z[$re&3^$Fb]);$hh=int32($W[0]-$Jd);$W[0]=$hh;$Sf=int32($Sf-0x9E3779B9);}return
+long2str($W,true);}$f='';$Cc=$_SESSION["token"];if(!$Cc)$_SESSION["token"]=rand(1,1e6);$U=get_token();$De=array();if($_COOKIE["adminer_permanent"]){foreach(explode(" ",$_COOKIE["adminer_permanent"])as$X){list($z)=explode(":",$X);$De[$z]=$X;}}function
+add_invalid_login(){global$b;$r=file_open_lock(get_temp_dir()."/adminer.invalid");if(!$r)return;$Uc=unserialize(stream_get_contents($r));$jg=time();if($Uc){foreach($Uc
+as$Vc=>$X){if($X[0]<$jg)unset($Uc[$Vc]);}}$Tc=&$Uc[$b->bruteForceKey()];if(!$Tc)$Tc=array($jg+30*60,0);$Tc[1]++;file_write_unlock($r,serialize($Uc));}function
+check_invalid_login(){global$b;$Uc=unserialize(@file_get_contents(get_temp_dir()."/adminer.invalid"));$Tc=($Uc?$Uc[$b->bruteForceKey()]:array());$Md=($Tc[1]>29?$Tc[0]-time():0);if($Md>0)auth_error(lang(array('Trop de connexions Γ©chouΓ©es, essayez Γ nouveau dans %d minute.','Trop de connexions Γ©chouΓ©es, essayez Γ nouveau dans %d minutes.'),ceil($Md/60)));}$sa=$_POST["auth"];if($sa){session_regenerate_id();$Wg=$sa["driver"];$O=$sa["server"];$Rg=$sa["username"];$_e=(string)$sa["password"];$j=$sa["db"];set_password($Wg,$O,$Rg,$_e);$_SESSION["db"][$Wg][$O][$Rg][$j]=true;if($sa["permanent"]){$z=base64_encode($Wg)."-".base64_encode($O)."-".base64_encode($Rg)."-".base64_encode($j);$Re=$b->permanentLogin(true);$De[$z]="$z:".base64_encode($Re?encrypt_string($_e,$Re):"");cookie("adminer_permanent",implode(" ",$De));}if(count($_POST)==1||DRIVER!=$Wg||SERVER!=$O||$_GET["username"]!==$Rg||DB!=$j)redirect(auth_url($Wg,$O,$Rg,$j));}elseif($_POST["logout"]&&(!$Cc||verify_token())){foreach(array("pwds","db","dbs","queries")as$z)set_session($z,null);unset_permanent();redirect(substr(preg_replace('~\b(username|db|ns)=[^&]*&~','',ME),0,-1),'Au revoir !'.' '.'Thanks for using Adminer, consider donating .');}elseif($De&&!$_SESSION["pwds"]){session_regenerate_id();$Re=$b->permanentLogin();foreach($De
+as$z=>$X){list(,$Ia)=explode(":",$X);list($Wg,$O,$Rg,$j)=array_map('base64_decode',explode("-",$z));set_password($Wg,$O,$Rg,decrypt_string(base64_decode($Ia),$Re));$_SESSION["db"][$Wg][$O][$Rg][$j]=true;}}function
+unset_permanent(){global$De;foreach($De
+as$z=>$X){list($Wg,$O,$Rg,$j)=array_map('base64_decode',explode("-",$z));if($Wg==DRIVER&&$O==SERVER&&$Rg==$_GET["username"]&&$j==DB)unset($De[$z]);}cookie("adminer_permanent",implode(" ",$De));}function
+auth_error($l){global$b,$Cc;$_f=session_name();if(isset($_GET["username"])){header("HTTP/1.1 403 Forbidden");if(($_COOKIE[$_f]||$_GET[$_f])&&!$Cc)$l='Session expirΓ©e, veuillez vous authentifier Γ nouveau.';else{restart_session();add_invalid_login();$_e=get_password();if($_e!==null){if($_e===false)$l.=($l?' ':'').sprintf('Le mot de passe a expirΓ©. ImplΓ©mentez la mΓ©thode %s afin de le rendre permanent.',target_blank(),'permanentLogin()');set_password(DRIVER,SERVER,$_GET["username"],null);}unset_permanent();}}if(!$_COOKIE[$_f]&&$_GET[$_f]&&ini_bool("session.use_only_cookies"))$l='Veuillez activer les sessions.';$ue=session_get_cookie_params();cookie("adminer_key",($_COOKIE["adminer_key"]?$_COOKIE["adminer_key"]:rand_string()),$ue["lifetime"]);page_header('Authentification',$l,null);echo"\n";page_footer("auth");exit;}if(isset($_GET["username"])&&!class_exists("Min_DB")){unset($_SESSION["pwds"][DRIVER]);unset_permanent();page_header('Extension introuvable',sprintf('Aucune des extensions PHP supportΓ©es (%s) n\'est disponible.',implode(", ",$Le)),false);page_footer("auth");exit;}stop_session(true);if(isset($_GET["username"])&&is_string(get_password())){list($Hc,$He)=explode(":",SERVER,2);if(preg_match('~^\s*([-+]?\d+)~',$He,$C)&&($C[1]<1024||$C[1]>65535))auth_error('Connecting to privileged ports is not allowed.');check_invalid_login();$f=connect();$k=new
+Min_Driver($f);}$rd=null;if(!is_object($f)||($rd=$b->login($_GET["username"],get_password()))!==true){$l=(is_string($f)?h($f):(is_string($rd)?$rd:'Authentification Γ©chouΓ©e.'));auth_error($l.(preg_match('~^ | $~',get_password())?' '.'There is a space in the input password which might be the cause.':''));}if($_POST["logout"]&&$Cc&&!verify_token()){page_header('DΓ©connexion','Token CSRF invalide. Veuillez renvoyer le formulaire.');page_footer("db");exit;}if($sa&&$_POST["token"])$_POST["token"]=$U;$l='';if($_POST){if(!verify_token()){$Pc="max_input_vars";$_d=ini_get($Pc);if(extension_loaded("suhosin")){foreach(array("suhosin.request.max_vars","suhosin.post.max_vars")as$z){$X=ini_get($z);if($X&&(!$_d||$X<$_d)){$Pc=$z;$_d=$X;}}}$l=(!$_POST["token"]&&$_d?sprintf('Le nombre maximum de champs est dΓ©passΓ©. Veuillez augmenter %s.',"'$Pc'"):'Token CSRF invalide. Veuillez renvoyer le formulaire.'.' '.'Si vous n\'avez pas envoyΓ© cette requΓͺte depuis Adminer, alors fermez cette page.');}}elseif($_SERVER["REQUEST_METHOD"]=="POST"){$l=sprintf('DonnΓ©es POST trop grandes. RΓ©duisez la taille des donnΓ©es ou augmentez la valeur de %s dans la configuration de PHP.',"'post_max_size'");if(isset($_GET["sql"]))$l.=' '.'Vous pouvez uploader un gros fichier SQL par FTP et ensuite l\'importer depuis le serveur.';}function
+select($J,$g=null,$ie=array(),$_=0){global$y;$qd=array();$x=array();$e=array();$_a=array();$Cg=array();$K=array();odd('');for($u=0;(!$_||$u<$_)&&($L=$J->fetch_row());$u++){if(!$u){echo"":"".'Aucun rΓ©sultat.')."\n";return$K;}function
+referencable_primary($vf){$K=array();foreach(table_status('',true)as$Wf=>$R){if($Wf!=$vf&&fk_support($R)){foreach(fields($Wf)as$m){if($m["primary"]){if($K[$Wf]){unset($K[$Wf]);break;}$K[$Wf]=$m;}}}}return$K;}function
+adminer_settings(){parse_str($_COOKIE["adminer_settings"],$Bf);return$Bf;}function
+adminer_setting($z){$Bf=adminer_settings();return$Bf[$z];}function
+set_adminer_settings($Bf){return
+cookie("adminer_settings",http_build_query($Bf+adminer_settings()));}function
+textarea($F,$Y,$M=10,$Qa=80){global$y;echo"";}function
+edit_type($z,$m,$Pa,$q=array(),$ec=array()){global$Of,$Cg,$Jg,$Wd;$V=$m["type"];echo'
';if($V&&!isset($Cg[$V])&&!isset($q[$V])&&!in_array($V,$ec))$ec[]=$V;if($q)$Of['Clés étrangères']=$q;echo
+optionlist(array_merge($ec,$Of),$V),' ',"('.'interclassement'.')'.optionlist($Pa,$m["collation"]).' ',($Jg?"'.optionlist($Jg,$m["unsigned"]).' ':''),(isset($m['on_update'])?"'.optionlist(array(""=>"(".'ON UPDATE'.")","CURRENT_TIMESTAMP"),(preg_match('~^CURRENT_TIMESTAMP~i',$m["on_update"])?"CURRENT_TIMESTAMP":$m["on_update"])).' ':''),($q?"(".'ON DELETE'.")".optionlist(explode("|",$Wd),$m["on_delete"])." ":" ");}function
+process_length($nd){global$Qb;return(preg_match("~^\\s*\\(?\\s*$Qb(?:\\s*,\\s*$Qb)*+\\s*\\)?\\s*\$~",$nd)&&preg_match_all("~$Qb~",$nd,$ud)?"(".implode(",",$ud[0]).")":preg_replace('~^[0-9].*~','(\0)',preg_replace('~[^-0-9,+()[\]]~','',$nd)));}function
+process_type($m,$Na="COLLATE"){global$Jg;return" $m[type]".process_length($m["length"]).(preg_match(number_type(),$m["type"])&&in_array($m["unsigned"],$Jg)?" $m[unsigned]":"").(preg_match('~char|text|enum|set~',$m["type"])&&$m["collation"]?" $Na ".q($m["collation"]):"");}function
+process_field($m,$Bg){return
+array(idf_escape(trim($m["field"])),process_type($Bg),($m["null"]?" NULL":" NOT NULL"),default_value($m),(preg_match('~timestamp|datetime~',$m["type"])&&$m["on_update"]?" ON UPDATE $m[on_update]":""),(support("comment")&&$m["comment"]!=""?" COMMENT ".q($m["comment"]):""),($m["auto_increment"]?auto_increment():null),);}function
+default_value($m){$ob=$m["default"];return($ob===null?"":" DEFAULT ".(preg_match('~char|binary|text|enum|set~',$m["type"])||preg_match('~^(?![a-z])~i',$ob)?q($ob):$ob));}function
+type_class($V){foreach(array('char'=>'text','date'=>'time|year','binary'=>'blob','enum'=>'set',)as$z=>$X){if(preg_match("~$z|$X~",$V))return" class='$z'";}}function
+edit_fields($n,$Pa,$V="TABLE",$q=array()){global$Qc;$n=array_values($n);$pb=(($_POST?$_POST["defaults"]:adminer_setting("defaults"))?"":" class='hidden'");$Ua=(($_POST?$_POST["comments"]:adminer_setting("comments"))?"":" class='hidden'");echo'
+';if($V=="PROCEDURE"){echo'';}echo' ',($V=="TABLE"?'Nom de la colonne':'Nom du paramètre'),' Type',script("qs('#enum-edit').onblur = editingLengthBlur;"),' Longueur
+ ','Options';if($V=="TABLE"){echo' NULL
+ AI ',doc_link(array('sqlite'=>"autoinc.html",)),'Valeur par dΓ©faut
+',(support("comment")?" '," ".script("row_count = ".count($n).";"),'
+
+',script("mixin(qsl('tbody'), {onclick: editingClick, onkeydown: editingKeydown, oninput: editingInput});");foreach($n
+as$u=>$m){$u++;$je=$m[($_POST?"orig":"field")];$wb=(isset($_POST["add"][$u-1])||(isset($m["field"])&&!$_POST["drop_col"][$u]))&&(support("drop_col")||$je=="");echo'
+',($V=="PROCEDURE"?"".html_select("fields[$u][inout]",explode("|",$Qc),$m["inout"]):""),' ';if($wb){echo' ';}echo' ';edit_type("fields[$u]",$m,$Pa,$q);if($V=="TABLE"){echo' ',checkbox("fields[$u][null]",1,$m["null"],"","","block","label-null"),' ',checkbox("fields[$u][has_default]",1,$m["has_default"],"","","","label-default"),' ',(support("comment")?" ":"");}echo"",(support("move_col")?" "." "." ":""),($je==""||support("drop_col")?" ":"");}}function
+process_fields(&$n){$Sd=0;if($_POST["up"]){$hd=0;foreach($n
+as$z=>$m){if(key($_POST["up"])==$z){unset($n[$z]);array_splice($n,$hd,0,array($m));break;}if(isset($m["field"]))$hd=$Sd;$Sd++;}}elseif($_POST["down"]){$rc=false;foreach($n
+as$z=>$m){if(isset($m["field"])&&$rc){unset($n[key($_POST["down"])]);array_splice($n,$Sd,0,array($rc));break;}if(key($_POST["down"])==$z)$rc=$m;$Sd++;}}elseif($_POST["add"]){$n=array_values($n);array_splice($n,key($_POST["add"]),0,array(array()));}elseif(!$_POST["drop_col"])return
+false;return
+true;}function
+normalize_enum($C){return"'".str_replace("'","''",addcslashes(stripcslashes(str_replace($C[0][0].$C[0][0],$C[0][0],substr($C[0],1,-1))),'\\'))."'";}function
+grant($vc,$Se,$e,$Vd){if(!$Se)return
+true;if($Se==array("ALL PRIVILEGES","GRANT OPTION"))return($vc=="GRANT"?queries("$vc ALL PRIVILEGES$Vd WITH GRANT OPTION"):queries("$vc ALL PRIVILEGES$Vd")&&queries("$vc GRANT OPTION$Vd"));return
+queries("$vc ".preg_replace('~(GRANT OPTION)\([^)]*\)~','\1',implode("$e, ",$Se).$e).$Vd);}function
+drop_create($_b,$h,$Ab,$gg,$Cb,$B,$Dd,$Bd,$Cd,$Ud,$Ld){if($_POST["drop"])query_redirect($_b,$B,$Dd);elseif($Ud=="")query_redirect($h,$B,$Cd);elseif($Ud!=$Ld){$cb=queries($h);queries_redirect($B,$Bd,$cb&&queries($_b));if($cb)queries($Ab);}else
+queries_redirect($B,$Bd,queries($gg)&&queries($Cb)&&queries($_b)&&queries($h));}function
+create_trigger($Vd,$L){global$y;$lg=" $L[Timing] $L[Event]".(preg_match('~ OF~',$L["Event"])?" $L[Of]":"");return"CREATE TRIGGER ".idf_escape($L["Trigger"]).($y=="mssql"?$Vd.$lg:$lg.$Vd).rtrim(" $L[Type]\n$L[Statement]",";").";";}function
+create_routine($nf,$L){global$Qc,$y;$P=array();$n=(array)$L["fields"];ksort($n);foreach($n
+as$m){if($m["field"]!="")$P[]=(preg_match("~^($Qc)\$~",$m["inout"])?"$m[inout] ":"").idf_escape($m["field"]).process_type($m,"CHARACTER SET");}$qb=rtrim("\n$L[definition]",";");return"CREATE $nf ".idf_escape(trim($L["name"]))." (".implode(", ",$P).")".(isset($_GET["function"])?" RETURNS".process_type($L["returns"],"CHARACTER SET"):"").($L["language"]?" LANGUAGE $L[language]":"").($y=="pgsql"?" AS ".q($qb):"$qb;");}function
+remove_definer($I){return
+preg_replace('~^([A-Z =]+) DEFINER=`'.preg_replace('~@(.*)~','`@`(%|\1)',logged_user()).'`~','\1',$I);}function
+format_foreign_key($p){global$Wd;$j=$p["db"];$Od=$p["ns"];return" FOREIGN KEY (".implode(", ",array_map('idf_escape',$p["source"])).") REFERENCES ".($j!=""&&$j!=$_GET["db"]?idf_escape($j).".":"").($Od!=""&&$Od!=$_GET["ns"]?idf_escape($Od).".":"").table($p["table"])." (".implode(", ",array_map('idf_escape',$p["target"])).")".(preg_match("~^($Wd)\$~",$p["on_delete"])?" ON DELETE $p[on_delete]":"").(preg_match("~^($Wd)\$~",$p["on_update"])?" ON UPDATE $p[on_update]":"");}function
+tar_file($o,$qg){$K=pack("a100a8a8a8a12a12",$o,644,0,0,decoct($qg->size),decoct(time()));$Ha=8*32;for($u=0;$usend();echo
+str_repeat("\0",511-($qg->size+511)%512);}function
+ini_bytes($Pc){$X=ini_get($Pc);switch(strtolower(substr($X,-1))){case'g':$X*=1024;case'm':$X*=1024;case'k':$X*=1024;}return$X;}function
+doc_link($Ae,$hg="? "){global$y,$f;$yf=$f->server_info;$Xg=preg_replace('~^(\d\.?\d).*~s','\1',$yf);$Ng=array('sql'=>"https://dev.mysql.com/doc/refman/$Xg/en/",'sqlite'=>"https://www.sqlite.org/",'pgsql'=>"https://www.postgresql.org/docs/$Xg/",'mssql'=>"https://msdn.microsoft.com/library/",'oracle'=>"https://www.oracle.com/pls/topic/lookup?ctx=db".preg_replace('~^.* (\d+)\.(\d+)\.\d+\.\d+\.\d+.*~s','\1\2',$yf)."&id=",);if(preg_match('~MariaDB~',$yf)){$Ng['sql']="https://mariadb.com/kb/en/library/";$Ae['sql']=(isset($Ae['mariadb'])?$Ae['mariadb']:str_replace(".html","/",$Ae['sql']));}return($Ae[$y]?"$hg ":"");}function
+ob_gzencode($Q){return
+gzencode($Q);}function
+db_size($j){global$f;if(!$f->select_db($j))return"?";$K=0;foreach(table_status()as$S)$K+=$S["Data_length"]+$S["Index_length"];return
+format_number($K);}function
+set_utf8mb4($h){global$f;static$P=false;if(!$P&&preg_match('~\butf8mb4~i',$h)){$P=true;echo"SET NAMES ".charset($f).";\n\n";}}function
+connect_error(){global$b,$f,$U,$l,$zb;if(DB!=""){header("HTTP/1.1 404 Not Found");page_header('Base de données'.": ".h(DB),'Base de données invalide.',true);}else{if($_POST["db"]&&!$l)queries_redirect(substr(ME,0,-1),'Les bases de données ont été supprimées.',drop_databases($_POST["db"]));page_header('Sélectionner la base de données',$l,false);echo"\n";foreach(array('database'=>'Créer une base de données','privileges'=>'Privilèges','processlist'=>'Liste des processus','variables'=>'Variables','status'=>'Statut',)as$z=>$X){if(support($z))echo"$X \n";}echo"
".sprintf('Version de %s : %s via l\'extension PHP %s',$zb[DRIVER],"".h($f->server_info)." ","$f->extension ")."\n","
".sprintf('AuthentifiΓ© en tant que : %s',"".h(logged_user())." ")."\n";$i=$b->databases();if($i){$rf=support("scheme");$Pa=collations();echo"
\n",script("tableCheck();");}}page_footer("db");}if(isset($_GET["status"]))$_GET["variables"]=$_GET["status"];if(isset($_GET["import"]))$_GET["sql"]=$_GET["import"];if(!(DB!=""?$f->select_db(DB):isset($_GET["sql"])||isset($_GET["dump"])||isset($_GET["database"])||isset($_GET["processlist"])||isset($_GET["privileges"])||isset($_GET["user"])||isset($_GET["variables"])||$_GET["script"]=="connect"||$_GET["script"]=="kill")){if(DB!=""||$_GET["refresh"]){restart_session();set_session("dbs",null);}connect_error();exit;}$Wd="RESTRICT|NO ACTION|CASCADE|SET NULL|SET DEFAULT";class
+TmpFile{var$handler;var$size;function
+__construct(){$this->handler=tmpfile();}function
+write($Za){$this->size+=strlen($Za);fwrite($this->handler,$Za);}function
+send(){fseek($this->handler,0);fpassthru($this->handler);fclose($this->handler);}}$Qb="'(?:''|[^'\\\\]|\\\\.)*'";$Qc="IN|OUT|INOUT";if(isset($_GET["select"])&&($_POST["edit"]||$_POST["clone"])&&!$_POST["save"])$_GET["edit"]=$_GET["select"];if(isset($_GET["download"])){$a=$_GET["download"];$n=fields($a);header("Content-Type: application/octet-stream");header("Content-Disposition: attachment; filename=".friendly_url("$a-".implode("_",$_GET["where"])).".".friendly_url($_GET["field"]));$N=array(idf_escape($_GET["field"]));$J=$k->select($a,$N,array(where($_GET,$n)),$N);$L=($J?$J->fetch_row():array());echo$k->value($L[0],$n[$_GET["field"]]);exit;}elseif(isset($_GET["table"])){$a=$_GET["table"];$n=fields($a);if(!$n)$l=error();$S=table_status1($a,true);$F=$b->tableName($S);page_header(($n&&is_view($S)?$S['Engine']=='materialized view'?'Vue matΓ©rialisΓ©e':'Vue':'Table').": ".($F!=""?$F:h($a)),$l);$b->selectLinks($S);$Ta=$S["Comment"];if($Ta!="")echo"".'Commentaire'.": ".h($Ta)."\n";if($n)$b->tableStructurePrint($n);if(!is_view($S)){if(support("indexes")){echo"
".'Index'." \n";$x=indexes($a);if($x)$b->tableIndexesPrint($x);echo''.'Modifier les index'." \n";}if(fk_support($S)){echo"
".'Clés étrangères'." \n";$q=foreign_keys($a);if($q){echo"\n","".'Source'." ".'Cible'." ".'ON DELETE'." ".'ON UPDATE'." \n";foreach($q
+as$F=>$p){echo"","".implode(" , ",array_map('h',$p["source"]))." ","".($p["db"]!=""?"".h($p["db"])." .":"").($p["ns"]!=""?"".h($p["ns"])." .":"").h($p["table"])." ","(".implode(" , ",array_map('h',$p["target"]))." )","".h($p["on_delete"])."\n"," ".h($p["on_update"])."\n",' '.'Modifier'.' ';}echo"
\n";}echo''.'Ajouter une clé étrangère'." \n";}}if(support(is_view($S)?"view_trigger":"trigger")){echo"
".'DΓ©clencheurs'." \n";$Ag=triggers($a);if($Ag){echo"\n";foreach($Ag
+as$z=>$X)echo"".h($X[0])." ".h($X[1])." ".h($z)." ".'Modifier'." \n";echo"
\n";}echo''.'Ajouter un dΓ©clencheur'." \n";}}elseif(isset($_GET["schema"])){page_header('SchΓ©ma de la base de donnΓ©es',"",array(),h(DB.($_GET["ns"]?".$_GET[ns]":"")));$Xf=array();$Yf=array();$ca=($_GET["schema"]?$_GET["schema"]:$_COOKIE["adminer_schema-".str_replace(".","_",DB)]);preg_match_all('~([^:]+):([-0-9.]+)x([-0-9.]+)(_|$)~',$ca,$ud,PREG_SET_ORDER);foreach($ud
+as$u=>$C){$Xf[$C[1]]=array($C[2],$C[3]);$Yf[]="\n\t'".js_escape($C[1])."': [ $C[2], $C[3] ]";}$sg=0;$xa=-1;$qf=array();$ff=array();$ld=array();foreach(table_status('',true)as$R=>$S){if(is_view($S))continue;$Ie=0;$qf[$R]["fields"]=array();foreach(fields($R)as$F=>$m){$Ie+=1.25;$m["pos"]=$Ie;$qf[$R]["fields"][$F]=$m;}$qf[$R]["pos"]=($Xf[$R]?$Xf[$R]:array($sg,0));foreach($b->foreignKeys($R)as$X){if(!$X["db"]){$jd=$xa;if($Xf[$R][1]||$Xf[$X["table"]][1])$jd=min(floatval($Xf[$R][1]),floatval($Xf[$X["table"]][1]))-1;else$xa-=.1;while($ld[(string)$jd])$jd-=.0001;$qf[$R]["references"][$X["table"]][(string)$jd]=array($X["source"],$X["target"]);$ff[$X["table"]][$R][(string)$jd]=$X["target"];$ld[(string)$jd]=true;}}$sg=max($sg,$qf[$R]["pos"][0]+2.5+$Ie);}echo'
+
+';foreach($qf
+as$F=>$R){echo"
",'
'.h($F)." ",script("qsl('div').onmousedown = schemaMousedown;");foreach($R["fields"]as$m){$X='
'.h($m["field"]).' ';echo"
".($m["primary"]?"
$X ":$X);}foreach((array)$R["references"]as$eg=>$gf){foreach($gf
+as$jd=>$cf){$kd=$jd-$Xf[$F][1];$u=0;foreach($cf[0]as$Ff)echo"\n
";}}foreach((array)$ff[$F]as$eg=>$gf){foreach($gf
+as$jd=>$e){$kd=$jd-$Xf[$F][1];$u=0;foreach($e
+as$dg)echo"\n
";}}echo"\n
\n";}foreach($qf
+as$F=>$R){foreach((array)$R["references"]as$eg=>$gf){foreach($gf
+as$jd=>$cf){$Gd=$sg;$yd=-10;foreach($cf[0]as$z=>$Ff){$Je=$R["pos"][0]+$R["fields"][$Ff]["pos"];$Ke=$qf[$eg]["pos"][0]+$qf[$eg]["fields"][$cf[1][$z]]["pos"];$Gd=min($Gd,$Je,$Ke);$yd=max($yd,$Je,$Ke);}echo"
\n";}}}echo'
+Lien permanent
+';}elseif(isset($_GET["dump"])){$a=$_GET["dump"];if($_POST&&!$l){$bb="";foreach(array("output","format","db_style","routines","events","table_style","auto_increment","triggers","data_style")as$z)$bb.="&$z=".urlencode($_POST[$z]);cookie("adminer_export",substr($bb,1));$T=array_flip((array)$_POST["tables"])+array_flip((array)$_POST["data"]);$bc=dump_headers((count($T)==1?key($T):DB),(DB==""||count($T)>1));$Xc=preg_match('~sql~',$_POST["format"]);if($Xc){echo"-- Adminer $da ".$zb[DRIVER]." ".str_replace("\n"," ",$f->server_info)." dump\n\n";if($y=="sql"){echo"SET NAMES utf8;
+SET time_zone = '+00:00';
+SET foreign_key_checks = 0;
+".($_POST["data_style"]?"SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
+":"")."
+";$f->query("SET time_zone = '+00:00'");$f->query("SET sql_mode = ''");}}$Pf=$_POST["db_style"];$i=array(DB);if(DB==""){$i=$_POST["databases"];if(is_string($i))$i=explode("\n",rtrim(str_replace("\r","",$i),"\n"));}foreach((array)$i
+as$j){$b->dumpDatabase($j);if($f->select_db($j)){if($Xc&&preg_match('~CREATE~',$Pf)&&($h=$f->result("SHOW CREATE DATABASE ".idf_escape($j),1))){set_utf8mb4($h);if($Pf=="DROP+CREATE")echo"DROP DATABASE IF EXISTS ".idf_escape($j).";\n";echo"$h;\n";}if($Xc){if($Pf)echo
+use_sql($j).";\n\n";$pe="";if($_POST["routines"]){foreach(array("FUNCTION","PROCEDURE")as$nf){foreach(get_rows("SHOW $nf STATUS WHERE Db = ".q($j),null,"-- ")as$L){$h=remove_definer($f->result("SHOW CREATE $nf ".idf_escape($L["Name"]),2));set_utf8mb4($h);$pe.=($Pf!='DROP+CREATE'?"DROP $nf IF EXISTS ".idf_escape($L["Name"]).";;\n":"")."$h;;\n\n";}}}if($_POST["events"]){foreach(get_rows("SHOW EVENTS",null,"-- ")as$L){$h=remove_definer($f->result("SHOW CREATE EVENT ".idf_escape($L["Name"]),3));set_utf8mb4($h);$pe.=($Pf!='DROP+CREATE'?"DROP EVENT IF EXISTS ".idf_escape($L["Name"]).";;\n":"")."$h;;\n\n";}}if($pe)echo"DELIMITER ;;\n\n$pe"."DELIMITER ;\n\n";}if($_POST["table_style"]||$_POST["data_style"]){$Zg=array();foreach(table_status('',true)as$F=>$S){$R=(DB==""||in_array($F,(array)$_POST["tables"]));$hb=(DB==""||in_array($F,(array)$_POST["data"]));if($R||$hb){if($bc=="tar"){$qg=new
+TmpFile;ob_start(array($qg,'write'),1e5);}$b->dumpTable($F,($R?$_POST["table_style"]:""),(is_view($S)?2:0));if(is_view($S))$Zg[]=$F;elseif($hb){$n=fields($F);$b->dumpData($F,$_POST["data_style"],"SELECT *".convert_fields($n,$n)." FROM ".table($F));}if($Xc&&$_POST["triggers"]&&$R&&($Ag=trigger_sql($F)))echo"\nDELIMITER ;;\n$Ag\nDELIMITER ;\n";if($bc=="tar"){ob_end_flush();tar_file((DB!=""?"":"$j/")."$F.csv",$qg);}elseif($Xc)echo"\n";}}if(function_exists('foreign_keys_sql')){foreach(table_status('',true)as$F=>$S){$R=(DB==""||in_array($F,(array)$_POST["tables"]));if($R&&!is_view($S))echo
+foreign_keys_sql($F);}}foreach($Zg
+as$Yg)$b->dumpTable($Yg,$_POST["table_style"],1);if($bc=="tar")echo
+pack("x512");}}}if($Xc)echo"-- ".$f->result("SELECT NOW()")."\n";exit;}page_header('Exporter',$l,($_GET["export"]!=""?array("table"=>$_GET["export"]):array()),h(DB));echo'
+
+';$lc=true;foreach($Ne
+as$z=>$X){if($z!=""&&$X>1){echo($lc?"":" ")."".h($z)." ";$lc=false;}}}elseif(isset($_GET["sql"])){if(!$l&&$_POST["export"]){dump_headers("sql");$b->dumpTable("","");$b->dumpData("","table",$_POST["query"]);exit;}restart_session();$Gc=&get_session("queries");$Fc=&$Gc[DB];if(!$l&&$_POST["clear"]){$Fc=array();redirect(remove_from_uri("history"));}page_header((isset($_GET["import"])?'Importer':'RequΓͺte SQL'),$l);if(!$l&&$_POST){$r=false;if(!isset($_GET["import"]))$I=$_POST["query"];elseif($_POST["webfile"]){$If=$b->importServerPath();$r=@fopen((file_exists($If)?$If:"compress.zlib://$If.gz"),"rb");$I=($r?fread($r,1e6):false);}else$I=get_file("sql_file",true);if(is_string($I)){if(function_exists('memory_get_usage'))@ini_set("memory_limit",max(ini_bytes("memory_limit"),2*strlen($I)+memory_get_usage()+8e6));if($I!=""&&strlen($I)<1e6){$H=$I.(preg_match("~;[ \t\r\n]*\$~",$I)?"":";");if(!$Fc||reset(end($Fc))!=$H){restart_session();$Fc[]=array($H,time());set_session("queries",$Gc);stop_session();}}$Gf="(?:\\s|/\\*[\s\S]*?\\*/|(?:#|-- )[^\n]*\n?|--\r?\n)";$rb=";";$Sd=0;$Nb=true;$g=connect();if(is_object($g)&&DB!=""){$g->select_db(DB);if($_GET["ns"]!="")set_schema($_GET["ns"],$g);}$Sa=0;$Sb=array();$ve='[\'"'.($y=="sql"?'`#':($y=="sqlite"?'`[':($y=="mssql"?'[':''))).']|/\*|-- |$'.($y=="pgsql"?'|\$[^$]*\$':'');$tg=microtime(true);parse_str($_COOKIE["adminer_export"],$ia);$Eb=$b->dumpFormat();unset($Eb["sql"]);while($I!=""){if(!$Sd&&preg_match("~^$Gf*+DELIMITER\\s+(\\S+)~i",$I,$C)){$rb=$C[1];$I=substr($I,strlen($C[0]));}else{preg_match('('.preg_quote($rb)."\\s*|$ve)",$I,$C,PREG_OFFSET_CAPTURE,$Sd);list($rc,$Ie)=$C[0];if(!$rc&&$r&&!feof($r))$I.=fread($r,1e5);else{if(!$rc&&rtrim($I)=="")break;$Sd=$Ie+strlen($rc);if($rc&&rtrim($rc)!=$rb){while(preg_match('('.($rc=='/*'?'\*/':($rc=='['?']':(preg_match('~^-- |^#~',$rc)?"\n":preg_quote($rc)."|\\\\."))).'|$)s',$I,$C,PREG_OFFSET_CAPTURE,$Sd)){$pf=$C[0][0];if(!$pf&&$r&&!feof($r))$I.=fread($r,1e5);else{$Sd=$C[0][1]+strlen($pf);if($pf[0]!="\\")break;}}}else{$Nb=false;$H=substr($I,0,$Ie);$Sa++;$Qe="
".$b->sqlCommandQuery($H)." \n";if($y=="sqlite"&&preg_match("~^$Gf*+ATTACH\\b~i",$H,$C)){echo$Qe,"".'ATTACH queries are not supported.'."\n";$Sb[]=" $Sa ";if($_POST["error_stops"])break;}else{if(!$_POST["only_errors"]){echo$Qe;ob_flush();flush();}$Lf=microtime(true);if($f->multi_query($H)&&is_object($g)&&preg_match("~^$Gf*+USE\\b~i",$H))$g->query($H);do{$J=$f->store_result();if($f->error){echo($_POST["only_errors"]?$Qe:""),"
".'Erreur dans la requΓͺte'.($f->errno?" ($f->errno)":"").": ".error()."\n";$Sb[]=" $Sa ";if($_POST["error_stops"])break
+2;}else{$jg=" (".format_time($Lf).") ".(strlen($H)<1000?" ".'Modifier'." ":"");$ka=$f->affected_rows;$ch=($_POST["only_errors"]?"":$k->warnings());$dh="warnings-$Sa";if($ch)$jg.=", ".'Warnings'." ".script("qsl('a').onclick = partial(toggle, '$dh');","");$Zb=null;$ac="explain-$Sa";if(is_object($J)){$_=$_POST["limit"];$ie=select($J,$g,array(),$_);if(!$_POST["only_errors"]){echo"
\n";$Pd=$J->num_rows;echo"".($Pd?($_&&$Pd>$_?sprintf('%d / ',$_):"").lang(array('%d ligne','%d lignes'),$Pd):""),$jg;if($g&&preg_match("~^($Gf|\\()*+SELECT\\b~i",$H)&&($Zb=explain($g,$H)))echo", Explain ".script("qsl('a').onclick = partial(toggle, '$ac');","");$v="export-$Sa";echo", ".'Exporter'." ".script("qsl('a').onclick = partial(toggle, '$v');","").": ".html_select("output",$b->dumpOutput(),$ia["output"])." ".html_select("format",$Eb,$ia["format"])." "." \n"."
\n";}}else{if(preg_match("~^$Gf*+(CREATE|DROP|ALTER)$Gf++(DATABASE|SCHEMA)\\b~i",$H)){restart_session();set_session("dbs",null);stop_session();}if(!$_POST["only_errors"])echo"".lang(array('RequΓͺte exΓ©cutΓ©e avec succΓ¨s, %d ligne modifiΓ©e.','RequΓͺte exΓ©cutΓ©e avec succΓ¨s, %d lignes modifiΓ©es.'),$ka)."$jg\n";}echo($ch?"
\n$ch
\n":"");if($Zb){echo"\n";select($Zb,$g,$ie);echo"
\n";}}$Lf=microtime(true);}while($f->next_result());}$I=substr($I,$Sd);$Sd=0;}}}}if($Nb)echo"".'Aucune commande Γ exΓ©cuter.'."\n";elseif($_POST["only_errors"]){echo"
".lang(array('%d requΓͺte exΓ©cutΓ©e avec succΓ¨s.','%d requΓͺtes exΓ©cutΓ©es avec succΓ¨s.'),$Sa-count($Sb))," (".format_time($tg).") \n";}elseif($Sb&&$Sa>1)echo"
".'Erreur dans la requΓͺte'.": ".implode("",$Sb)."\n";}else
+echo"
".upload_error($I)."\n";}echo'
+
+';$Xb=" ";if(!isset($_GET["import"])){$H=$_GET["sql"];if($_POST)$H=$_POST["query"];elseif($_GET["history"]=="all")$H=$Fc;elseif($_GET["history"]!="")$H=$Fc[$_GET["history"]][0];echo"";textarea("query",$H,20);echo
+script(($_POST?"":"qs('textarea').focus();\n")."qs('#form').onsubmit = partial(sqlSubmit, qs('#form'), '".js_escape(remove_from_uri("sql|limit|error_stops|only_errors|history"))."');"),"
$Xb\n",'Limiter les lignes'.": \n";}else{echo"
".'Importer un fichier'." ";$zc=(extension_loaded("zlib")?"[.gz]":"");echo(ini_bool("file_uploads")?"SQL$zc (< ".ini_get("upload_max_filesize")."B): \n$Xb":'L\'importation de fichier est dΓ©sactivΓ©e.'),"
\n";$Mc=$b->importServerPath();if($Mc){echo"".'Depuis le serveur'." ",sprintf('Fichier %s du serveur Web',"".h($Mc)."$zc"),' ',"
\n";}echo"";}echo
+checkbox("error_stops",1,($_POST?$_POST["error_stops"]:isset($_GET["import"])||$_GET["error_stops"]),'ArrΓͺter en cas d\'erreur')."\n",checkbox("only_errors",1,($_POST?$_POST["only_errors"]:isset($_GET["import"])||$_GET["only_errors"]),'Montrer seulement les erreurs')."\n"," \n";if(!isset($_GET["import"])&&$Fc){print_fieldset("history",'Historique',$_GET["history"]!="");for($X=end($Fc);$X;$X=prev($Fc)){$z=key($Fc);list($H,$jg,$Ib)=$X;echo''.'Modifier'." "." ".@date("H:i:s",$jg)." "." ".shorten_utf8(ltrim(str_replace("\n"," ",str_replace("\r","",preg_replace('~^(#|-- ).*~m','',$H)))),80,"").($Ib?" ($Ib) ":"")." \n";}echo" \n","".'Tout modifier'." \n","\n";}echo'
+';}elseif(isset($_GET["edit"])){$a=$_GET["edit"];$n=fields($a);$Z=(isset($_GET["select"])?($_POST["check"]&&count($_POST["check"])==1?where_check($_POST["check"][0],$n):""):where($_GET,$n));$Kg=(isset($_GET["select"])?$_POST["edit"]:$Z);foreach($n
+as$F=>$m){if(!isset($m["privileges"][$Kg?"update":"insert"])||$b->fieldName($m)==""||$m["generated"])unset($n[$F]);}if($_POST&&!$l&&!isset($_GET["select"])){$B=$_POST["referer"];if($_POST["insert"])$B=($Kg?null:$_SERVER["REQUEST_URI"]);elseif(!preg_match('~^.+&select=.+$~',$B))$B=ME."select=".urlencode($a);$x=indexes($a);$Fg=unique_array($_GET["where"],$x);$Ye="\nWHERE $Z";if(isset($_POST["delete"]))queries_redirect($B,'L\'Γ©lΓ©ment a Γ©tΓ© supprimΓ©.',$k->delete($a,$Ye,!$Fg));else{$P=array();foreach($n
+as$F=>$m){$X=process_input($m);if($X!==false&&$X!==null)$P[idf_escape($F)]=$X;}if($Kg){if(!$P)redirect($B);queries_redirect($B,'L\'Γ©lΓ©ment a Γ©tΓ© modifiΓ©.',$k->update($a,$P,$Ye,!$Fg));if(is_ajax()){page_headers();page_messages($l);exit;}}else{$J=$k->insert($a,$P);$id=($J?last_id():0);queries_redirect($B,sprintf('L\'Γ©lΓ©ment%s a Γ©tΓ© insΓ©rΓ©.',($id?" $id":"")),$J);}}}$L=null;if($_POST["save"])$L=(array)$_POST["fields"];elseif($Z){$N=array();foreach($n
+as$F=>$m){if(isset($m["privileges"]["select"])){$pa=convert_field($m);if($_POST["clone"]&&$m["auto_increment"])$pa="''";if($y=="sql"&&preg_match("~enum|set~",$m["type"]))$pa="1*".idf_escape($F);$N[]=($pa?"$pa AS ":"").idf_escape($F);}}$L=array();if(!support("table"))$N=array("*");if($N){$J=$k->select($a,$N,array($Z),$N,array(),(isset($_GET["select"])?2:1));if(!$J)$l=error();else{$L=$J->fetch_assoc();if(!$L)$L=false;}if(isset($_GET["select"])&&(!$L||$J->fetch_assoc()))$L=null;}}if(!support("table")&&!$n){if(!$Z){$J=$k->select($a,array("*"),$Z,array("*"));$L=($J?$J->fetch_assoc():false);if(!$L)$L=array($k->primary=>"");}if($L){foreach($L
+as$z=>$X){if(!$Z)$L[$z]=null;$n[$z]=array("field"=>$z,"null"=>($z!=$k->primary),"auto_increment"=>($z==$k->primary));}}}edit_form($a,$n,$L,$Kg);}elseif(isset($_GET["create"])){$a=$_GET["create"];$we=array();foreach(array('HASH','LINEAR HASH','KEY','LINEAR KEY','RANGE','LIST')as$z)$we[$z]=$z;$ef=referencable_primary($a);$q=array();foreach($ef
+as$Wf=>$m)$q[str_replace("`","``",$Wf)."`".str_replace("`","``",$m["field"])]=$Wf;$le=array();$S=array();if($a!=""){$le=fields($a);$S=table_status($a);if(!$S)$l='Aucune table.';}$L=$_POST;$L["fields"]=(array)$L["fields"];if($L["auto_increment_col"])$L["fields"][$L["auto_increment_col"]]["auto_increment"]=true;if($_POST)set_adminer_settings(array("comments"=>$_POST["comments"],"defaults"=>$_POST["defaults"]));if($_POST&&!process_fields($L["fields"])&&!$l){if($_POST["drop"])queries_redirect(substr(ME,0,-1),'La table a été effacée.',drop_tables(array($a)));else{$n=array();$na=array();$Og=false;$oc=array();$ke=reset($le);$ma=" FIRST";foreach($L["fields"]as$z=>$m){$p=$q[$m["type"]];$Bg=($p!==null?$ef[$p]:$m);if($m["field"]!=""){if(!$m["has_default"])$m["default"]=null;if($z==$L["auto_increment_col"])$m["auto_increment"]=true;$Ue=process_field($m,$Bg);$na[]=array($m["orig"],$Ue,$ma);if(!$ke||$Ue!=process_field($ke,$ke)){$n[]=array($m["orig"],$Ue,$ma);if($m["orig"]!=""||$ma)$Og=true;}if($p!==null)$oc[idf_escape($m["field"])]=($a!=""&&$y!="sqlite"?"ADD":" ").format_foreign_key(array('table'=>$q[$m["type"]],'source'=>array($m["field"]),'target'=>array($Bg["field"]),'on_delete'=>$m["on_delete"],));$ma=" AFTER ".idf_escape($m["field"]);}elseif($m["orig"]!=""){$Og=true;$n[]=array($m["orig"]);}if($m["orig"]!=""){$ke=next($le);if(!$ke)$ma="";}}$ye="";if($we[$L["partition_by"]]){$ze=array();if($L["partition_by"]=='RANGE'||$L["partition_by"]=='LIST'){foreach(array_filter($L["partition_names"])as$z=>$X){$Y=$L["partition_values"][$z];$ze[]="\n PARTITION ".idf_escape($X)." VALUES ".($L["partition_by"]=='RANGE'?"LESS THAN":"IN").($Y!=""?" ($Y)":" MAXVALUE");}}$ye.="\nPARTITION BY $L[partition_by]($L[partition])".($ze?" (".implode(",",$ze)."\n)":($L["partitions"]?" PARTITIONS ".(+$L["partitions"]):""));}elseif(support("partitioning")&&preg_match("~partitioned~",$S["Create_options"]))$ye.="\nREMOVE PARTITIONING";$D='La table a été modifiée.';if($a==""){cookie("adminer_engine",$L["Engine"]);$D='La table a été créée.';}$F=trim($L["name"]);queries_redirect(ME.(support("table")?"table=":"select=").urlencode($F),$D,alter_table($a,$F,($y=="sqlite"&&($Og||$oc)?$na:$n),$oc,($L["Comment"]!=$S["Comment"]?$L["Comment"]:null),($L["Engine"]&&$L["Engine"]!=$S["Engine"]?$L["Engine"]:""),($L["Collation"]&&$L["Collation"]!=$S["Collation"]?$L["Collation"]:""),($L["Auto_increment"]!=""?number($L["Auto_increment"]):""),$ye));}}page_header(($a!=""?'Modifier la table':'Créer une table'),$l,array("table"=>$a),h($a));if(!$_POST){$L=array("Engine"=>$_COOKIE["adminer_engine"],"fields"=>array(array("field"=>"","type"=>(isset($Cg["int"])?"int":(isset($Cg["integer"])?"integer":"")),"on_update"=>"")),"partition_names"=>array(""),);if($a!=""){$L=$S;$L["name"]=$a;$L["fields"]=array();if(!$_GET["auto_increment"])$L["Auto_increment"]="";foreach($le
+as$m){$m["has_default"]=isset($m["default"]);$L["fields"][]=$m;}if(support("partitioning")){$tc="FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA = ".q(DB)." AND TABLE_NAME = ".q($a);$J=$f->query("SELECT PARTITION_METHOD, PARTITION_ORDINAL_POSITION, PARTITION_EXPRESSION $tc ORDER BY PARTITION_ORDINAL_POSITION DESC LIMIT 1");list($L["partition_by"],$L["partitions"],$L["partition"])=$J->fetch_row();$ze=get_key_vals("SELECT PARTITION_NAME, PARTITION_DESCRIPTION $tc AND PARTITION_NAME != '' ORDER BY PARTITION_ORDINAL_POSITION");$ze[""]="";$L["partition_names"]=array_keys($ze);$L["partition_values"]=array_values($ze);}}}$Pa=collations();$Pb=engines();foreach($Pb
+as$Ob){if(!strcasecmp($Ob,$L["Engine"])){$L["Engine"]=$Ob;break;}}echo'
+
+
+';if(support("columns")||$a==""){echo'Nom de la table:
+';if($a==""&&!$_POST)echo
+script("focus(qs('#form')['name']);");echo($Pb?"".optionlist(array(""=>"(".'moteur'.")")+$Pb,$L["Engine"])." ".on_help("getTarget(event).value",1).script("qsl('select').onchange = helpClose;"):""),' ',($Pa&&!preg_match("~sqlite|mssql~",$y)?html_select("Collation",array(""=>"(".'interclassement'.")")+$Pa,$L["Collation"]):""),'
+';}echo'
+';if(support("columns")){echo'
+
+IncrΓ©ment automatique:
+',checkbox("defaults",1,($_POST?$_POST["defaults"]:adminer_setting("defaults")),'Valeurs par dΓ©faut',"columnShow(this.checked, 5)","jsonly"),(support("comment")?checkbox("comments",1,($_POST?$_POST["comments"]:adminer_setting("comments")),'Commentaire',"editingCommentsClick(this, true);","jsonly").' ':''),'
+
+';}echo'
+';if($a!=""){echo' ',confirm(sprintf('Drop %s?',$a));}if(support("partitioning")){$xe=preg_match('~RANGE|LIST~',$L["partition_by"]);print_fieldset("partition",'Partitionner par',$L["partition_by"]);echo'
+',"".optionlist(array(""=>"")+$we,$L["partition_by"])." ".on_help("getTarget(event).value.replace(/./, 'PARTITION BY \$&')",1).script("qsl('select').onchange = partitionByChange;"),'( )
+Partitions:
+
+
+';}echo'
+
+';}elseif(isset($_GET["indexes"])){$a=$_GET["indexes"];$Oc=array("PRIMARY","UNIQUE","INDEX");$S=table_status($a,true);if(preg_match('~MyISAM|M?aria'.(min_version(5.6,'10.0.5')?'|InnoDB':'').'~i',$S["Engine"]))$Oc[]="FULLTEXT";if(preg_match('~MyISAM|M?aria'.(min_version(5.7,'10.2.2')?'|InnoDB':'').'~i',$S["Engine"]))$Oc[]="SPATIAL";$x=indexes($a);$Oe=array();if($y=="mongo"){$Oe=$x["_id_"];unset($Oc[0]);unset($x["_id_"]);}$L=$_POST;if($_POST&&!$l&&!$_POST["add"]&&!$_POST["drop_col"]){$oa=array();foreach($L["indexes"]as$w){$F=$w["name"];if(in_array($w["type"],$Oc)){$e=array();$od=array();$tb=array();$P=array();ksort($w["columns"]);foreach($w["columns"]as$z=>$d){if($d!=""){$nd=$w["lengths"][$z];$sb=$w["descs"][$z];$P[]=idf_escape($d).($nd?"(".(+$nd).")":"").($sb?" DESC":"");$e[]=$d;$od[]=($nd?$nd:null);$tb[]=$sb;}}if($e){$Yb=$x[$F];if($Yb){ksort($Yb["columns"]);ksort($Yb["lengths"]);ksort($Yb["descs"]);if($w["type"]==$Yb["type"]&&array_values($Yb["columns"])===$e&&(!$Yb["lengths"]||array_values($Yb["lengths"])===$od)&&array_values($Yb["descs"])===$tb){unset($x[$F]);continue;}}$oa[]=array($w["type"],$F,$P);}}}foreach($x
+as$F=>$Yb)$oa[]=array($Yb["type"],$F,"DROP");if(!$oa)redirect(ME."table=".urlencode($a));queries_redirect(ME."table=".urlencode($a),'Index modifiΓ©s.',alter_indexes($a,$oa));}page_header('Index',$l,array("table"=>$a),h($a));$n=array_keys(fields($a));if($_POST["add"]){foreach($L["indexes"]as$z=>$w){if($w["columns"][count($w["columns"])]!="")$L["indexes"][$z]["columns"][]="";}$w=end($L["indexes"]);if($w["type"]||array_filter($w["columns"],'strlen'))$L["indexes"][]=array("columns"=>array(1=>""));}if(!$L){foreach($x
+as$z=>$w){$x[$z]["name"]=$z;$x[$z]["columns"][]="";}$x[]=array("columns"=>array(1=>""));$L["indexes"]=$x;}echo'
+
+
+
+
+
+
+';}elseif(isset($_GET["database"])){$L=$_POST;if($_POST&&!$l&&!isset($_POST["add_x"])){$F=trim($L["name"]);if($_POST["drop"]){$_GET["db"]="";queries_redirect(remove_from_uri("db|database"),'La base de donnΓ©es a Γ©tΓ© supprimΓ©e.',drop_databases(array(DB)));}elseif(DB!==$F){if(DB!=""){$_GET["db"]=$F;queries_redirect(preg_replace('~\bdb=[^&]*&~','',ME)."db=".urlencode($F),'La base de donnΓ©es a Γ©tΓ© renommΓ©e.',rename_database($F,$L["collation"]));}else{$i=explode("\n",str_replace("\r","",$F));$Qf=true;$hd="";foreach($i
+as$j){if(count($i)==1||$j!=""){if(!create_database($j,$L["collation"]))$Qf=false;$hd=$j;}}restart_session();set_session("dbs",null);queries_redirect(ME."db=".urlencode($hd),'La base de données a été créée.',$Qf);}}else{if(!$L["collation"])redirect(substr(ME,0,-1));query_redirect("ALTER DATABASE ".idf_escape($F).(preg_match('~^[a-z0-9_]+$~i',$L["collation"])?" COLLATE $L[collation]":""),substr(ME,0,-1),'La base de données a été modifiée.');}}page_header(DB!=""?'Modifier la base de données':'Créer une base de données',$l,array(),h(DB));$Pa=collations();$F=DB;if($_POST)$F=$L["name"];elseif(DB!="")$L["collation"]=db_collation(DB,$Pa);elseif($y=="sql"){foreach(get_vals("SHOW GRANTS")as$vc){if(preg_match('~ ON (`(([^\\\\`]|``|\\\\.)*)%`\.\*)?~',$vc,$C)&&$C[1]){$F=stripcslashes(idf_unescape("`$C[2]`"));break;}}}echo'
+
+
+',($_POST["add_x"]||strpos($F,"\n")?''.h($F).' ':' ')."\n".($Pa?html_select("collation",array(""=>"(".'interclassement'.")")+$Pa,$L["collation"]).'':""),script("focus(qs('#name'));"),'
+';if(DB!="")echo" ".confirm(sprintf('Drop %s?',DB))."\n";elseif(!$_POST["add_x"]&&$_GET["db"]=="")echo" \n";echo'
+
+';}elseif(isset($_GET["foreign"])){$a=$_GET["foreign"];$F=$_GET["name"];$L=$_POST;if($_POST&&!$l&&!$_POST["add"]&&!$_POST["change"]&&!$_POST["change-js"]){$D=($_POST["drop"]?'La clΓ© Γ©trangΓ¨re a Γ©tΓ© effacΓ©e.':($F!=""?'La clΓ© Γ©trangΓ¨re a Γ©tΓ© modifiΓ©e.':'La clΓ© Γ©trangΓ¨re a Γ©tΓ© créée.'));$B=ME."table=".urlencode($a);if(!$_POST["drop"]){$L["source"]=array_filter($L["source"],'strlen');ksort($L["source"]);$dg=array();foreach($L["source"]as$z=>$X)$dg[$z]=$L["target"][$z];$L["target"]=$dg;}if($y=="sqlite")queries_redirect($B,$D,recreate_table($a,$a,array(),array(),array(" $F"=>($_POST["drop"]?"":" ".format_foreign_key($L)))));else{$oa="ALTER TABLE ".table($a);$_b="\nDROP ".($y=="sql"?"FOREIGN KEY ":"CONSTRAINT ").idf_escape($F);if($_POST["drop"])query_redirect($oa.$_b,$B,$D);else{query_redirect($oa.($F!=""?"$_b,":"")."\nADD".format_foreign_key($L),$B,$D);$l='Les colonnes de source et de destination doivent Γͺtre du mΓͺme type, il doit y avoir un index sur les colonnes de destination et les donnΓ©es rΓ©fΓ©rencΓ©es doivent exister.'." $l";}}}page_header('ClΓ© Γ©trangΓ¨re',$l,array("table"=>$a),h($a));if($_POST){ksort($L["source"]);if($_POST["add"])$L["source"][]="";elseif($_POST["change"]||$_POST["change-js"])$L["target"]=array();}elseif($F!=""){$q=foreign_keys($a);$L=$q[$F];$L["source"][]="";}else{$L["table"]=$a;$L["source"]=array("");}echo'
+
+';$Ff=array_keys(fields($a));if($L["db"]!="")$f->select_db($L["db"]);if($L["ns"]!="")set_schema($L["ns"]);$df=array_keys(array_filter(table_status('',true),'fk_support'));$dg=array_keys(fields(in_array($L["table"],$df)?$L["table"]:reset($df)));$Xd="this.form['change-js'].value = '1'; this.form.submit();";echo"".'Table visΓ©e'.": ".html_select("table",$df,$L["table"],$Xd)."\n";if($y=="pgsql")echo'SchΓ©ma'.": ".html_select("ns",$b->schemas(),$L["ns"]!=""?$L["ns"]:$_GET["ns"],$Xd);elseif($y!="sqlite"){$mb=array();foreach($b->databases()as$j){if(!information_schema($j))$mb[]=$j;}echo'DB'.": ".html_select("db",$mb,$L["db"]!=""?$L["db"]:$_GET["db"],$Xd);}echo'
+
+
+Source Cible
+';$Zc=0;foreach($L["source"]as$z=>$X){echo"","".html_select("source[".(+$z)."]",array(-1=>"")+$Ff,$X,($Zc==count($L["source"])-1?"foreignAddRow.call(this);":1),"label-source")," ".html_select("target[".(+$z)."]",$dg,$L["target"][$z],1,"label-target");$Zc++;}echo'
+
+ON DELETE: ',html_select("on_delete",array(-1=>"")+explode("|",$Wd),$L["on_delete"]),' ON UPDATE: ',html_select("on_update",array(-1=>"")+explode("|",$Wd),$L["on_update"]),'','
+
+
+';if($F!=""){echo' ',confirm(sprintf('Drop %s?',$F));}echo'
+
+';}elseif(isset($_GET["view"])){$a=$_GET["view"];$L=$_POST;$me="VIEW";if($y=="pgsql"&&$a!=""){$Mf=table_status($a);$me=strtoupper($Mf["Engine"]);}if($_POST&&!$l){$F=trim($L["name"]);$pa=" AS\n$L[select]";$B=ME."table=".urlencode($F);$D='La vue a été modifiée.';$V=($_POST["materialized"]?"MATERIALIZED VIEW":"VIEW");if(!$_POST["drop"]&&$a==$F&&$y!="sqlite"&&$V=="VIEW"&&$me=="VIEW")query_redirect(($y=="mssql"?"ALTER":"CREATE OR REPLACE")." VIEW ".table($F).$pa,$B,$D);else{$fg=$F."_adminer_".uniqid();drop_create("DROP $me ".table($a),"CREATE $V ".table($F).$pa,"DROP $V ".table($F),"CREATE $V ".table($fg).$pa,"DROP $V ".table($fg),($_POST["drop"]?substr(ME,0,-1):$B),'La vue a été effacée.',$D,'La vue a été créée.',$a,$F);}}if(!$_POST&&$a!=""){$L=view($a);$L["name"]=$a;$L["materialized"]=($me!="VIEW");if(!$l)$l=error();}page_header(($a!=""?'Modifier une vue':'Créer une vue'),$l,array("table"=>$a),h($a));echo'
+
+Nom:
+',(support("materializedview")?" ".checkbox("materialized",1,$L["materialized"],'Vue matΓ©rialisΓ©e'):""),'
';textarea("select",$L["select"]);echo'
+
+';if($a!=""){echo' ',confirm(sprintf('Drop %s?',$a));}echo'
+
+';}elseif(isset($_GET["trigger"])){$a=$_GET["trigger"];$F=$_GET["name"];$_g=trigger_options();$L=(array)trigger($F,$a)+array("Trigger"=>$a."_bi");if($_POST){if(!$l&&in_array($_POST["Timing"],$_g["Timing"])&&in_array($_POST["Event"],$_g["Event"])&&in_array($_POST["Type"],$_g["Type"])){$Vd=" ON ".table($a);$_b="DROP TRIGGER ".idf_escape($F).($y=="pgsql"?$Vd:"");$B=ME."table=".urlencode($a);if($_POST["drop"])query_redirect($_b,$B,'Le déclencheur a été supprimé.');else{if($F!="")queries($_b);queries_redirect($B,($F!=""?'Le déclencheur a été modifié.':'Le déclencheur a été créé.'),queries(create_trigger($Vd,$_POST)));if($F!="")queries(create_trigger($Vd,$L+array("Type"=>reset($_g["Type"]))));}}$L=$_POST;}page_header(($F!=""?'Modifier un déclencheur'.": ".h($F):'Ajouter un déclencheur'),$l,array("table"=>$a));echo'
+
+
+Temps ',html_select("Timing",$_g["Timing"],$L["Timing"],"triggerChange(/^".preg_quote($a,"/")."_[ba][iud]$/, '".js_escape($a)."', this.form);"),' ΓvΓ¨nement ',html_select("Event",$_g["Event"],$L["Event"],"this.form['Timing'].onchange();"),(in_array("UPDATE OF",$_g["Event"])?" ":""),' Type ',html_select("Type",$_g["Type"],$L["Type"]),'
+Nom:
+',script("qs('#form')['Timing'].onchange();"),'
';textarea("Statement",$L["Statement"]);echo'
+
+';if($F!=""){echo' ',confirm(sprintf('Drop %s?',$F));}echo'
+
+';}elseif(isset($_GET["select"])){$a=$_GET["select"];$S=table_status1($a);$x=indexes($a);$n=fields($a);$q=column_foreign_keys($a);$Td=$S["Oid"];parse_str($_COOKIE["adminer_import"],$ja);$lf=array();$e=array();$ig=null;foreach($n
+as$z=>$m){$F=$b->fieldName($m);if(isset($m["privileges"]["select"])&&$F!=""){$e[$z]=html_entity_decode(strip_tags($F),ENT_QUOTES);if(is_shortable($m))$ig=$b->selectLengthProcess();}$lf+=$m["privileges"];}list($N,$t)=$b->selectColumnsProcess($e,$x);$Wc=count($t)selectSearchProcess($n,$x);$fe=$b->selectOrderProcess($n,$x);$_=$b->selectLimitProcess();if($_GET["val"]&&is_ajax()){header("Content-Type: text/plain; charset=utf-8");foreach($_GET["val"]as$Gg=>$L){$pa=convert_field($n[key($L)]);$N=array($pa?$pa:idf_escape(key($L)));$Z[]=where_check($Gg,$n);$K=$k->select($a,$N,$Z,$N);if($K)echo
+reset($K->fetch_row());}exit;}$Oe=$Ig=null;foreach($x
+as$w){if($w["type"]=="PRIMARY"){$Oe=array_flip($w["columns"]);$Ig=($N?$Oe:array());foreach($Ig
+as$z=>$X){if(in_array(idf_escape($z),$N))unset($Ig[$z]);}break;}}if($Td&&!$Oe){$Oe=$Ig=array($Td=>0);$x[]=array("type"=>"PRIMARY","columns"=>array($Td));}if($_POST&&!$l){$fh=$Z;if(!$_POST["all"]&&is_array($_POST["check"])){$Ga=array();foreach($_POST["check"]as$Ea)$Ga[]=where_check($Ea,$n);$fh[]="((".implode(") OR (",$Ga)."))";}$fh=($fh?"\nWHERE ".implode(" AND ",$fh):"");if($_POST["export"]){cookie("adminer_import","output=".urlencode($_POST["output"])."&format=".urlencode($_POST["format"]));dump_headers($a);$b->dumpTable($a,"");$tc=($N?implode(", ",$N):"*").convert_fields($e,$n,$N)."\nFROM ".table($a);$xc=($t&&$Wc?"\nGROUP BY ".implode(", ",$t):"").($fe?"\nORDER BY ".implode(", ",$fe):"");if(!is_array($_POST["check"])||$Oe)$I="SELECT $tc$fh$xc";else{$Eg=array();foreach($_POST["check"]as$X)$Eg[]="(SELECT".limit($tc,"\nWHERE ".($Z?implode(" AND ",$Z)." AND ":"").where_check($X,$n).$xc,1).")";$I=implode(" UNION ALL ",$Eg);}$b->dumpData($a,"table",$I);exit;}if(!$b->selectEmailProcess($Z,$q)){if($_POST["save"]||$_POST["delete"]){$J=true;$ka=0;$P=array();if(!$_POST["delete"]){foreach($e
+as$F=>$X){$X=process_input($n[$F]);if($X!==null&&($_POST["clone"]||$X!==false))$P[idf_escape($F)]=($X!==false?$X:idf_escape($F));}}if($_POST["delete"]||$P){if($_POST["clone"])$I="INTO ".table($a)." (".implode(", ",array_keys($P)).")\nSELECT ".implode(", ",$P)."\nFROM ".table($a);if($_POST["all"]||($Oe&&is_array($_POST["check"]))||$Wc){$J=($_POST["delete"]?$k->delete($a,$fh):($_POST["clone"]?queries("INSERT $I$fh"):$k->update($a,$P,$fh)));$ka=$f->affected_rows;}else{foreach((array)$_POST["check"]as$X){$eh="\nWHERE ".($Z?implode(" AND ",$Z)." AND ":"").where_check($X,$n);$J=($_POST["delete"]?$k->delete($a,$eh,1):($_POST["clone"]?queries("INSERT".limit1($a,$I,$eh)):$k->update($a,$P,$eh,1)));if(!$J)break;$ka+=$f->affected_rows;}}}$D=lang(array('%d Γ©lΓ©ment a Γ©tΓ© modifiΓ©.','%d Γ©lΓ©ments ont Γ©tΓ© modifiΓ©s.'),$ka);if($_POST["clone"]&&$J&&$ka==1){$id=last_id();if($id)$D=sprintf('L\'Γ©lΓ©ment%s a Γ©tΓ© insΓ©rΓ©.'," $id");}queries_redirect(remove_from_uri($_POST["all"]&&$_POST["delete"]?"page":""),$D,$J);if(!$_POST["delete"]){edit_form($a,$n,(array)$_POST["fields"],!$_POST["clone"]);page_footer();exit;}}elseif(!$_POST["import"]){if(!$_POST["val"])$l='Ctrl+cliquez sur une valeur pour la modifier.';else{$J=true;$ka=0;foreach($_POST["val"]as$Gg=>$L){$P=array();foreach($L
+as$z=>$X){$z=bracket_escape($z,1);$P[idf_escape($z)]=(preg_match('~char|text~',$n[$z]["type"])||$X!=""?$b->processInput($n[$z],$X):"NULL");}$J=$k->update($a,$P," WHERE ".($Z?implode(" AND ",$Z)." AND ":"").where_check($Gg,$n),!$Wc&&!$Oe," ");if(!$J)break;$ka+=$f->affected_rows;}queries_redirect(remove_from_uri(),lang(array('%d Γ©lΓ©ment a Γ©tΓ© modifiΓ©.','%d Γ©lΓ©ments ont Γ©tΓ© modifiΓ©s.'),$ka),$J);}}elseif(!is_string($jc=get_file("csv_file",true)))$l=upload_error($jc);elseif(!preg_match('~~u',$jc))$l='Les fichiers doivent Γͺtre encodΓ©s en UTF-8.';else{cookie("adminer_import","output=".urlencode($ja["output"])."&format=".urlencode($_POST["separator"]));$J=true;$Qa=array_keys($n);preg_match_all('~(?>"[^"]*"|[^"\r\n]+)+~',$jc,$ud);$ka=count($ud[0]);$k->begin();$xf=($_POST["separator"]=="csv"?",":($_POST["separator"]=="tsv"?"\t":";"));$M=array();foreach($ud[0]as$z=>$X){preg_match_all("~((?>\"[^\"]*\")+|[^$xf]*)$xf~",$X.$xf,$vd);if(!$z&&!array_diff($vd[1],$Qa)){$Qa=$vd[1];$ka--;}else{$P=array();foreach($vd[1]as$u=>$Ma)$P[idf_escape($Qa[$u])]=($Ma==""&&$n[$Qa[$u]]["null"]?"NULL":q(str_replace('""','"',preg_replace('~^"|"$~','',$Ma))));$M[]=$P;}}$J=(!$M||$k->insertUpdate($a,$M,$Oe));if($J)$J=$k->commit();queries_redirect(remove_from_uri("page"),lang(array('%d ligne a Γ©tΓ© importΓ©e.','%d lignes ont Γ©tΓ© importΓ©es.'),$ka),$J);$k->rollback();}}}$Wf=$b->tableName($S);if(is_ajax()){page_headers();ob_start();}else
+page_header('SΓ©lectionner'.": $Wf",$l);$P=null;if(isset($lf["insert"])||!support("table")){$P="";foreach((array)$_GET["where"]as$X){if($q[$X["col"]]&&count($q[$X["col"]])==1&&($X["op"]=="="||(!$X["op"]&&!preg_match('~[_%]~',$X["val"]))))$P.="&set".urlencode("[".bracket_escape($X["col"])."]")."=".urlencode($X["val"]);}}$b->selectLinks($S,$P);if(!$e&&support("table"))echo"".'Impossible de sΓ©lectionner la table'.($n?".":": ".error())."\n";else{echo"
\n","";hidden_fields_get();echo(DB!=""?' '.(isset($_GET["ns"])?' ':""):"");echo' ',"
\n";$b->selectColumnsPrint($N,$e);$b->selectSearchPrint($Z,$e,$x);$b->selectOrderPrint($fe,$e,$x);$b->selectLimitPrint($_);$b->selectLengthPrint($ig);$b->selectActionPrint($x);echo" \n";$G=$_GET["page"];if($G=="last"){$sc=$f->result(count_rows($a,$Z,$Wc,$t));$G=floor(max(0,$sc-1)/$_);}$sf=$N;$wc=$t;if(!$sf){$sf[]="*";$ab=convert_fields($e,$n,$N);if($ab)$sf[]=substr($ab,2);}foreach($N
+as$z=>$X){$m=$n[idf_unescape($X)];if($m&&($pa=convert_field($m)))$sf[$z]="$pa AS $X";}if(!$Wc&&$Ig){foreach($Ig
+as$z=>$X){$sf[]=idf_escape($z);if($wc)$wc[]=idf_escape($z);}}$J=$k->select($a,$sf,$Z,$wc,$fe,$_,$G,true);if(!$J)echo"".error()."\n";else{if($y=="mssql"&&$G)$J->seek($_*$G);$Mb=array();echo"
\n";$M=array();while($L=$J->fetch_assoc()){if($G&&$y=="oracle")unset($L["RNUM"]);$M[]=$L;}if($_GET["page"]!="last"&&$_!=""&&$t&&$Wc&&$y=="sql")$sc=$f->result(" SELECT FOUND_ROWS()");if(!$M)echo"".'Aucun rΓ©sultat.'."\n";else{$wa=$b->backwardKeys($a,$Wf);echo"
\n";}if(!is_ajax()){if($M||$G){$Wb=true;if($_GET["page"]!="last"){if($_==""||(count($M)<$_&&($M||!$G)))$sc=($G?$G*$_:0)+count($M);elseif($y!="sql"||!$Wc){$sc=($Wc?false:found_rows($S,$Z));if($sc$_||$G));if($se){echo(($sc===false?count($M)+1:$sc-$G*$_)>$_?''.'Charger plus de donnΓ©es'.' '.script("qsl('a').onclick = partial(selectLoadMore, ".(+$_).", '".'Chargement'."β¦');",""):''),"\n";}}echo"
\n";if($b->selectImportPrint()){echo"","
".'Importer'." ",script("qsl('a').onclick = partial(toggle, 'import');",""),"
: "," ",html_select("separator",array("csv"=>"CSV,","csv;"=>"CSV;","tsv"=>"TSV"),$ja["format"],1);echo" "," ","
";}echo" \n"," \n",(!$t&&$N?"":script("tableCheck();"));}}}if(is_ajax()){ob_end_clean();exit;}}elseif(isset($_GET["variables"])){$Mf=isset($_GET["status"]);page_header($Mf?'Statut':'Variables');$Vg=($Mf?show_status():show_variables());if(!$Vg)echo"".'Aucun rΓ©sultat.'."\n";else{echo"
\n";foreach($Vg
+as$z=>$X){echo"","".h($z)."","".h($X);}echo"
\n";}}elseif(isset($_GET["script"])){header("Content-Type: text/javascript; charset=utf-8");if($_GET["script"]=="db"){$Tf=array("Data_length"=>0,"Index_length"=>0,"Data_free"=>0);foreach(table_status()as$F=>$S){json_row("Comment-$F",h($S["Comment"]));if(!is_view($S)){foreach(array("Engine","Collation")as$z)json_row("$z-$F",h($S[$z]));foreach($Tf+array("Auto_increment"=>0,"Rows"=>0)as$z=>$X){if($S[$z]!=""){$X=format_number($S[$z]);json_row("$z-$F",($z=="Rows"&&$X&&$S["Engine"]==($Hf=="pgsql"?"table":"InnoDB")?"~ $X":$X));if(isset($Tf[$z]))$Tf[$z]+=($S["Engine"]!="InnoDB"||$z!="Data_free"?$S[$z]:0);}elseif(array_key_exists($z,$S))json_row("$z-$F");}}}foreach($Tf
+as$z=>$X)json_row("sum-$z",format_number($X));json_row("");}elseif($_GET["script"]=="kill")$f->query("KILL ".number($_POST["kill"]));else{foreach(count_tables($b->databases())as$j=>$X){json_row("tables-$j",$X);json_row("size-$j",db_size($j));}json_row("");}exit;}else{$bg=array_merge((array)$_POST["tables"],(array)$_POST["views"]);if($bg&&!$l&&!$_POST["search"]){$J=true;$D="";if($y=="sql"&&$_POST["tables"]&&count($_POST["tables"])>1&&($_POST["drop"]||$_POST["truncate"]||$_POST["copy"]))queries("SET foreign_key_checks = 0");if($_POST["truncate"]){if($_POST["tables"])$J=truncate_tables($_POST["tables"]);$D='Les tables ont Γ©tΓ© tronquΓ©es.';}elseif($_POST["move"]){$J=move_tables((array)$_POST["tables"],(array)$_POST["views"],$_POST["target"]);$D='Les tables ont Γ©tΓ© dΓ©placΓ©es.';}elseif($_POST["copy"]){$J=copy_tables((array)$_POST["tables"],(array)$_POST["views"],$_POST["target"]);$D='Les tables ont Γ©tΓ© copiΓ©es.';}elseif($_POST["drop"]){if($_POST["views"])$J=drop_views($_POST["views"]);if($J&&$_POST["tables"])$J=drop_tables($_POST["tables"]);$D='Les tables ont Γ©tΓ© effacΓ©es.';}elseif($y!="sql"){$J=($y=="sqlite"?queries("VACUUM"):apply_queries("VACUUM".($_POST["optimize"]?"":" ANALYZE"),$_POST["tables"]));$D='Les tables ont bien Γ©tΓ© optimisΓ©es.';}elseif(!$_POST["tables"])$D='Aucune table.';elseif($J=queries(($_POST["optimize"]?"OPTIMIZE":($_POST["check"]?"CHECK":($_POST["repair"]?"REPAIR":"ANALYZE")))." TABLE ".implode(", ",array_map('idf_escape',$_POST["tables"])))){while($L=$J->fetch_assoc())$D.="".h($L["Table"])." : ".h($L["Msg_text"])." ";}queries_redirect(substr(ME,0,-1),$D,$J);}page_header(($_GET["ns"]==""?'Base de donnΓ©es'.": ".h(DB):'SchΓ©ma'.": ".h($_GET["ns"])),$l,true);if($b->homepage()){if($_GET["ns"]!==""){echo"".'Tables et vues'." \n";$ag=tables_list();if(!$ag)echo"".'Aucune table.'."\n";else{echo"
\n";if(support("table")){echo"".'Rechercher dans les tables'." "," ",script("qsl('input').onkeydown = partialArg(bodyKeydown, 'search');","")," \n","
\n";if($_POST["search"]&&$_POST["query"]!=""){$_GET["where"][0]["op"]="LIKE %%";search_tables();}}echo"\n";if(!information_schema(DB)){echo"\n";}echo" \n",script("tableCheck();");}echo''.'CrΓ©er une table'." \n",(support("view")?''.'CrΓ©er une vue'." \n":"");if($ag)echo
+script("ajaxSetHtml('".js_escape(ME)."script=db');");}}}page_footer();
\ No newline at end of file
diff --git a/scripts/adminer.php b/scripts/adminer.php
index 762aaaf..83fc1d1 100644
--- a/scripts/adminer.php
+++ b/scripts/adminer.php
@@ -6,210 +6,299 @@
* @license https://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @license https://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
* @version 4.8.1
-*/function
-adminer_errors($Cc,$Ec){return!!preg_match('~^(Trying to access array offset on value of type null|Undefined array key)~',$Ec);}error_reporting(6135);set_error_handler('adminer_errors',E_WARNING);$ad=!preg_match('~^(unsafe_raw)?$~',ini_get("filter.default"));if($ad||ini_get("filter.default_flags")){foreach(array('_GET','_POST','_COOKIE','_SERVER')as$X){$Ii=filter_input_array(constant("INPUT$X"),FILTER_UNSAFE_RAW);if($Ii)$$X=$Ii;}}if(function_exists("mb_internal_encoding"))mb_internal_encoding("8bit");function
-connection(){global$g;return$g;}function
+*/$_GET['sqlite']='';class
+AdminerPlugin
+extends
+Adminer{var$plugins;function
+_findRootClass($Ja){do$K=$Ja;while($Ja=get_parent_class($Ja));return$K;}function
+__construct($Ge){if($Ge===null){$Ge=array();foreach(get_declared_classes()as$Ja){if(preg_match('~^Adminer.~i',$Ja)&&strcasecmp($this->_findRootClass($Ja),'Adminer'))$Ge[$Ja]=new$Ja;}}$this->plugins=$Ge;}function
+_callParent($s,$c){return
+call_user_func_array(array('parent',$s),$c);}function
+_applyPlugin($s,$c){foreach($this->plugins
+as$Fe){if(method_exists($Fe,$s)){switch(count($c)){case
+0:$K=$Fe->$s();break;case
+1:$K=$Fe->$s($c[0]);break;case
+2:$K=$Fe->$s($c[0],$c[1]);break;case
+3:$K=$Fe->$s($c[0],$c[1],$c[2]);break;case
+4:$K=$Fe->$s($c[0],$c[1],$c[2],$c[3]);break;case
+5:$K=$Fe->$s($c[0],$c[1],$c[2],$c[3],$c[4]);break;case
+6:$K=$Fe->$s($c[0],$c[1],$c[2],$c[3],$c[4],$c[5]);break;default:trigger_error('Too many parameters.',E_USER_WARNING);}if($K!==null)return$K;}}return$this->_callParent($s,$c);}function
+_appendPlugin($s,$c){$K=$this->_callParent($s,$c);foreach($this->plugins
+as$Fe){if(method_exists($Fe,$s)){$Y=call_user_func_array(array($Fe,$s),$c);if($Y)$K+=$Y;}}return$K;}function
+dumpFormat(){$c=func_get_args();return$this->_appendPlugin(__FUNCTION__,$c);}function
+dumpOutput(){$c=func_get_args();return$this->_appendPlugin(__FUNCTION__,$c);}function
+editRowPrint($R,$n,$L,$Kg){$c=func_get_args();return$this->_appendPlugin(__FUNCTION__,$c);}function
+editFunctions($m){$c=func_get_args();return$this->_appendPlugin(__FUNCTION__,$c);}function
+name(){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+credentials(){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+connectSsl(){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+permanentLogin($h=false){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+bruteForceKey(){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+serverName($O){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+database(){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+schemas(){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+databases($mc=true){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+queryTimeout(){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+headers(){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+csp(){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+head(){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+css(){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+loginForm(){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+loginFormField($F,$Ec,$Y){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+login($rd,$_e){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+tableName($Vf){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+fieldName($m,$fe=0){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+selectLinks($Vf,$P=""){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+foreignKeys($R){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+backwardKeys($R,$Uf){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+backwardKeysPrint($va,$L){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+selectQuery($I,$Lf,$fc=false){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+sqlCommandQuery($I){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+rowDescription($R){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+rowDescriptions($M,$pc){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+selectLink($X,$m){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+selectVal($X,$A,$m,$ne){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+editVal($X,$m){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+tableStructurePrint($n){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+tableIndexesPrint($x){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+selectColumnsPrint($N,$e){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+selectSearchPrint($Z,$e,$x){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+selectOrderPrint($fe,$e,$x){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+selectLimitPrint($_){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+selectLengthPrint($ig){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+selectActionPrint($x){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+selectCommandPrint(){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+selectImportPrint(){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+selectEmailPrint($Lb,$e){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+selectColumnsProcess($e,$x){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+selectSearchProcess($n,$x){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+selectOrderProcess($n,$x){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+selectLimitProcess(){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+selectLengthProcess(){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+selectEmailProcess($Z,$pc){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+selectQueryBuild($N,$Z,$t,$fe,$_,$G){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+messageQuery($I,$jg,$fc=false){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+editInput($R,$m,$ra,$Y){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+editHint($R,$m,$Y){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+processInput($m,$Y,$s=""){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+dumpDatabase($j){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+dumpTable($R,$Pf,$Yc=0){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+dumpData($R,$Pf,$I){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+dumpFilename($Jc){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+dumpHeaders($Jc,$Id=false){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+importServerPath(){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+homepage(){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+navigation($Hd){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+databasesPrint($Hd){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}function
+tablesPrint($T){$c=func_get_args();return$this->_applyPlugin(__FUNCTION__,$c);}}class
+FCSqliteConnectionWithoutCredentials{function
+loginForm(){$b=adminer();echo"
\n"," \n";return
+true;}function
+login($rd,$_e){return
+true;}}function
+adminer_object(){$Ge=array(new
+FCSqliteConnectionWithoutCredentials());return
+new
+AdminerPlugin($Ge);}function
+adminer_errors($Rb,$Tb){return!!preg_match('~^(Trying to access array offset on value of type null|Undefined array key)~',$Tb);}error_reporting(6135);set_error_handler('adminer_errors',E_WARNING);$kc=!preg_match('~^(unsafe_raw)?$~',ini_get("filter.default"));if($kc||ini_get("filter.default_flags")){foreach(array('_GET','_POST','_COOKIE','_SERVER')as$X){$Hg=filter_input_array(constant("INPUT$X"),FILTER_UNSAFE_RAW);if($Hg)$$X=$Hg;}}if(function_exists("mb_internal_encoding"))mb_internal_encoding("8bit");function
+connection(){global$f;return$f;}function
adminer(){global$b;return$b;}function
-version(){global$ia;return$ia;}function
-idf_unescape($v){if(!preg_match('~^[`\'"]~',$v))return$v;$qe=substr($v,-1);return
-str_replace($qe.$qe,$qe,substr($v,1,-1));}function
+version(){global$da;return$da;}function
+idf_unescape($Kc){if(!preg_match('~^[`\'"]~',$Kc))return$Kc;$hd=substr($Kc,-1);return
+str_replace($hd.$hd,$hd,substr($Kc,1,-1));}function
escape_string($X){return
substr(q($X),1,-1);}function
number($X){return
preg_replace('~[^0-9]+~','',$X);}function
number_type(){return'((?$W){unset($tg[$z][$he]);if(is_array($W)){$tg[$z][stripslashes($he)]=$W;$tg[]=&$tg[$z][stripslashes($he)];}else$tg[$z][stripslashes($he)]=($ad?$W:stripslashes($W));}}}}function
-bracket_escape($v,$Na=false){static$ui=array(':'=>':1',']'=>':2','['=>':3','"'=>':4');return
-strtr($v,($Na?array_flip($ui):$ui));}function
-min_version($Zi,$De="",$h=null){global$g;if(!$h)$h=$g;$nh=$h->server_info;if($De&&preg_match('~([\d.]+)-MariaDB~',$nh,$C)){$nh=$C[1];$Zi=$De;}return(version_compare($nh,$Zi)>=0);}function
-charset($g){return(min_version("5.5.3",0,$g)?"utf8mb4":"utf8");}function
-script($yh,$ti="\n"){return"$ti";}function
-script_src($Ni){return"\n";}function
+remove_slashes($Te,$kc=false){if(function_exists("get_magic_quotes_gpc")&&get_magic_quotes_gpc()){while(list($z,$X)=each($Te)){foreach($X
+as$ad=>$W){unset($Te[$z][$ad]);if(is_array($W)){$Te[$z][stripslashes($ad)]=$W;$Te[]=&$Te[$z][stripslashes($ad)];}else$Te[$z][stripslashes($ad)]=($kc?$W:stripslashes($W));}}}}function
+bracket_escape($Kc,$ua=false){static$vg=array(':'=>':1',']'=>':2','['=>':3','"'=>':4');return
+strtr($Kc,($ua?array_flip($vg):$vg));}function
+min_version($Xg,$td="",$g=null){global$f;if(!$g)$g=$f;$yf=$g->server_info;if($td&&preg_match('~([\d.]+)-MariaDB~',$yf,$C)){$yf=$C[1];$Xg=$td;}return(version_compare($yf,$Xg)>=0);}function
+charset($f){return(min_version("5.5.3",0,$f)?"utf8mb4":"utf8");}function
+script($Ff,$ug="\n"){return"$ug";}function
+script_src($Mg){return"\n";}function
nonce(){return' nonce="'.get_nonce().'"';}function
target_blank(){return' target="_blank" rel="noreferrer noopener"';}function
-h($P){return
-str_replace("\0","",htmlspecialchars($P,ENT_QUOTES,'utf-8'));}function
-nl_br($P){return
-str_replace("\n"," ",$P);}function
-checkbox($D,$Y,$db,$me="",$uf="",$hb="",$ne=""){$I=" ".($uf?script("qsl('input').onclick = function () { $uf };",""):"");return($me!=""||$hb?"$I".h($me)." ":$I);}function
-optionlist($_f,$gh=null,$Ri=false){$I="";foreach($_f
-as$he=>$W){$Af=array($he=>$W);if(is_array($W)){$I.='';$Af=$W;}foreach($Af
-as$z=>$X)$I.=''.h($X);if(is_array($W))$I.=' ';}return$I;}function
-html_select($D,$_f,$Y="",$tf=true,$ne=""){if($tf)return"".optionlist($_f,$Y)." ".(is_string($tf)?script("qsl('select').onchange = function () { $tf };",""):"");$I="";foreach($_f
-as$z=>$X)$I.=" ".h($X)." ";return$I;}function
-select_input($Ia,$_f,$Y="",$tf="",$fg=""){$Yh=($_f?"select":"input");return"<$Yh$Ia".($_f?">$fg".optionlist($_f,$Y,true)."":" size='10' value='".h($Y)."' placeholder='$fg'>").($tf?script("qsl('$Yh').onchange = $tf;",""):"");}function
-confirm($Ne="",$hh="qsl('input')"){return
-script("$hh.onclick = function () { return confirm('".($Ne?js_escape($Ne):lang(0))."'); };","");}function
-print_fieldset($u,$ve,$cj=false){echo"","$ve ",script("qsl('a').onclick = partial(toggle, 'fieldset-$u');","")," ","\n";}function
-bold($Ua,$hb=""){return($Ua?" class='active $hb'":($hb?" class='$hb'":""));}function
-odd($I=' class="odd"'){static$t=0;if(!$I)$t=-1;return($t++%2?$I:'');}function
-js_escape($P){return
-addcslashes($P,"\r\n'\\/");}function
-json_row($z,$X=null){static$bd=true;if($bd)echo"{";if($z!=""){echo($bd?"":",")."\n\t\"".addcslashes($z,"\r\n\t\"\\/").'": '.($X!==null?'"'.addcslashes($X,"\r\n\"\\/").'"':'null');$bd=false;}else{echo"\n}\n";$bd=true;}}function
-ini_bool($Ud){$X=ini_get($Ud);return(preg_match('~^(on|true|yes)$~i',$X)||(int)$X);}function
-sid(){static$I;if($I===null)$I=(SID&&!($_COOKIE&&ini_bool("session.use_cookies")));return$I;}function
-set_password($Yi,$M,$V,$F){$_SESSION["pwds"][$Yi][$M][$V]=($_COOKIE["adminer_key"]&&is_string($F)?array(encrypt_string($F,$_COOKIE["adminer_key"])):$F);}function
-get_password(){$I=get_session("pwds");if(is_array($I))$I=($_COOKIE["adminer_key"]?decrypt_string($I[0],$_COOKIE["adminer_key"]):false);return$I;}function
-q($P){global$g;return$g->quote($P);}function
-get_vals($G,$d=0){global$g;$I=array();$H=$g->query($G);if(is_object($H)){while($J=$H->fetch_row())$I[]=$J[$d];}return$I;}function
-get_key_vals($G,$h=null,$qh=true){global$g;if(!is_object($h))$h=$g;$I=array();$H=$h->query($G);if(is_object($H)){while($J=$H->fetch_row()){if($qh)$I[$J[0]]=$J[1];else$I[]=$J[0];}}return$I;}function
-get_rows($G,$h=null,$n="
"){global$g;$yb=(is_object($h)?$h:$g);$I=array();$H=$yb->query($G);if(is_object($H)){while($J=$H->fetch_assoc())$I[]=$J;}elseif(!$H&&!is_object($h)&&$n&&defined("PAGE_HEADER"))echo$n.error()."\n";return$I;}function
-unique_array($J,$x){foreach($x
-as$w){if(preg_match("~PRIMARY|UNIQUE~",$w["type"])){$I=array();foreach($w["columns"]as$z){if(!isset($J[$z]))continue
-2;$I[$z]=$J[$z];}return$I;}}}function
+h($Q){return
+str_replace("\0","",htmlspecialchars($Q,ENT_QUOTES,'utf-8'));}function
+nl_br($Q){return
+str_replace("\n"," ",$Q);}function
+checkbox($F,$Y,$Fa,$ed="",$Yd="",$Ja="",$fd=""){$K=" ".($Yd?script("qsl('input').onclick = function () { $Yd };",""):"");return($ed!=""||$Ja?"$K".h($ed)." ":$K);}function
+optionlist($de,$tf=null,$Qg=false){$K="";foreach($de
+as$ad=>$W){$ee=array($ad=>$W);if(is_array($W)){$K.='';$ee=$W;}foreach($ee
+as$z=>$X)$K.=''.h($X);if(is_array($W))$K.=' ';}return$K;}function
+html_select($F,$de,$Y="",$Xd=true,$fd=""){if($Xd)return"".optionlist($de,$Y)." ".(is_string($Xd)?script("qsl('select').onchange = function () { $Xd };",""):"");$K="";foreach($de
+as$z=>$X)$K.=" ".h($X)." ";return$K;}function
+select_input($ra,$de,$Y="",$Xd="",$Ee=""){$cg=($de?"select":"input");return"<$cg$ra".($de?">$Ee".optionlist($de,$Y,true)."":" size='10' value='".h($Y)."' placeholder='$Ee'>").($Xd?script("qsl('$cg').onchange = $Xd;",""):"");}function
+confirm($D="",$uf="qsl('input')"){return
+script("$uf.onclick = function () { return confirm('".($D?js_escape($D):'Are you sure?')."'); };","");}function
+print_fieldset($v,$md,$ah=false){echo"","$md ",script("qsl('a').onclick = partial(toggle, 'fieldset-$v');","")," ","\n";}function
+bold($Aa,$Ja=""){return($Aa?" class='active $Ja'":($Ja?" class='$Ja'":""));}function
+odd($K=' class="odd"'){static$u=0;if(!$K)$u=-1;return($u++%2?$K:'');}function
+js_escape($Q){return
+addcslashes($Q,"\r\n'\\/");}function
+json_row($z,$X=null){static$lc=true;if($lc)echo"{";if($z!=""){echo($lc?"":",")."\n\t\"".addcslashes($z,"\r\n\t\"\\/").'": '.($X!==null?'"'.addcslashes($X,"\r\n\"\\/").'"':'null');$lc=false;}else{echo"\n}\n";$lc=true;}}function
+ini_bool($Pc){$X=ini_get($Pc);return(preg_match('~^(on|true|yes)$~i',$X)||(int)$X);}function
+sid(){static$K;if($K===null)$K=(SID&&!($_COOKIE&&ini_bool("session.use_cookies")));return$K;}function
+set_password($Wg,$O,$Rg,$_e){$_SESSION["pwds"][$Wg][$O][$Rg]=($_COOKIE["adminer_key"]&&is_string($_e)?array(encrypt_string($_e,$_COOKIE["adminer_key"])):$_e);}function
+get_password(){$K=get_session("pwds");if(is_array($K))$K=($_COOKIE["adminer_key"]?decrypt_string($K[0],$_COOKIE["adminer_key"]):false);return$K;}function
+q($Q){global$f;return$f->quote($Q);}function
+get_vals($I,$d=0){global$f;$K=array();$J=$f->query($I);if(is_object($J)){while($L=$J->fetch_row())$K[]=$L[$d];}return$K;}function
+get_key_vals($I,$g=null,$Af=true){global$f;if(!is_object($g))$g=$f;$K=array();$J=$g->query($I);if(is_object($J)){while($L=$J->fetch_row()){if($Af)$K[$L[0]]=$L[1];else$K[]=$L[0];}}return$K;}function
+get_rows($I,$g=null,$l="
"){global$f;$Xa=(is_object($g)?$g:$f);$K=array();$J=$Xa->query($I);if(is_object($J)){while($L=$J->fetch_assoc())$K[]=$L;}elseif(!$J&&!is_object($g)&&$l&&defined("PAGE_HEADER"))echo$l.error()."\n";return$K;}function
+unique_array($L,$x){foreach($x
+as$w){if(preg_match("~PRIMARY|UNIQUE~",$w["type"])){$K=array();foreach($w["columns"]as$z){if(!isset($L[$z]))continue
+2;$K[$z]=$L[$z];}return$K;}}}function
escape_key($z){if(preg_match('(^([\w(]+)('.str_replace("_",".*",preg_quote(idf_escape("_"))).')([ \w)]+)$)',$z,$C))return$C[1].idf_escape(idf_unescape($C[2])).$C[3];return
idf_escape($z);}function
-where($Z,$p=array()){global$g,$y;$I=array();foreach((array)$Z["where"]as$z=>$X){$z=bracket_escape($z,1);$d=escape_key($z);$I[]=$d.($y=="sql"&&is_numeric($X)&&preg_match('~\.~',$X)?" LIKE ".q($X):($y=="mssql"?" LIKE ".q(preg_replace('~[_%[]~','[\0]',$X)):" = ".unconvert_field($p[$z],q($X))));if($y=="sql"&&preg_match('~char|text~',$p[$z]["type"])&&preg_match("~[^ -@]~",$X))$I[]="$d = ".q($X)." COLLATE ".charset($g)."_bin";}foreach((array)$Z["null"]as$z)$I[]=escape_key($z)." IS NULL";return
-implode(" AND ",$I);}function
-where_check($X,$p=array()){parse_str($X,$bb);remove_slashes(array(&$bb));return
-where($bb,$p);}function
-where_link($t,$d,$Y,$wf="="){return"&where%5B$t%5D%5Bcol%5D=".urlencode($d)."&where%5B$t%5D%5Bop%5D=".urlencode(($Y!==null?$wf:"IS NULL"))."&where%5B$t%5D%5Bval%5D=".urlencode($Y);}function
-convert_fields($e,$p,$L=array()){$I="";foreach($e
-as$z=>$X){if($L&&!in_array(idf_escape($z),$L))continue;$Ga=convert_field($p[$z]);if($Ga)$I.=", $Ga AS ".idf_escape($z);}return$I;}function
-cookie($D,$Y,$ye=2592000){global$ba;return
-header("Set-Cookie: $D=".urlencode($Y).($ye?"; expires=".gmdate("D, d M Y H:i:s",time()+$ye)." GMT":"")."; path=".preg_replace('~\?.*~','',$_SERVER["REQUEST_URI"]).($ba?"; secure":"")."; HttpOnly; SameSite=lax",false);}function
+where($Z,$n=array()){global$f,$y;$K=array();foreach((array)$Z["where"]as$z=>$X){$z=bracket_escape($z,1);$d=escape_key($z);$K[]=$d.($y=="sql"&&is_numeric($X)&&preg_match('~\.~',$X)?" LIKE ".q($X):($y=="mssql"?" LIKE ".q(preg_replace('~[_%[]~','[\0]',$X)):" = ".unconvert_field($n[$z],q($X))));if($y=="sql"&&preg_match('~char|text~',$n[$z]["type"])&&preg_match("~[^ -@]~",$X))$K[]="$d = ".q($X)." COLLATE ".charset($f)."_bin";}foreach((array)$Z["null"]as$z)$K[]=escape_key($z)." IS NULL";return
+implode(" AND ",$K);}function
+where_check($X,$n=array()){parse_str($X,$Ea);remove_slashes(array(&$Ea));return
+where($Ea,$n);}function
+where_link($u,$d,$Y,$Zd="="){return"&where%5B$u%5D%5Bcol%5D=".urlencode($d)."&where%5B$u%5D%5Bop%5D=".urlencode(($Y!==null?$Zd:"IS NULL"))."&where%5B$u%5D%5Bval%5D=".urlencode($Y);}function
+convert_fields($e,$n,$N=array()){$K="";foreach($e
+as$z=>$X){if($N&&!in_array(idf_escape($z),$N))continue;$pa=convert_field($n[$z]);if($pa)$K.=", $pa AS ".idf_escape($z);}return$K;}function
+cookie($F,$Y,$pd=2592000){global$aa;return
+header("Set-Cookie: $F=".urlencode($Y).($pd?"; expires=".gmdate("D, d M Y H:i:s",time()+$pd)." GMT":"")."; path=".preg_replace('~\?.*~','',$_SERVER["REQUEST_URI"]).($aa?"; secure":"")."; HttpOnly; SameSite=lax",false);}function
restart_session(){if(!ini_bool("session.use_cookies"))session_start();}function
-stop_session($gd=false){$Qi=ini_bool("session.use_cookies");if(!$Qi||$gd){session_write_close();if($Qi&&@ini_set("session.use_cookies",false)===false)session_start();}}function&get_session($z){return$_SESSION[$z][DRIVER][SERVER][$_GET["username"]];}function
+stop_session($nc=false){$Pg=ini_bool("session.use_cookies");if(!$Pg||$nc){session_write_close();if($Pg&&@ini_set("session.use_cookies",false)===false)session_start();}}function&get_session($z){return$_SESSION[$z][DRIVER][SERVER][$_GET["username"]];}function
set_session($z,$X){$_SESSION[$z][DRIVER][SERVER][$_GET["username"]]=$X;}function
-auth_url($Yi,$M,$V,$l=null){global$kc;preg_match('~([^?]*)\??(.*)~',remove_from_uri(implode("|",array_keys($kc))."|username|".($l!==null?"db|":"").session_name()),$C);return"$C[1]?".(sid()?SID."&":"").($Yi!="server"||$M!=""?urlencode($Yi)."=".urlencode($M)."&":"")."username=".urlencode($V).($l!=""?"&db=".urlencode($l):"").($C[2]?"&$C[2]":"");}function
+auth_url($Wg,$O,$Rg,$j=null){global$zb;preg_match('~([^?]*)\??(.*)~',remove_from_uri(implode("|",array_keys($zb))."|username|".($j!==null?"db|":"").session_name()),$C);return"$C[1]?".(sid()?SID."&":"").($Wg!="server"||$O!=""?urlencode($Wg)."=".urlencode($O)."&":"")."username=".urlencode($Rg).($j!=""?"&db=".urlencode($j):"").($C[2]?"&$C[2]":"");}function
is_ajax(){return($_SERVER["HTTP_X_REQUESTED_WITH"]=="XMLHttpRequest");}function
-redirect($B,$Ne=null){if($Ne!==null){restart_session();$_SESSION["messages"][preg_replace('~^[^?]*~','',($B!==null?$B:$_SERVER["REQUEST_URI"]))][]=$Ne;}if($B!==null){if($B=="")$B=".";header("Location: $B");exit;}}function
-query_redirect($G,$B,$Ne,$Dg=true,$Jc=true,$Tc=false,$gi=""){global$g,$n,$b;if($Jc){$Fh=microtime(true);$Tc=!$g->query($G);$gi=format_time($Fh);}$Ah="";if($G)$Ah=$b->messageQuery($G,$gi,$Tc);if($Tc){$n=error().$Ah.script("messagesPrint();");return
-false;}if($Dg)redirect($B,$Ne.$Ah);return
+redirect($B,$D=null){if($D!==null){restart_session();$_SESSION["messages"][preg_replace('~^[^?]*~','',($B!==null?$B:$_SERVER["REQUEST_URI"]))][]=$D;}if($B!==null){if($B=="")$B=".";header("Location: $B");exit;}}function
+query_redirect($I,$B,$D,$bf=true,$Xb=true,$fc=false,$jg=""){global$f,$l,$b;if($Xb){$Lf=microtime(true);$fc=!$f->query($I);$jg=format_time($Lf);}$Hf="";if($I)$Hf=$b->messageQuery($I,$jg,$fc);if($fc){$l=error().$Hf.script("messagesPrint();");return
+false;}if($bf)redirect($B,$D.$Hf);return
true;}function
-queries($G){global$g;static$yg=array();static$Fh;if(!$Fh)$Fh=microtime(true);if($G===null)return
-array(implode("\n",$yg),format_time($Fh));$yg[]=(preg_match('~;$~',$G)?"DELIMITER ;;\n$G;\nDELIMITER ":$G).";";return$g->query($G);}function
-apply_queries($G,$S,$Fc='table'){foreach($S
-as$Q){if(!queries("$G ".$Fc($Q)))return
+queries($I){global$f;static$We=array();static$Lf;if(!$Lf)$Lf=microtime(true);if($I===null)return
+array(implode("\n",$We),format_time($Lf));$We[]=(preg_match('~;$~',$I)?"DELIMITER ;;\n$I;\nDELIMITER ":$I).";";return$f->query($I);}function
+apply_queries($I,$T,$Ub='table'){foreach($T
+as$R){if(!queries("$I ".$Ub($R)))return
false;}return
true;}function
-queries_redirect($B,$Ne,$Dg){list($yg,$gi)=queries(null);return
-query_redirect($yg,$B,$Ne,$Dg,false,!$Dg,$gi);}function
-format_time($Fh){return
-lang(1,max(0,microtime(true)-$Fh));}function
+queries_redirect($B,$D,$bf){list($We,$jg)=queries(null);return
+query_redirect($We,$B,$D,$bf,false,!$bf,$jg);}function
+format_time($Lf){return
+sprintf('%.3f s',max(0,microtime(true)-$Lf));}function
relative_uri(){return
str_replace(":","%3a",preg_replace('~^[^?]*/([^?]*)~','\1',$_SERVER["REQUEST_URI"]));}function
-remove_from_uri($Qf=""){return
-substr(preg_replace("~(?<=[?&])($Qf".(SID?"":"|".session_name()).")=[^&]*&~",'',relative_uri()."&"),0,-1);}function
-pagination($E,$Pb){return" ".($E==$Pb?$E+1:''.($E+1)." ");}function
-get_file($z,$Xb=false){$Zc=$_FILES[$z];if(!$Zc)return
-null;foreach($Zc
-as$z=>$X)$Zc[$z]=(array)$X;$I='';foreach($Zc["error"]as$z=>$n){if($n)return$n;$D=$Zc["name"][$z];$oi=$Zc["tmp_name"][$z];$Db=file_get_contents($Xb&&preg_match('~\.gz$~',$D)?"compress.zlib://$oi":$oi);if($Xb){$Fh=substr($Db,0,3);if(function_exists("iconv")&&preg_match("~^\xFE\xFF|^\xFF\xFE~",$Fh,$Jg))$Db=iconv("utf-16","utf-8",$Db);elseif($Fh=="\xEF\xBB\xBF")$Db=substr($Db,3);$I.=$Db."\n\n";}else$I.=$Db;}return$I;}function
-upload_error($n){$Ke=($n==UPLOAD_ERR_INI_SIZE?ini_get("upload_max_filesize"):0);return($n?lang(2).($Ke?" ".lang(3,$Ke):""):lang(4));}function
-repeat_pattern($cg,$we){return
-str_repeat("$cg{0,65535}",$we/65535)."$cg{0,".($we%65535)."}";}function
+remove_from_uri($te=""){return
+substr(preg_replace("~(?<=[?&])($te".(SID?"":"|".session_name()).")=[^&]*&~",'',relative_uri()."&"),0,-1);}function
+pagination($G,$fb){return" ".($G==$fb?$G+1:''.($G+1)." ");}function
+get_file($z,$nb=false){$jc=$_FILES[$z];if(!$jc)return
+null;foreach($jc
+as$z=>$X)$jc[$z]=(array)$X;$K='';foreach($jc["error"]as$z=>$l){if($l)return$l;$F=$jc["name"][$z];$rg=$jc["tmp_name"][$z];$Ya=file_get_contents($nb&&preg_match('~\.gz$~',$F)?"compress.zlib://$rg":$rg);if($nb){$Lf=substr($Ya,0,3);if(function_exists("iconv")&&preg_match("~^\xFE\xFF|^\xFF\xFE~",$Lf,$hf))$Ya=iconv("utf-16","utf-8",$Ya);elseif($Lf=="\xEF\xBB\xBF")$Ya=substr($Ya,3);$K.=$Ya."\n\n";}else$K.=$Ya;}return$K;}function
+upload_error($l){$zd=($l==UPLOAD_ERR_INI_SIZE?ini_get("upload_max_filesize"):0);return($l?'Unable to upload a file.'.($zd?" ".sprintf('Maximum allowed file size is %sB.',$zd):""):'File does not exist.');}function
+repeat_pattern($Be,$nd){return
+str_repeat("$Be{0,65535}",$nd/65535)."$Be{0,".($nd%65535)."}";}function
is_utf8($X){return(preg_match('~~u',$X)&&!preg_match('~[\0-\x8\xB\xC\xE-\x1F]~',$X));}function
-shorten_utf8($P,$we=80,$Mh=""){if(!preg_match("(^(".repeat_pattern("[\t\r\n -\x{10FFFF}]",$we).")($)?)u",$P,$C))preg_match("(^(".repeat_pattern("[\t\r\n -~]",$we).")($)?)",$P,$C);return
-h($C[1]).$Mh.(isset($C[2])?"":"β¦ ");}function
+shorten_utf8($Q,$nd=80,$Rf=""){if(!preg_match("(^(".repeat_pattern("[\t\r\n -\x{10FFFF}]",$nd).")($)?)u",$Q,$C))preg_match("(^(".repeat_pattern("[\t\r\n -~]",$nd).")($)?)",$Q,$C);return
+h($C[1]).$Rf.(isset($C[2])?"":"β¦ ");}function
format_number($X){return
-strtr(number_format($X,0,".",lang(5)),preg_split('~~u',lang(6),-1,PREG_SPLIT_NO_EMPTY));}function
+strtr(number_format($X,0,".",','),preg_split('~~u','0123456789',-1,PREG_SPLIT_NO_EMPTY));}function
friendly_url($X){return
preg_replace('~[^a-z0-9_]~i','-',$X);}function
-hidden_fields($tg,$Jd=array(),$lg=''){$I=false;foreach($tg
-as$z=>$X){if(!in_array($z,$Jd)){if(is_array($X))hidden_fields($X,array(),$z);else{$I=true;echo' ';}}}return$I;}function
+hidden_fields($Te,$Lc=array(),$Me=''){$K=false;foreach($Te
+as$z=>$X){if(!in_array($z,$Lc)){if(is_array($X))hidden_fields($X,array(),$z);else{$K=true;echo' ';}}}return$K;}function
hidden_fields_get(){echo(sid()?' ':''),(SERVER!==null?' ':""),' ';}function
-table_status1($Q,$Uc=false){$I=table_status($Q,$Uc);return($I?$I:array("Name"=>$Q));}function
-column_foreign_keys($Q){global$b;$I=array();foreach($b->foreignKeys($Q)as$r){foreach($r["source"]as$X)$I[$X][]=$r;}return$I;}function
-enum_input($T,$Ia,$o,$Y,$zc=null){global$b;preg_match_all("~'((?:[^']|'')*)'~",$o["length"],$Fe);$I=($zc!==null?"".lang(7)." ":"");foreach($Fe[1]as$t=>$X){$X=stripcslashes(str_replace("''","'",$X));$db=(is_int($Y)?$Y==$t+1:(is_array($Y)?in_array($t+1,$Y):$Y===$X));$I.=" '.h($b->editVal($X,$o)).' ';}return$I;}function
-input($o,$Y,$s){global$U,$b,$y;$D=h(bracket_escape($o["field"]));echo"
";if(is_array($Y)&&!$s){$Ea=array($Y);if(version_compare(PHP_VERSION,5.4)>=0)$Ea[]=JSON_PRETTY_PRINT;$Y=call_user_func_array('json_encode',$Ea);$s="json";}$Ng=($y=="mssql"&&$o["auto_increment"]);if($Ng&&!$_POST["save"])$s=null;$pd=(isset($_GET["select"])||$Ng?array("orig"=>lang(8)):array())+$b->editFunctions($o);$Ia=" name='fields[$D]'";if($o["type"]=="enum")echo
-h($pd[""])." ".$b->editInput($_GET["edit"],$o,$Ia,$Y);else{$zd=(in_array($s,$pd)||isset($pd[$s]));echo(count($pd)>1?"".optionlist($pd,$s===null||$zd?$s:"")." ".on_help("getTarget(event).value.replace(/^SQL\$/, '')",1).script("qsl('select').onchange = functionChange;",""):h(reset($pd))).' ';$Wd=$b->editInput($_GET["edit"],$o,$Ia,$Y);if($Wd!="")echo$Wd;elseif(preg_match('~bool~',$o["type"]))echo" "." ";elseif($o["type"]=="set"){preg_match_all("~'((?:[^']|'')*)'~",$o["length"],$Fe);foreach($Fe[1]as$t=>$X){$X=stripcslashes(str_replace("''","'",$X));$db=(is_int($Y)?($Y>>$t)&1:in_array($X,explode(",",$Y),true));echo" ".h($b->editVal($X,$o)).' ';}}elseif(preg_match('~blob|bytea|raw|file~',$o["type"])&&ini_bool("file_uploads"))echo" ";elseif(($ei=preg_match('~text|lob|memo~i',$o["type"]))||preg_match("~\n~",$Y)){if($ei&&$y!="sqlite")$Ia.=" cols='50' rows='12'";else{$K=min(12,substr_count($Y,"\n")+1);$Ia.=" cols='30' rows='$K'".($K==1?" style='height: 1.2em;'":"");}echo"".h($Y).' ';}elseif($s=="json"||preg_match('~^jsonb?$~',$o["type"]))echo"".h($Y).' ';else{$Me=(!preg_match('~int~',$o["type"])&&preg_match('~^(\d+)(,(\d+))?$~',$o["length"],$C)?((preg_match("~binary~",$o["type"])?2:1)*$C[1]+($C[3]?1:0)+($C[2]&&!$o["unsigned"]?1:0)):($U[$o["type"]]?$U[$o["type"]]+($o["unsigned"]?0:1):0));if($y=='sql'&&min_version(5.6)&&preg_match('~time~',$o["type"]))$Me+=7;echo" 20?" size='40'":"")."$Ia>";}echo$b->editHint($_GET["edit"],$o,$Y);$bd=0;foreach($pd
-as$z=>$X){if($z===""||!$X)break;$bd++;}if($bd)echo
-script("mixin(qsl('td'), {onchange: partial(skipOriginal, $bd), oninput: function () { this.onchange(); }});");}}function
-process_input($o){global$b,$m;$v=bracket_escape($o["field"]);$s=$_POST["function"][$v];$Y=$_POST["fields"][$v];if($o["type"]=="enum"){if($Y==-1)return
-false;if($Y=="")return"NULL";return+$Y;}if($o["auto_increment"]&&$Y=="")return
-null;if($s=="orig")return(preg_match('~^CURRENT_TIMESTAMP~i',$o["on_update"])?idf_escape($o["field"]):false);if($s=="NULL")return"NULL";if($o["type"]=="set")return
+table_status1($R,$gc=false){$K=table_status($R,$gc);return($K?$K:array("Name"=>$R));}function
+column_foreign_keys($R){global$b;$K=array();foreach($b->foreignKeys($R)as$p){foreach($p["source"]as$X)$K[$X][]=$p;}return$K;}function
+enum_input($V,$ra,$m,$Y,$Nb=null){global$b;preg_match_all("~'((?:[^']|'')*)'~",$m["length"],$ud);$K=($Nb!==null?"".'empty'." ":"");foreach($ud[1]as$u=>$X){$X=stripcslashes(str_replace("''","'",$X));$Fa=(is_int($Y)?$Y==$u+1:(is_array($Y)?in_array($u+1,$Y):$Y===$X));$K.=" '.h($b->editVal($X,$m)).' ';}return$K;}function
+input($m,$Y,$s){global$Cg,$b,$y;$F=h(bracket_escape($m["field"]));echo" ";if(is_array($Y)&&!$s){$c=array($Y);if(version_compare(PHP_VERSION,5.4)>=0)$c[]=JSON_PRETTY_PRINT;$Y=call_user_func_array('json_encode',$c);$s="json";}$if=($y=="mssql"&&$m["auto_increment"]);if($if&&!$_POST["save"])$s=null;$uc=(isset($_GET["select"])||$if?array("orig"=>'original'):array())+$b->editFunctions($m);$ra=" name='fields[$F]'";if($m["type"]=="enum")echo
+h($uc[""])." ".$b->editInput($_GET["edit"],$m,$ra,$Y);else{$Bc=(in_array($s,$uc)||isset($uc[$s]));echo(count($uc)>1?"".optionlist($uc,$s===null||$Bc?$s:"")." ".on_help("getTarget(event).value.replace(/^SQL\$/, '')",1).script("qsl('select').onchange = functionChange;",""):h(reset($uc))).' ';$Rc=$b->editInput($_GET["edit"],$m,$ra,$Y);if($Rc!="")echo$Rc;elseif(preg_match('~bool~',$m["type"]))echo" "." ";elseif($m["type"]=="set"){preg_match_all("~'((?:[^']|'')*)'~",$m["length"],$ud);foreach($ud[1]as$u=>$X){$X=stripcslashes(str_replace("''","'",$X));$Fa=(is_int($Y)?($Y>>$u)&1:in_array($X,explode(",",$Y),true));echo" ".h($b->editVal($X,$m)).' ';}}elseif(preg_match('~blob|bytea|raw|file~',$m["type"])&&ini_bool("file_uploads"))echo" ";elseif(($hg=preg_match('~text|lob|memo~i',$m["type"]))||preg_match("~\n~",$Y)){if($hg&&$y!="sqlite")$ra.=" cols='50' rows='12'";else{$M=min(12,substr_count($Y,"\n")+1);$ra.=" cols='30' rows='$M'".($M==1?" style='height: 1.2em;'":"");}echo"".h($Y).' ';}elseif($s=="json"||preg_match('~^jsonb?$~',$m["type"]))echo"".h($Y).' ';else{$Ad=(!preg_match('~int~',$m["type"])&&preg_match('~^(\d+)(,(\d+))?$~',$m["length"],$C)?((preg_match("~binary~",$m["type"])?2:1)*$C[1]+($C[3]?1:0)+($C[2]&&!$m["unsigned"]?1:0)):($Cg[$m["type"]]?$Cg[$m["type"]]+($m["unsigned"]?0:1):0));if($y=='sql'&&min_version(5.6)&&preg_match('~time~',$m["type"]))$Ad+=7;echo" 20?" size='40'":"")."$ra>";}echo$b->editHint($_GET["edit"],$m,$Y);$lc=0;foreach($uc
+as$z=>$X){if($z===""||!$X)break;$lc++;}if($lc)echo
+script("mixin(qsl('td'), {onchange: partial(skipOriginal, $lc), oninput: function () { this.onchange(); }});");}}function
+process_input($m){global$b,$k;$Kc=bracket_escape($m["field"]);$s=$_POST["function"][$Kc];$Y=$_POST["fields"][$Kc];if($m["type"]=="enum"){if($Y==-1)return
+false;if($Y=="")return"NULL";return+$Y;}if($m["auto_increment"]&&$Y=="")return
+null;if($s=="orig")return(preg_match('~^CURRENT_TIMESTAMP~i',$m["on_update"])?idf_escape($m["field"]):false);if($s=="NULL")return"NULL";if($m["type"]=="set")return
array_sum((array)$Y);if($s=="json"){$s="";$Y=json_decode($Y,true);if(!is_array($Y))return
-false;return$Y;}if(preg_match('~blob|bytea|raw|file~',$o["type"])&&ini_bool("file_uploads")){$Zc=get_file("fields-$v");if(!is_string($Zc))return
-false;return$m->quoteBinary($Zc);}return$b->processInput($o,$Y,$s);}function
-fields_from_edit(){global$m;$I=array();foreach((array)$_POST["field_keys"]as$z=>$X){if($X!=""){$X=bracket_escape($X);$_POST["function"][$X]=$_POST["field_funs"][$z];$_POST["fields"][$X]=$_POST["field_vals"][$z];}}foreach((array)$_POST["fields"]as$z=>$X){$D=bracket_escape($z,1);$I[$D]=array("field"=>$D,"privileges"=>array("insert"=>1,"update"=>1),"null"=>1,"auto_increment"=>($z==$m->primary),);}return$I;}function
-search_tables(){global$b,$g;$_GET["where"][0]["val"]=$_POST["query"];$jh="")."\n";}function
-dump_headers($Hd,$Ve=false){global$b;$I=$b->dumpHeaders($Hd,$Ve);$Mf=$_POST["output"];if($Mf!="text")header("Content-Disposition: attachment; filename=".$b->dumpFilename($Hd).".$I".($Mf!="file"&&preg_match('~^[0-9a-z]+$~',$Mf)?".$Mf":""));session_write_close();ob_flush();flush();return$I;}function
-dump_csv($J){foreach($J
-as$z=>$X){if(preg_match('~["\n,;\t]|^0|\.\d*0$~',$X)||$X==="")$J[$z]='"'.str_replace('"','""',$X).'"';}echo
-implode(($_POST["format"]=="csv"?",":($_POST["format"]=="tsv"?"\t":";")),$J)."\r\n";}function
+false;return$Y;}if(preg_match('~blob|bytea|raw|file~',$m["type"])&&ini_bool("file_uploads")){$jc=get_file("fields-$Kc");if(!is_string($jc))return
+false;return$k->quoteBinary($jc);}return$b->processInput($m,$Y,$s);}function
+fields_from_edit(){global$k;$K=array();foreach((array)$_POST["field_keys"]as$z=>$X){if($X!=""){$X=bracket_escape($X);$_POST["function"][$X]=$_POST["field_funs"][$z];$_POST["fields"][$X]=$_POST["field_vals"][$z];}}foreach((array)$_POST["fields"]as$z=>$X){$F=bracket_escape($z,1);$K[$F]=array("field"=>$F,"privileges"=>array("insert"=>1,"update"=>1),"null"=>1,"auto_increment"=>($z==$k->primary),);}return$K;}function
+search_tables(){global$b,$f;$_GET["where"][0]["val"]=$_POST["query"];$wf="")."\n";}function
+dump_headers($Jc,$Id=false){global$b;$K=$b->dumpHeaders($Jc,$Id);$qe=$_POST["output"];if($qe!="text")header("Content-Disposition: attachment; filename=".$b->dumpFilename($Jc).".$K".($qe!="file"&&preg_match('~^[0-9a-z]+$~',$qe)?".$qe":""));session_write_close();ob_flush();flush();return$K;}function
+dump_csv($L){foreach($L
+as$z=>$X){if(preg_match('~["\n,;\t]|^0|\.\d*0$~',$X)||$X==="")$L[$z]='"'.str_replace('"','""',$X).'"';}echo
+implode(($_POST["format"]=="csv"?",":($_POST["format"]=="tsv"?"\t":";")),$L)."\r\n";}function
apply_sql_function($s,$d){return($s?($s=="unixepoch"?"DATETIME($d, '$s')":($s=="count distinct"?"COUNT(DISTINCT ":strtoupper("$s("))."$d)"):$d);}function
-get_temp_dir(){$I=ini_get("upload_tmp_dir");if(!$I){if(function_exists('sys_get_temp_dir'))$I=sys_get_temp_dir();else{$q=@tempnam("","");if(!$q)return
-false;$I=dirname($q);unlink($q);}}return$I;}function
-file_open_lock($q){$nd=@fopen($q,"r+");if(!$nd){$nd=@fopen($q,"w");if(!$nd)return;chmod($q,0660);}flock($nd,LOCK_EX);return$nd;}function
-file_write_unlock($nd,$Rb){rewind($nd);fwrite($nd,$Rb);ftruncate($nd,strlen($Rb));flock($nd,LOCK_UN);fclose($nd);}function
-password_file($i){$q=get_temp_dir()."/adminer.key";$I=@file_get_contents($q);if($I||!$i)return$I;$nd=@fopen($q,"w");if($nd){chmod($q,0660);$I=rand_string();fwrite($nd,$I);fclose($nd);}return$I;}function
+get_temp_dir(){$K=ini_get("upload_tmp_dir");if(!$K){if(function_exists('sys_get_temp_dir'))$K=sys_get_temp_dir();else{$o=@tempnam("","");if(!$o)return
+false;$K=dirname($o);unlink($o);}}return$K;}function
+file_open_lock($o){$r=@fopen($o,"r+");if(!$r){$r=@fopen($o,"w");if(!$r)return;chmod($o,0660);}flock($r,LOCK_EX);return$r;}function
+file_write_unlock($r,$hb){rewind($r);fwrite($r,$hb);ftruncate($r,strlen($hb));flock($r,LOCK_UN);fclose($r);}function
+password_file($h){$o=get_temp_dir()."/adminer.key";$K=@file_get_contents($o);if($K||!$h)return$K;$r=@fopen($o,"w");if($r){chmod($o,0660);$K=rand_string();fwrite($r,$K);fclose($r);}return$K;}function
rand_string(){return
md5(uniqid(mt_rand(),true));}function
-select_value($X,$A,$o,$fi){global$b;if(is_array($X)){$I="";foreach($X
-as$he=>$W)$I.=" ".($X!=array_values($X)?"".h($he):"")." ".select_value($W,$A,$o,$fi);return"";}if(!$A)$A=$b->selectLink($X,$o);if($A===null){if(is_mail($X))$A="mailto:$X";if(is_url($X))$A=$X;}$I=$b->editVal($X,$o);if($I!==null){if(!is_utf8($I))$I="\0";elseif($fi!=""&&is_shortable($o))$I=shorten_utf8($I,max(0,+$fi));else$I=h($I);}return$b->selectVal($I,$A,$o,$X);}function
-is_mail($wc){$Ha='[-a-z0-9!#$%&\'*+/=?^_`{|}~]';$jc='[a-z0-9]([-a-z0-9]{0,61}[a-z0-9])';$cg="$Ha+(\\.$Ha+)*@($jc?\\.)+$jc";return
-is_string($wc)&&preg_match("(^$cg(,\\s*$cg)*\$)i",$wc);}function
-is_url($P){$jc='[a-z0-9]([-a-z0-9]{0,61}[a-z0-9])';return
-preg_match("~^(https?)://($jc?\\.)+$jc(:\\d+)?(/.*)?(\\?.*)?(#.*)?\$~i",$P);}function
-is_shortable($o){return
-preg_match('~char|text|json|lob|geometry|point|linestring|polygon|string|bytea~',$o["type"]);}function
-count_rows($Q,$Z,$ce,$sd){global$y;$G=" FROM ".table($Q).($Z?" WHERE ".implode(" AND ",$Z):"");return($ce&&($y=="sql"||count($sd)==1)?"SELECT COUNT(DISTINCT ".implode(", ",$sd).")$G":"SELECT COUNT(*)".($ce?" FROM (SELECT 1$G GROUP BY ".implode(", ",$sd).") x":$G));}function
-slow_query($G){global$b,$qi,$m;$l=$b->database();$hi=$b->queryTimeout();$vh=$m->slowQuery($G,$hi);if(!$vh&&support("kill")&&is_object($h=connect())&&($l==""||$h->select_db($l))){$ke=$h->result(connection_id());echo'
-';}else$h=null;ob_flush();flush();$I=@get_key_vals(($vh?$vh:$G),$h,false);if($h){echo
-script("clearTimeout(timeout);");ob_flush();flush();}return$I;}function
-get_token(){$Ag=rand(1,1e6);return($Ag^$_SESSION["token"]).":$Ag";}function
-verify_token(){list($qi,$Ag)=explode(":",$_POST["token"]);return($Ag^$_SESSION["token"])==$qi;}function
-lzw_decompress($Ra){$gc=256;$Sa=8;$jb=array();$Pg=0;$Qg=0;for($t=0;$t=$Sa){$Qg-=$Sa;$jb[]=$Pg>>$Qg;$Pg&=(1<<$Qg)-1;$gc++;if($gc>>$Sa)$Sa++;}}$fc=range("\0","\xFF");$I="";foreach($jb
-as$t=>$ib){$vc=$fc[$ib];if(!isset($vc))$vc=$nj.$nj[0];$I.=$vc;if($t)$fc[]=$nj.$vc[0];$nj=$vc;}return$I;}function
-on_help($rb,$sh=0){return
-script("mixin(qsl('select, input'), {onmouseover: function (event) { helpMouseover.call(this, event, $rb, $sh) }, onmouseout: helpMouseout});","");}function
-edit_form($Q,$p,$J,$Li){global$b,$y,$qi,$n;$Rh=$b->tableName(table_status1($Q,true));page_header(($Li?lang(10):lang(11)),$n,array("select"=>array($Q,$Rh)),$Rh);$b->editRowPrint($Q,$p,$J,$Li);if($J===false)echo"".lang(12)."\n";echo'
-';if(!$p)echo"".lang(13)."\n";else{echo"
".script("qsl('table').onkeydown = editingKeydown;");foreach($p
-as$D=>$o){echo"".$b->fieldName($o);$Yb=$_GET["set"][bracket_escape($D)];if($Yb===null){$Yb=$o["default"];if($o["type"]=="bit"&&preg_match("~^b'([01]*)'\$~",$Yb,$Jg))$Yb=$Jg[1];}$Y=($J!==null?($J[$D]!=""&&$y=="sql"&&preg_match("~enum|set~",$o["type"])?(is_array($J[$D])?array_sum($J[$D]):+$J[$D]):(is_bool($J[$D])?+$J[$D]:$J[$D])):(!$Li&&$o["auto_increment"]?"":(isset($_GET["select"])?false:$Yb)));if(!$_POST["save"]&&is_string($Y))$Y=$b->editVal($Y,$o);$s=($_POST["save"]?(string)$_POST["function"][$D]:($Li&&preg_match('~^CURRENT_TIMESTAMP~i',$o["on_update"])?"now":($Y===false?null:($Y!==null?'':'NULL'))));if(!$_POST&&!$Li&&$Y==$o["default"]&&preg_match('~^[\w.]+\(~',$Y))$s="SQL";if(preg_match("~time~",$o["type"])&&preg_match('~^CURRENT_TIMESTAMP~i',$Y)){$Y="";$s="now";}input($o,$Y,$s);echo"\n";}if(!support("table"))echo" "." ".script("qsl('input').oninput = fieldChange;")."".html_select("field_funs[]",$b->editFunctions(array("null"=>isset($_GET["select"]))))." "."\n";echo"
\n";}echo"\n";if($p){echo" \n";if(!isset($_GET["select"])){echo" \n",($Li?script("qsl('input').onclick = function () { return !ajaxForm(this.form, '".lang(17)."β¦', this); };"):"");}}echo($Li?" ".confirm()."\n":($_POST||!$p?"":script("focus(qsa('td', qs('#form'))[1].firstChild);")));if(isset($_GET["select"]))hidden_fields(array("check"=>(array)$_POST["check"],"clone"=>$_POST["clone"],"all"=>$_POST["all"]));echo'
+';}else$g=null;ob_flush();flush();$K=@get_key_vals(($Ef?$Ef:$I),$g,false);if($g){echo
+script("clearTimeout(timeout);");ob_flush();flush();}return$K;}function
+get_token(){$Ze=rand(1,1e6);return($Ze^$_SESSION["token"]).":$Ze";}function
+verify_token(){list($U,$Ze)=explode(":",$_POST["token"]);return($Ze^$_SESSION["token"])==$U;}function
+lzw_decompress($ya){$vb=256;$za=8;$La=array();$jf=0;$kf=0;for($u=0;$u=$za){$kf-=$za;$La[]=$jf>>$kf;$jf&=(1<<$kf)-1;$vb++;if($vb>>$za)$za++;}}$ub=range("\0","\xFF");$K="";foreach($La
+as$u=>$Ka){$Jb=$ub[$Ka];if(!isset($Jb))$Jb=$gh.$gh[0];$K.=$Jb;if($u)$ub[]=$gh.$Jb[0];$gh=$Jb;}return$K;}function
+on_help($Ra,$Cf=0){return
+script("mixin(qsl('select, input'), {onmouseover: function (event) { helpMouseover.call(this, event, $Ra, $Cf) }, onmouseout: helpMouseout});","");}function
+edit_form($R,$n,$L,$Kg){global$b,$y,$U,$l;$Wf=$b->tableName(table_status1($R,true));page_header(($Kg?'Edit':'Insert'),$l,array("select"=>array($R,$Wf)),$Wf);$b->editRowPrint($R,$n,$L,$Kg);if($L===false)echo"".'No rows.'."\n";echo'
+';if(!$n)echo"".'You have no privileges to update this table.'."\n";else{echo"
".script("qsl('table').onkeydown = editingKeydown;");foreach($n
+as$F=>$m){echo"".$b->fieldName($m);$ob=$_GET["set"][bracket_escape($F)];if($ob===null){$ob=$m["default"];if($m["type"]=="bit"&&preg_match("~^b'([01]*)'\$~",$ob,$hf))$ob=$hf[1];}$Y=($L!==null?($L[$F]!=""&&$y=="sql"&&preg_match("~enum|set~",$m["type"])?(is_array($L[$F])?array_sum($L[$F]):+$L[$F]):(is_bool($L[$F])?+$L[$F]:$L[$F])):(!$Kg&&$m["auto_increment"]?"":(isset($_GET["select"])?false:$ob)));if(!$_POST["save"]&&is_string($Y))$Y=$b->editVal($Y,$m);$s=($_POST["save"]?(string)$_POST["function"][$F]:($Kg&&preg_match('~^CURRENT_TIMESTAMP~i',$m["on_update"])?"now":($Y===false?null:($Y!==null?'':'NULL'))));if(!$_POST&&!$Kg&&$Y==$m["default"]&&preg_match('~^[\w.]+\(~',$Y))$s="SQL";if(preg_match("~time~",$m["type"])&&preg_match('~^CURRENT_TIMESTAMP~i',$Y)){$Y="";$s="now";}input($m,$Y,$s);echo"\n";}if(!support("table"))echo" "." ".script("qsl('input').oninput = fieldChange;")."".html_select("field_funs[]",$b->editFunctions(array("null"=>isset($_GET["select"]))))." "."\n";echo"
\n";}echo"\n";if($n){echo" \n";if(!isset($_GET["select"])){echo" \n",($Kg?script("qsl('input').onclick = function () { return !ajaxForm(this.form, '".'Saving'."β¦', this); };"):"");}}echo($Kg?" ".confirm()."\n":($_POST||!$n?"":script("focus(qsa('td', qs('#form'))[1].firstChild);")));if(isset($_GET["select"]))hidden_fields(array("check"=>(array)$_POST["check"],"clone"=>$_POST["clone"],"all"=>$_POST["all"]));echo'
-
+
';}if(isset($_GET["file"])){if($_SERVER["HTTP_IF_MODIFIED_SINCE"]){header("HTTP/1.1 304 Not Modified");exit;}header("Expires: ".gmdate("D, d M Y H:i:s",time()+365*24*60*60)." GMT");header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");header("Cache-Control: immutable");if($_GET["file"]=="favicon.ico"){header("Content-Type: image/x-icon");echo
lzw_decompress("\0\0\0` \0\0\n @\0΄Cθ\"\0`EγQΈΰ?ΐtvM'JdΑd\\b0\0Δ\"ΐfΣ€ξs5ΟηΡAXPaJ0₯8#RT©z`#.©ΗcνXΓώΘ?ΐ-\0‘Im? .«MΆ\0Θ―(Μύΐ/(%\0");}elseif($_GET["file"]=="default.css"){header("Content-Type: text/css; charset=utf-8");echo
lzw_decompress("\n1ΜΩήl7B14vb0ΝfsΌκn2BΜΡ±Ωήn:#(Όb.\rDc)ΘΘa7E€Βl¦Γ±θi1Μs΄η-4fΣ ΘΞi7³Ή€Θt4
¦ΣyθZf4°iAT«VVιf:Ο¦,:1¦QέΌρb2`Η#ώ>:7Gο1ΡΨs°LXD*bv<ά#£e@Φ:4η§!fo·Ζt:<₯άεΎoβά\niΓΕπ',ι»a_€:Ήiο
΄ΑBvψ|Nϋ4.5Nfi’vpΠhΈ°l¨κ‘ΦάO¦ξ= £OFQΠΔk\$₯ΣiυΐΒd2Tγ‘pΰΚ6ώ‘-ΨZ ή6½£πh:¬aΜ,£λξ2#8Π±#6nβξρJ’h«t
±δ4O42τ½okήΎ*r ©@p@!ΔΎΟΓτώ?Π6ΐr[πLΑπ:2Bj§!HbσΓPδ=!1V\"²0
Ώ\nSΖΖΟD7ΓμDΪΓC!!ΰ¦GΚ§ Θ+=tCζ©.C€ΐ:+ΘΚ=ͺͺΊ²‘±ε%ͺcν1MR/EΘ4© 2°δ± γ`Β8(αΣΉ[WδΡ=ySb°=Φ-άΉBS+Ι―Θάύ₯ψ@pL4Ydγqψγ¦πκ’6£3Δ¬―ΈAcάθΞ¨k[&>φ¨ZΑpkm]u-c:ΨΈNtζΞ΄p8θ=Ώ#α[.πάή―~ mΛyPPα|IΦωΐμQͺ9v[Q\nΩrτ'g+αTΡ2
VΑυzδ4£8χ( ΎEy*#j¬2]RΑ₯)ΐ[NR\$<>:σ>\$;> Μ\r»ΞHΝΓTΘ\nw‘N εwΨ£¦μ<οΛGwΰφφΉ\\Yσ_ Rt^>\r}ΩS\rzι4=΅\nL%Jγ\",Z 8Έiχ0u©?¨ϋΡτ‘s3#¨Ω :σ¦ϋγ½ΘήE]xέs^8£K^Ιχ*0ΡήwήΰΘή~γφ:νΡiΨώv2w½±ϋ^7γς7£cέΡu+U%{Pά*4ΜΌιLX./!Ό1CΕίqx!HΉγFdωL¨€¨Δ Ο`6λθ5fΈΔ¨=Hψl V1\0a2Χ;Τ6ΰφώ_ΩΔ\0&τZάS d)KE'n΅[X©³\0ZΙΤF[Pή@ΰί!ρYΒ,`Ι\"Ϊ·Β0Ee9yF>ΛΤ9bΊζF5:ό\0}Δ΄(\$Σλ37Hφ£θ MΎA°²6Rϊ{Mqέ7G ΪCCκm2’(Ct>[μ-tΐ/&C]κetGτΜ¬4@r>ΗΒε<Sq/εϊQλhmΐΠΖτγτLΐά#θτKΛ|6fKPέ\r%tΤΣV=\" SH\$} Έ)w‘,W\0F³ͺu@Ψb¦9\rr°2Γ#¬DX³ΪyOIω>»
nΗ’%γω'έ_Αt\rΟzΔ\\1hlΌ]Q5Mp6kΠΔqhΓ\$£H~Ν|έ!*4ρςΫ`Sλύ²S tνPP\\g±θ7\n-:θ’ͺp΄lB¦ξ7Σ¨c(wO0\\:ΠwΑp4ς{TΪϊjO€6HΓΆrΥ₯q\n¦Ι%%Άy']\$aZΣ.fcΥq*-κFWΊϊkz°΅j°lgα:\$\"ήNΌ\r#ΙdβΓΒΠscα¬Μ \"jͺ\rΐΆ¦ΥΌPh1/DA) ²έ[ΐknΑp76ΑY΄R{αM€Pϋ°ς@\n-Έa·6ώί[»zJH,dl B£ho³μς¬+#Dr^΅^΅ΩeΌE½½ ΔaPτυJG£zΰρtρ 2ΗXΩ’΄ΑΏVΆΧίΰήΘ³ΡB_%K=E©ΈbεΌΎίΒ§kU(.!ά8ΈόΙI.@KΝxnώ¬ό:ΓPσ32«mνH C*μ:vβTΕ\nRΉ΅0uΒνζξ§]Ξ―P/΅JQd₯{Lή³:YΑ2bΌT ρΚ3Σ4δcκ₯V=ΏL4ΞΠrΔ!ίBπY³6ΝMeLͺάηφωiΐoΠ9< G€ΖΠMhm^―UΫNΐ·ςTr5HiM/¬nν³T [-<__ξ3/Xr(<―ΙτΜuGNX20ε\r\$^:'9θΆO
ν;ΧkΌ΅f N'aΆΗbΕ,ΛV€τ
«1΅οHI!%6@ϊΟ\$EGΪ¬1(mUͺε
rΥ½οίε`‘ΠiN+Γρ)δ0lΨf0Γ½[UβψVΚθ-:I^ \$Ψs«b\reugΙhͺ~9Ϋίb΅τΒΘfδ+0¬Τ hXrέ¬©!\$e,±w+χλ3Μ_βA
kω\nkΓrυΚcuWdY\\Χ={.σΔ’g»p8t\rRZΏvJ:²>ώ£Y|+Ε@ΐΫCt\rjt½6²π%Β?ΰτΗρ>ω/₯ΝΗπΞ9F`Χδςv~K€αφΡRΠWπzκlmͺwLΗ9Y*q¬xΔzρθSeέ³θχ£~DΰΝαχxΎλΙi72ΔψΡOέ»ϋ_{ρϊ53βϊt_υzΤ3ωd)C―Β\$?KΣͺP%ΟΟT&ώ&\0PΧNA^~’ pΖ φΟΤυ\r\$ήοΠΦμb*+D6κΆ¦ΟήνJ\$(ΘolήΝh&μKBS>Έφ;zΆ¦xΕoz>νΪoΔZπ\nΚ[ΟvυΛΘ΅°2υOxΩVψ0fϋϊ―ή2BlΙbkΠ6Zk΅hXcdκ0*ΒKTβ―H=Οp0lVιυθβ\rΌ₯nm¦ο)((τ:#¦βςEά:C¨CΰΪβ\r¨G\rΓ©0χ
iζΪ°ώ:`Z1Q\n:ΰ\r\0ΰηΘq±°ό:`Ώ-ΘM#}1;θώΉq#|ρSΎ’hlDΔ\0fiDpλL ``°ηΡ0yί1
κ\rρ=MQ\\€³%oq\0Ψρ£1¨21¬1° Ώ±§Ρbi:ν\r±/Ρ’ `)Δ0ω@ΎΒ±ΓI1«NΰCΨΰ΅ρO±’Zργ1±οq1 ςΡόΰ,ε\rdIΗ¦vδjν1 tΪBψ°β0:
0ππ1 A2Vρβ0 ιρ%²fi3!&Q·Rc%q&w%Ρμ\rΰVΘ#ΚψQw`% Ύm*r
y&iί+r{*²»(rg(±#(2(πε)R@i- 1\"\0Ϋ²Rκ.e.rλΔ,‘ry(2ͺCΰθ²bμ!Bή3%΅,RΏ1²Ζ&θώtδbθa\rL³-3α Φ σ\0ζσBp1ρ94³O'R°3*²³=\$ΰ[£^iI;/3i©5&}17²# ΡΉ8 Ώ\"ί7Ρε8ρ9*23!σ!1\\\0Ο8rk9±;S
23ΆΰΪ*Σ:q]5S<³Α#383έ#eΡ=Ή>~9Sθ³rΥ)T*a@ΡΩbesΩΤ£:-σιΗ*;, Ψ3!i΄L²π#1 +nΐ «*²γ@³3i7΄1©΄_FS;3ΟF±\rA―ι3υ>΄x: \r³0ΞΤ@-Τ/¬ΣwΣΫ7ρΣSJ3 η.Fι\$O€B±%4©+tΓ'gσLq\rJtJτΛM2\rτΝ7ρΖT@£Ύ)β£dΙ2P>Ξ°Fi಴ώ\nr\0Έbηk(΄DΆΏγKQ€΄γ1γ\"2tττΊPθ\rΓΐ,\$KCtς5τφ#τϊ)’αP#Pi.ΞU2΅Cζ~ή\"δ");}elseif($_GET["file"]=="functions.js"){header("Content-Type: text/javascript; charset=utf-8");echo
lzw_decompress("f:gCIΌά\n8Ε3)°Λ7
81ΠΚx:\nOg#)Πκr7\n\"θ΄`ψ|2ΜgSiH)N¦Sδ§\r\"0ΉΔ@δ)`(\$s6O!ΣθV/=' T4ζ=iS6IO G#X·VCΖs‘ Z1.Πhp8,³[¦Hδ΅~Cz§Ιε2ΉlΎc3Νιs£ΩIbβ4\nιF8TΰIέ©U*fzΉδr0EΖΐΨyΈρfY.:ζIΚ(Ψc·αΞ!_lν^·^(ΆN{S)rΛqΑYlΩ¦33Ϊ\n+G₯ΣκyΊνΛiΆΒξxV3w³uhγ^rΨΐΊ΄aΫϊΉcΨθ\r¨λ(.ΒΊCh<\r)θΡ£‘`ζ7£νς43'm5£Θ\nPά:2£P»ͺq ςΕC}Δ«ϊΚΑκ38BΨ0hRΘr(0₯‘b\\0Hr44ΑB!‘pΗ\$rZZΛ2ά.Ι(\\5Γ|\nC(Ξ\"P
πψ.ΠNΜRTΚΞΐζ>HN
8HPα\\¬7Jp~άϋ2%‘ΠOC¨1γ.§C8ΞHΘς*j°
αχS(Ή/‘μ¬6KUΚ‘<2pOIτΥ`Τδβ³dOH ή5-όΖ4γpX25-’ςΫ°z7£Έ\"(°P \\32:]UΪθνβί
!]Έ<·AΫΫ€ΠίiΪ°l\rΤ\0v²Ξ#J8«ΟwmνΙ€¨<Ι ζό%m;p#γ`XDψχiZψN0Θ9ψ¨ε Αθ`
wJDΏΎ29t’*ψΞyμΛNiIh\\9ΖΥθΠ:ζαxο΅yl*ΘΞζY άψκ8W³β?΅ή3ΩπΚ!\"6εn[¬Κ\r*\$ΆΖ§ΎnzxΖ9\rμ|*3Χ£pήο»Ά:(p\\;ΤΛmz’ό§9σΠΡΒό8N
Αj2½«Ξ\rΙHξH&²(ΓzΑ7iΫk£ €c€eςύ§tΜΜ2:SHσΘ Γ/)xή@ιεtri9₯½υλ8ΟΐΛοy·½°VΔ+^WΪ¦¬kZζYl·Κ£4ΦΘΖͺΆΐ¬π\\EΘ{ξ7\0ΉpDi-TζώΪϋ0l°%=Α ΠΛ9(5π\n\nn,4\0θa}ά.°φRsοͺ\02B\\Ϋb1S±\0003,ΤXPHJspεdK CA!°2*WΤρΪ2\$δ+Βf^\n1΄ςzE Iv€\\δ2Ι .*A°E(d±α°ΓbκΒάΖ9βΑDh&ͺ?ΔH°sQ2x~nΓJT2ω&γΰeR½GQTwκέ»υPβγ\\ )6¦τβΒςsh\\3¨\0R ΐ'\r+*;RπHΰ.!Ρ[Ν'~%t< ηpάK#Βζ!ρlίΜπLe³Ω,Δΐ&α\$ Α½`CXΣ0ΦεΌϋ³Δ:Mιh ηΪGδΡ!&3 D<!θ23Γ?h€J©e Ϊπhα\r‘mπNiΈ£΄ΚNΨHl7‘vκWIε.΄Α-Σ5Φ§ey\rEJ\ni*Ό\$@ΪRU0,\$UΏE¦ΤΤΒͺu)@(tΞSJkαp!~ΰd`Μ>―\nΓ;#\rp9jΙΉά]&Nc(rTQUͺ½S·Ϊ\08n`«yb€ΕLάO5ξ,€ς>xββ±fδ΄βΨ+\"ΡI{kMΘ[\r%Ζ[ €eτaΤ1! θν³Τ©F@«b)R£72ξ0‘\nW¨±L²άtdΥ+νά0wglψ0n@ςκΙ’ΥiνM«\nA§M5nμ\$E³Χ±NΫαl©έΧμ%ͺ1 AάϋΊϊχέkρrξiFBχΟωol,muNx-Ν_ Φ€C( fιl\r1p[9x(i΄B²ΫzQlόΊ8CΤ ΄©XU Tb£έIέ`p+V\0ξΡ;CbΞΐXρ+Οsοό]Hχ[αkx¬G*τ]·awnϊ!Ε6ςβΫΠmSνΎIήΝKΛ~/Σ₯7ήωeeNΙςͺS«/;dεA>}l~Οκ ¨%^΄fηΨ’pΪDEξΓa·t\nx=ΓkΠ*dΊκπTΊόϋj2Ιj\n Ι ,e=M84τϋΤaj@ξTΓsΤδnf©έ\nξ6ͺ\rdΌ0ήντY'%Τνή~ ¨<ΦΛAξHΏG8ρΏΞ\$z«π{Ά»²u2*ΰaΐ>»(wK.bP{
oύΒ΄«z΅#λ2φ8=Ι8>ͺ€³A,°e°ΐ
+μCθ§xυ*Γα-b=m,aΓlzkο\$Wυ,mJiζΚ§αχ+θύ0°[―.RΚsKωΗδXηέZLΛη2`Μ(οCΰvZ‘άέΐΆθ\$ΧΉ,εD?H±ΦNxXτσ)ξM¨\$σ,Ν*\nΡ£\$ϋMΐ°@ΆΎH DsΠ°Z[tH£Enx(π©R xρϋ@―ώGkjW>ΜΒΪ#T/8c8ιQ0Λθ_ΤIIGII!₯πYEdΛE΄^tdιthΒ`DV!Cζ8₯\r΄b3©!3β@Ω33N}βZBσ3 Ο3δ30ΪάM(κ>Κ}δ\\Ρtκf fΛβI\rσ337 XΤ\"tdΞ,\nbtNO`Pβ;άΐΤ―\$\nίδZΡ5U5WU΅^hoύΰζtΩPM/5K4Ej³KQ&53GXXx)<5D
\rϋVτ\nίr’5bά\\J\">§θ1S\r[-¦ΚDuΐ\rβ§Γ)00σYυΘΛ’·k{\n΅Δ#΅ή\r³^·|θuά»Uε_nοU4ΙU~YtΣ\rIΓ@δ³R σ3:uePMSθ0T΅wW―XΘςςD¨ς€KOUάΰ;Uυ\n OYιYΝQ,M[\0χ_ͺDΝΘW ΎJ*μ\rg(]ΰ¨\r\"ZC©6uκ+΅YσY6Γ΄0ͺqυ(Ωσ8}σ3AX3T h9jΆjΰfυMtεPJbqMP5>πΘψΆ©Yk%&\\1d’ΨE4ΐ ΅YnΚν\$<₯U]Σ1mbΦΆ^υ κ\"NVιίpΆλpυ±eMΪήΧWιά’ξ\\δ)\n Λ\nf7\nΧ2΄υr8=Ek7tV΅7P¦ΆLΙνa6ςςv@'6iΰοj&>±β;γ`a \0pΪ¨(΅JΡλ)«\\ΏͺnϋςΔ¬m\0Ό¨2τeqJφPτtλ±fjόΒ\"[\0¨·’X,<\\ξΆΧβχζ·+mdε~βΰ
Ρs%o°΄mnΧ),ΧζΤ²\r4ΆΒ8\r±ΞΈΧmEH]¦όΦHWM0Dοίε~ΛKξE}ψΈ΄ΰ|fΨ^άΧ\r>Τ-z]2sxDd[stS’Ά\0Qf-K`’tΰΨwT―9ζZΰ ψ\nB£9 Nbγ<ΪBώI5oΧoJρpΐΟJNdεΛ\rhήΓ2\"ΰxζHCΰέ:ψύ9Yn16Ζτzr+z±ωώ\\χτm ή±T φς χ@Y2lQ<2O+₯%Ν.Σhω0AήρΈΓZ2R¦ΐ1£/―hH\r¨X
ΘaNB&§ ΔM@Φ[xΚ₯κβ8&LΪVΝvΰ±*j€ΫGHεΘ\\Ω ²Ά&sΫ\0Q \\\"θb ° ΰΔ\rBsΙw ΩαBN`7§Co(ΩΓΰ¨\nΓ¨¨19Μ*E ρS
ΣU0UΊ t'|m°ή?h[’\$.#Ι5 ε pΰyBΰ@Rτ]£
κ@|§{ΐΚP\0xτ/¦ w’%€EsBdΏ§CU~OΧ·ΰPΰ@Xβ]Τ
¨Z3¨₯1¦₯{©eLY‘Ϊ’\\(*R` ΰ¦\n
ΰΊΜQCFΘ*ΉΉΰι¬ΪpX|`N¨Ύ\$[@ΝU’ΰπ¦ΆΰZ₯`Zd\"\\\"
’£)«I:θtμoDζ\0[²¨ΰ±-© gν³*`hu%£,¬γI΅7Δ«²Hσ΅m€6ή}ΊNΦΝ³\$»M΅UYf&1ωΐe]pz₯§ΪI€ΕmΆG/£ Ίw ά!\\#5₯4I₯dΉEΒhqε¦χΡ¬kηx|Ϊk₯qDb
z?§Ί>ϊΎ:[θLΖ¬Z°X:Ή·ΪΗjίw5 ΆYΎ0 ©Β―\$\0C’dSgΈλ {@\n` ΐΓόC ’·»MΊ΅β»²# t}xΞNχΊ{ΊΫ°)κϋCΚFKZήjΒ\0PFYBδpFk0<Ϊ>ΚD¬8¨²ΓCΈ?e_`ΠΕX:ΔA9ΓΈτp«GΠδGy6½ΓFXr‘lχ1‘½Ψ»B’Γ
9Rz©υhB{\0λε^Γ-β0©%D5F\"\"ΰΪάΚΒϊiΔ`ΛΩnAf¨ \"tDZ\"_ΰV\$ͺ!/
DαπΏ΅΄Ω¦‘ΜF,25ΙjTλαy\0
NΌx\rηYl¦#ΖEq\nΝΘB2\nμΰ6·
Δ4ΣΧ!/Β\nσQΈ½*;)bRΈZ0\0ΔCDoΛ48ΐ΄΅Πe\nγ¦S%\\ϊPIk(0Αu/G²ΖΉΌ\\Λ} 4FpGϋ_χG?)gΘotΊ[vΦ\0°Έ?bΐ;ͺΛ`(ΫΰΆNS)\nγx=θΠ+@κά7jϊ0,π1Γ
z>0GcπγL
VXτ±ΫπΚ%ΐ
ΑQ+ψιoΖFυΘιάΆΠ>Q-γcΪΗl‘³€wΰΜz5Gκ@(hcΣHυΗr?Nbώ@Ι¨φΗψ°ξlx3U`rwͺ©ΤUΓΤτtΨ8Τ=ΐl#ςυlδ¨8₯E\"O6\nΒ1e£`\\hKfV/Π·PaYKηOΜύ ιΰx Ojσr7₯F;΄κB»κ£νΜΌ>ζΠ¦²V\rΔΔ|©'J΅z«Ό#PBδY5\0NC€^\n~LrRΤ[ΜRΓ¬ρgΐeZ\0x^»i<Qγ/)Σ%@ΚfB²HfΚ{%Pΰ\"\"½ψ@ͺώ)ςDE(iM2S*yςSΑ\"βρΚeΜ1«Χ\n4`Κ©>¦Q*¦άy°n₯TδuΤβδΡ~%+W²XK£Q‘[ΚΰlPYy#DΩ¬D<«FLϊ³Υ@Α6']Ζϋ\rFΔ`±!%\n0cΠτΐΛ©%c8WrpG.TDoΎUL2Ψ*ι|\$¬:ηXt5ΖXYβIp#ρ ²^\nκ:#Dϊ@Φ1\r*ΘK7ΰ@D\0ΈCC£xBhΙEnKθ,1\"υ*y[α#!σΧβΩ©Κ°l_’/φxΛ\0ΰΙΪ5ΠZΗ4\0005JΖh\"2%Y
¦aa1SϋO4Κ%niψPΰί΄qξ_Κ½6€~ΘI\\ΎdϊdΡψDάΘ΅3g^γό@^6Υξε_ΐHD·.ksL΄Τ@ΒωΙζnI¦ΔΡ~Δ\rb @ΈΣNt\0sιΒ]:uπΞXb@^°1\0½©₯2?θTΐσ6dLNeΙ+κ\0Η:©Π²l‘z6q=ΜΊx§ηN6 άO,%@s0\nζ\\)L<ςCΚ|·¦PΆb’ΌΞA>I
α\" ά^K4όgIXi@P
jE©&/1@ζfά ΤNαΊx0coaί§Αͺσ,C'άy#6F@‘Π H0Η{z3t|cXMJ.*BΠ)ZDQπε\0°ρT-v₯Xa*έ,*ΓKE'ΨUΩ_IΠχμ³9³ΛΌ‘j(Q°@Λ@ς4/¬7τ'J.βRT
\0]KSΉDAp5Ό\rΒH0!δΒ΄e d@RΰΈ΄Κ9’S©;7HBΐbxσJθΦ_viΡU`@΅ΓSAM
―XΛΟGΨXiΩΣU*¬ΪφΚυϋΝ'ψέ:VςWJv£DΎN'\$μzh\$d_y§Z]σYΚ°³8Ψώ‘ζ]¨Pμ*hΤΦ§e;Ίpeϋ’\$kζw§μ*7N²DTx_ΤΤ§½Giτ&PΤtΝ¨bθ\\EΖH\$iE\"cr½ε0l?>ΑρC(W@3ΘΑ22a΄IΑΰΉΥ‘{₯B`άΪ³iΕΈGo^6E\r‘ΊGM€p1iΩIΌ€Xͺ\00032ΗKό§Στέzl&Φ'ILΦ\\Ξ\"7€>¬j(>γjτFG_βδ& 10IΖA31=h q\0ΖF«Δ·έ_ΒJͺΤ³VΞΊάqΩΥ’Ω Βΰ(/ΎdOC_sm§<gx\0°\"π\n@EkH\0‘J8(¬¨―km[μΏΑS4π\nY40«+L\n¦ΐμ#BΣ«bηΐ%RΦ°΅ΧΐR:Ζ<\$!Ϋ₯r;
Η %|Κ¨α(|«H\0ΰπΑΠ°
]Βc‘=0―νZα¨\"\"=ΦX)½fλN6V}FΥΪ=[Ιΰ§’huτ-ψ±\0t₯εbW~ΊυQΥiJφLρ5Χq#kb έWn««ΝQψT!λΒeυncSΡ[+Φ΄E―<-a]ΕμYbΣ\n\nJ~δ|JΙ8 μLpΑζoρ Nδ©ά¨
J.ωΕSΘ‘2c9Γj©y-`a\0Δφ*μΦ@\0+΄ΨmgΙΪ6°1€ΤMe\0ͺΛQ _}!IφGLf)ΓXρo,ShxΒ\0000\"hπ+L₯MΤΙ ͺΡ±ΚZ j\0Ά ΅/\$¨>u*Z9ξZεeυ«+JΈtzΘΛϋΘώR¨KΤ―ΠΡβDyήΩqα0C-f’ΕmΆΉͺBIν|ΉHBsQlΐX°.έΕφΤ|Έcͺΐ[σZhZεΓl¨ΫxΒ@'΅ ml²KrQΆ26½]―·n§d[έφρ©dώ\"GJ9uςϋBo©ZίΥa₯²n@Αͺn°lW|*gX΄\nn2εF¬|x`DkuPP!Q\rr`W/Ή 1ζ[-o,71bUs’©ηNΈ7²ΛΙΫGqΈ.\\Q\"CCT\"ζΰΔ*?u¨tsΆ°Η]αΩ©Pz[₯[YFΟΉ’FD3€\"ΊΗ]uΫ)wz:#ΆΝέIiwκpΙ»ρ{―oΦ0nπΆΫ;Υβ\\ιxΈ°Ψ\0q·mεγνͺ&Ψ~Βξξ7²ψΐΉ9[€HιqdLOΊ2΄v|B―tζ\\Ζ€Hd¦λβH\" ςμN\n\0·©GΕgΞF ΈF}\"μ&QEKΎ{}\ryΗΎrΧtΐο7ΤNuΓ³[Aψgh;S₯. ±Β₯|yωΟ[Υ_bςΘ¨¬!+RρθZXω@0NιιώΑPήμ%‘jD£Β―z ώΰ[ψU\"Ά{e8τ>EL4JΠ½
0‘¦θ7 ΄d·¬ ΐQ^`0`―]cπΗͺAX[,,\"'<΅%Άa«Σ΄Γ΅.\$ρ\0η%\0αsV€ξΛp M\$Ό@jαΧπ>€}VeΔ\$@Ν#§ͺΠ(3:ψ`UπYΜΆuζ¨ϋΟβΞ@ΔV#EG/ΈόXD\$h΅avΌxS\"]k18a―Ρ9dJROΣs`EJ°½§ψUo³m{lΉB8₯Α(\n}ei±bόψ, ; NͺΝψQΨ\\θΗΈI5yRΌ\$!>\\ΚgΒuj*?n°MΣή²hέψ\r%Α³ΰU(d¦N΅d#}pA:¬¨ύ-\\θA»*Δ42Iθ\rΦ£»
0h@\\Τ΅Ιΐ8π3rq]ςωd8\"πQ ξΖ:cΖΰyΗ4 ΟαdaΒΞ 6>UΫAΪΡ:½@2Ϋ\$ςeh2΄ϋF»§ΙNα+\rώΤ(ξAr°d*ό\0[#cjϋ΄>!(SπΘιLeύTΙΖM 9\0W:BDύψ3J¬Υ_@sΗαrueψ¦π»ύ¬ +Ί'B«Ι}\"B\"όz2ξrλl»xF[θLΩΛ²Ea9 Κcdb½Ύ^,ΤUC=/2»ΧςΌψμ/\$CΖ#Ϊχ8‘}DΐΫΧ6Ο`^;6B0U7σ·_= ,ͺ1βj1V[¨. H9(1ο±Ζ±Lz’CΈ Η\$.AΚfhγ«ΎΝΰοDrY ύHΨe~or19ζΩ
\\ίP)\"ΓQΉ΄,ΡeςφLΎw0Ο\0§Ο;wμX³Η¨ηqoΉοΎ~«φηψ>9τ>}²ςΊdcΏ\0εΚgΎΆfΞωq&9Ή-ύJ#€Έͺ3^4m/Μ―\0\0006ΐ¦n8£·>δ΄.Σιcph±ΛΩωΊ_A@[7«|9\$pMh >Α5°K₯ϊΓE=hώAt^βVΧ ©\" c£B;€φήi
ΥQ t¬ςι@,\nΨ)σsΣ`°°;Ρ4΄Iν£©νωθy -€0yeΚ¨UBξ©v³₯3HPΗGΛ5κοs|·Ί\rπΠ\$0γθςς1½©l3ι(*oF~PK΄ͺ.ύ,'·J/Σ²tπd:n§\n©πjY«zκ(Ζσόw°έ Zμ#ZΚ Io@1ΖΞ»\$ος±¦=VWz nBψaϊA»΅qͺ@΄Ip @Ρ5ΣlH{UΊάoXυΏfπΣΏ\\z΅Χ.§²,-\\Ϊ^y n^ΕΧΚBq·ώ
€zXγ‘\$¨*J72ΥD4.Υ
!€M0ΆσDλμFΰσγ G‘ΟLmΨc*mοcI£ε5Ι»^tΏͺjl7ζΏSΆQ ’.iιΦΤh¨υLΠΪ±B6Τh&οJ
l\\πWeͺcΞf%kjΑ ¦pΓR=δi@.υ₯(δ2klHUW\"o₯j½§p!S5ΖθpL'`\0€O *¦Q3XΒήlJ\08\n
\r·²Έ*aρόλΌϋr`<€&ΪXBhΦ8!x&δBht₯\$ώ]ΙnίισΙcL[Ζ΅©dΈα<`\0’ΟήawζO%;υBC»
Q\rΜΣμμp€«ΨPQΆZΈϊZΑAu=N&Πia\nΡmK6I}ΡΧn Εt\nd)νΠΘχbpΞ\"πg'¦07ΓuΘ&@β7ε8X NΐxΔαφϊ\$BωίZB/ΆM―gB»i¦ΦΡ§Ά\\βmmIΜΔΚη;5=#&4ΜηώPΥ½ιπqνAδ\\
,q€cή\ncβBΎΧϊw\0BgjD@;=0mkΔ\rΔ²`ΐ€'5€Άk-{’\0―_Muξψ2Χ§»£ΐqψ¬π>)9ΘW\nδd+
ΤΤ§ΐG\rύΓn4δOΨ:5φή8»1΅:Ξ?₯(yGgWK\rέ7²m5.eHΩhJ«Ak#»ΣLΆ..\\Ξ=ΥρUΩΠΣ:Π>7ΊW+^yDbόG‘OZΝ4οr(|x΅ΖύPrΈ£,y©Π8qaά©O2΅kͺn#p2ΎϋΗΊΨ.Ό£cUcφδλΕjσ\$τν8Δ¬~7ZR:πΧ89Ξ¨w(aL€%-,ΤΘμΏ#τf%8ώΙ|ήc¬ΪΧ%XWΒ\n}6HμρζΛ€‘#Ή&J,'zMόM
’ΰΰΊά² /y6YQ―μΆΪΊdΣdΑήσΟ:υγτ£Ep2ggΑ/ξ,ΛδΪΥ'8μ^;΄UWN
ΡΕήΥ{ΙOCς
Ρ€τ’zΙiKX’ΪNdG£RCJYυi²Χy#>zS²MUc£υ¨ϋκRORΤΎ‘0)Ψ0Κϊ]:=ΟtΑλι'\$srFφΩ67 =\$BΔΣ!qs 1\"ό¬vΖχ%Il<Κb!Ϋ6(Cd-Κ^βWΟΝέyΓ£¬έMλJ£rpTΌLπ|`f
:ΚυA²tδd|i½³[wόθjW 7€£au© ϊλe ςA5Q' Κ\0Θ 3Ύ\$Βηύ\rk)a; σζH=ωΦ~σIGIζ°<ω΄\"ω¬ΙI1'θ ’Gcm\0P\nοwθό#Ν>½ΫxB\"ρEm|
ω2\$}<3PYXgo£dίΆ<Τώ£ΏqE\"`ΧϊΘ4αg«8r£]\n‘υ:ψqVbTμ£m°
9K&Δ€ΓmΤ7)@¨ΐQzΓΣ=’½ί΅Ε±νH\nΤλφ}Oηi}»\rΩ£.’ΉvpΎJW&ίuΧ550 Τ5ΐξPΛIΑ\n½ΫνΈ³Ζζl\0O5*=ήϊ
P-’ιΚH\0σfΧ%ΜtγΊ*₯S:±tΟ ?ψΘHβρχΊq4ΠKΝ§@Τ¬»ά.O(±λό Z‘\$ΟΚΣ]ΌΕoΏnz«A±!t85θ8&ή!CLΰ¦H―υ(\0'Η2ϋμd\r%;ΰkζ4ϋΐ_OΟ>ώ5³φΰ@DύΌΟή\0VΓA6' AY¬’ΆύS°Ώ££rΤΎ΄4+h@bγυΎ΄ώOαM\0ΐεΐrΜϊ@\rJωΣm0\08ωOςμ;kΣ ΚλώA(6£| `8 ί\0°&Ώ²EΠVΟε\0VώγρΟοwk
Nΐ°KωΑ‘xdpΐsμAL§β«AΎXλku\0οώΝt ΐΤ’ς.>(NΕK'flο’ͺdϊAβ?++πN~ ²ϊkζΎ²ͺPR\0θϊx‘ΨγϋθΚτBK]¦bUΓΡ\\ΜΈd\0S@Ώδ«QΐοΝb\0\0bΦ\0_\\‘@\nNξ δOΞAPfΑ ΆτΤAj ¨ΒM4<€9°Ϊ+ηΐΏ¨`S μόΘw3Tπ¬7βX»ΒT!\0eοPAIΘb 1!\04³εΰ'Ή @ ! 8\0Λ/ο Ί!:K,ΨCASπXfe©ΞMωύ.:Ό:ςΖt»‘ΰΓΜ._Ίd°81v`B\"δΕ!.^Ϊ*εαN.^\n&\r(.Α©§ξO0«@χΩPΉnjΰΪ#‘ΌξδΣε&ΉrHΨ<¨ ’!ΰ3Άά(i @άAaΑΕ{υ Β¬#ΙS©½6π¨ΆF@©Τ¦γY[O( .¬/BόΛρΗσ)L02BΨΜ-ΑΖΨωqpΉJ<€.Π\0\nηο\0ΠΤ/@8C€4PΐΗ\r PΒ°)όπFβε\$q.]¬\"B#Ε #\\£Β84\$Γs:.(*Oi>|#T'`Bu«a/γCΐΒTΨKaκX8Ξ`p ΈΪΥΑ\0`Κ\0");}elseif($_GET["file"]=="jush.js"){header("Content-Type: text/javascript; charset=utf-8");echo
-lzw_decompress("v0F£©ΜΠ==ΞFS ΠΚ_6MΖ³θθr:ECI΄Κo:CXc\rζΨJ(:=E¦a28‘xπΈ?Δ'i°SANNωπxs
NBαΜVl0ηS ΛUl(D|ηΚP¦ΐ>Eγ©ΆyHchδΒ-3Ebε Έb½ίpEΑp9.Μ~\n?Kb±iw|Θ`Ηχd.Όx8EN¦γ!Ν23©α\rΡYΜθy6GFmY8o7\n\r³0€χ\0DbcΣ!ΎQ7Π¨d8Αμ~¬N)ωEΠ³`τNsίπ`ΖS)ΠOι·η/Ί<xΖ9o»Τε΅Αμ3n«2»!rΌ:;γ+Β9CΘ¨Γ\n<ρ`Θσ―bθ\\?`4\r#`Θ<―BeγB#€N άγ\r.D`¬«jκ4pιar°ψγ’Ίχ>ς8Σ\$Ιc Ύ1Ιc ‘c κέκ{n7ΐΓ‘AπNΚRLi\r1ΐΎψ!£(ζjΒ΄+Βκ62ΐXΚ8+Κβΰδ.\rΝΞτΞ!xΌεhω'γβ6Sπ\0RοΤτρO\nΌ
1(W0
γΗ7qλ:NΓE:68n+δΥ΄5_(s \rγκ/m6PΤ@ΓEQΰΔ9\n¨V-Ασ\"¦.:εJΟ8weΞq½|Ψ³XΠ]΅έY XΑeεzWβό 7βϋZ1νhQfΩγu£jΡ4Z{p\\AUΛJ<υkαΑ@ΌΙΓΰ@}&L7U°wuYhΤ2ΈΘ@ϋu Pΰ7ΛAhθΜς°ή3ΓκηXEΝ
Z]lα@MplvΒ)ζ ΑΑHWΤy>Y-ψYθ/«ͺΑξ hC [*ϋFγ#~!Π`τ\r#0PοCΛf ·Ά‘ξΓ\\ξΆΙ^Γ%B<\\½fή±ΕαΠέγ&/¦OπL\\jF¨jZ£1«\\:Ζ΄>NΉ―XaFΓAΐ³²πΓΨΝf
h{\"s\nΧ64άψ
Ό?Δ8ά^p\"λ°ρΘΈ\\Ϊe(ΈPN΅μq[gΈΑr&Β}PhΚΰ‘ΐWΩν*ήνr_sΛPhΰΌΰΠ\nΫΛΓomυΏ₯ΓκΣ#§‘.Α\0@ιpdW ²\$Ί°QΫ½Tl0 ΎΓHdHλ)ΫΩΐ)PΣάΨHgΰύUώͺBθe\rt:Υ\0)\"Εtτ,΄ΫΗ[(DψO\nR8!Ζ¬ΦπάlAόV
¨4 hΰ£Sq<ΰ@}ΓλΚgK±]ΰθ]β=90°'εβψwA<ΠΡaΑ~ςWζD|A΄2ΣXΩU2ΰιyΕ=‘p)«\0P s΅n
3ξrf\0’F
·ΊvΜGΑI@ι%€+ΐφ_I`ΆΜτΕ\r. N²ΊΛKI
[ΚSJς©ΎaUfSzϋ«M§τ%¬·\"Q|9¨Bc§aΑq\0©8#ξZΉlΉΣΐe5#U@iUGΒ©n¨%°s¦Λ;gxL΄pP?BηΚQ\\bιΎQ=7:Έ―έ‘QΊ\r:tμ₯:y(Ε Χ\nΫd)ΉΠ\nΑX; μκCaA¬\rαέρP¨GHω!‘ ’@Θ9\n\nAl~H ϊͺV\nsͺΙΥ«Ζ―ΥbBr£ͺφ²ίϋ3\rPΏ%’Ρ\r}b/Ξ\$5§PλCδ\"wΜB_ηΙUΥgAtλ€τ
ε€
ι^QΔεUΙΔΦjΑν Bvhμ‘4)Ήγ+ͺ)<j^\$€Τ`^6Μ9#Έ¨§ζ4Xώ₯mh8:κϋcώ0ψΧ;Ψ/Τ·ΏΉΨ;δ\\'( ξtϊ'+ςύ―Μ·°^]±NΡvΉη#Η,λvπΧΓOΟiΟ©>·ή@ΒW* =\0Nm1\0I@Τ9T34+Τ@eGFMCΙ\rE3ΛEtm!Ϋ#1ΑD @H(Σn ΓΖZQjΤ\"€¬iΦMsSγS\$Ib f²βΡu榴ε:κSB|i’ YΒ¦ΰ8 vΚ#ιDͺ4`.Λ^σHΕM_ΥΌuΐUΚz`ZJ eηΊέ@Ceνλa\"mσb6Τ―JRΒΦT?Τ£XMZάΝΠΝςpθΆͺQv―jjVΆ{ΆΌΕC\r΅Υ7TΚͺ ϊν5{PφΏ]\rΣ?QΰAAΐθΝ2ρΎ V)Ji£ά-N99fl JmΝς;u¨@ΈΥΣ\r@ΩPυ\rxFΧόEΜΘο%ΐγμό=5NΦΈ?7ωNΛΓ
©w`ΨhX«98 Μψ―q¬£zγΟd%6ΜtΝ/
δ¬λLϊΝlΎΚ,άKaN~ΟΐΫμϊ,'νΗM\rf9£w!xχx[ΟΨG8;xAω-IΜ&5\$D\$φΌ³%
ΨxΡ¬ΑΘΒ΄ΐΒ]€υ&o-39ΦLω½zό§y6Ή;uΉzZ θΡ8_Ιx\0D?X7«y±OY.#38 ΗeQ¨=Ψ*Gwm ³ΪYω ΐΪ]YOY¨F¨νΩ)z#\$e)/z?£z;Ω¬^ΫϊFZg€ω Μχ₯§`^Ϊe‘¦Ί#§Ψρ©ϊ?Έe£M£Ϊ3uΜε0Ή>Κ\"?φ@ΧXv\"ηΉ¬¦*Τ’\r6v~ΓOV~&Χ¨^gό ΔΩ'Ξf6:-Z~ΉO6;zx²;&!Ϋ+{9M³Ω³d¬ \r,9Φν°δ·WΒΖέ:κ\rϊΩωγ@η+’·]Μ-[gΫ[sΆ[iΩiΘqyιxι+|7Ν{7Λ|w³}’£EϋW°WkΈ|JΨΆεxmΈq xwyj»#³eΌψ(²©ΈΐίΓΎς³ {θίΪ y »M»Έ΄@«ζΙ°Y(gΝ-©Ί©δν‘‘ΨJ(₯ό@σ
;
yΒ#SΌ΅YΘp@Ο%θsϊo9;°κΏτυ€Ή+―Ϊ ₯;«ΑϊZNΩ―ΒΊ§ kΌV§·u[ρΌx
|q€ON?ΙΥ
`u‘6||XΉ€Ψ³|Oμx!λ:¨ΟY]¬Ήc¬ΐ\rΉhΝ9nΞΑ¬¬λΟ8'ωκΰ Ζ\rS.1Ώ’USΘΈ
ΌXΙ+ΛΙz]Ι΅Κ€?©ΚΐCΛ\rΧΛ\\ΊΉψ\$Ο`ωΜ)UΜ|Λ€|Ρ¨x'ΥΨΜδΚ<ΰΜeΞ|κΝ³ηβΜιLοΟέMΞy(Ϋ§ΠlΠΊ€O]{ΡΎΧFDΥΩ}‘yuΡΔί,XL\\ΖxΖΘ;UΧΙWtvΔ\\OxWJ9ΘΧR5·WiMi[Kf(\0ζΎdΔθΏ©΄\rμMΔαΘΩ7Ώ;ΘΓΖσρηΣ6KΚ¦Iͺ\rΔάΓxv\r²V3ΥΫίΙ±.ΜΰRωΒώΙα|αΎ^2^0ίΎ\$ QΝδ[γΏDχαά£ε>1'^X~t1\"6Lώ+ώΎAΰeαζήεIη~εβ³β³@ίΥυpM>Σm<΄SKΚη-HΙΐΌT76ΩSMfg¨=»ΕGPΚ°PΦ\rΈι>ΝφΎ‘₯2Sb\$C[ΨΧο(Δ)ή%Q#G`uπ°ΗGwp\rkήKezhjΣzi(τθrO«σΔήΣώΨT=·7³ςξ~4\"ef~νdτνVZχU-λb'V΅JΉZ7ΫφΒ)T£8.<ΏRM\$τΫΨ'ίbyο\n5ψέυ_ΰwρΞ°νUπ`eiήΏJb©gπuSΝλ?Νε`φαμ+ΎΟο Mοgθ7`ωον\0’_Τ-ϋυ_χ?υF°\0υΈXε΄[²―J8&~D#Αφ{PΨτ4ά½ω\"\0Μΐύ§ύ@₯\0F ?* ^ροΉε―wλΠ:πΎuΰΟ3xKΝ^σwΌ¨ί―y[Τ(ζ΅#¦/zr_g·ζ?Ύ\0?1wMR&MΏω?¬StT]έ΄Gυ:I·ΰ’χ)©Bο vτ§½1η<τtΘβ6½:W{ΐτx:=Θξήσψ:Β!!\0xΥ£χq&αθ0}z\"]Δήoz₯jΓwΧίΚΪΑ6ΈJ’PΫ[\\ }ϋͺ`S\0ΰ€qHMλ/7BP°ΒΔ]FTγ8S5±/IΡ\r\n ξO―0aQ\n >Γ2j
;=Ϊ¬ΫdA=p£VL)Xυ\nΒ¦`e\$TΖ¦QJΞk΄7ͺ*Oλ .
ςΔ‘\rφ΅\$#pέWT>!ͺͺv|Ώ’}λΧ .%Α,;¨κε
Ϊf*?«ηοτ\0ΈΔpDΈ! Άυ#:MRcϊθB/06© 7@\0VΉvg ΨΔhZ\nR\"@ΘF ΚδΌ+Κ°EIή\n8&2bXώPΔ¬Ν€=h[§₯ζ+ΥΚ\r:ΔΝFϋ\0:*εή\r}#ϊ!\"€c;hΕ¦/0·ήςEjνΑΞ]ρZ\0Ϊ@iW_h;VRb°ΪP%!μb]SBυUl εβ³ιrά\rΐ-\0 ΐ\"Q=ΐIhΝ΄ FωώLθΞFxRΡ@\0*Ζj5όk\0Ο0' @ElOΪΖH Cxά@\"G41Δ`ΟΌP(G91«\0π\"f:QΚΈ@¨`'>7ΡΘδdΐ¨νΗR41η>ΜrIHυGt\nRH ΐΔbΆ71»μfγh)Dͺ8 B`ΐ°(VΊNφ|£Ί tΉΣ\n6vΐ_ξeέ;yΥΞθ6fόgQ;yϊΞ²[Sψ δλgφΗ°θOud‘dHHπ= Z\rζ'ΪΚωqC*) ξgΒΗEκO \" π¨!kΠ('`\nkhTωΔ*φsΔ5R€Eφa\n#Φ!1‘ΏΧ\0‘;ΖΗSΒiΘΌ@(ΰl¦ΑΈIΧ Μv\rnj~Ψη63ΏΞτI:h°ΤΒ\n.«2plΔ9Btβ0\$bΊp+Η*tJ’πΜΎsJQ8;4P(ύ§ΡΆ!.Ppk@©)6Ά5ύ!΅(ψ\n+¦Ψ{`=£ΈH,Ι\\Ρ΄4\"[²Cψ»Ί1΄-θΜluo΅δΈ4[±β
EΚ%\"τw] Ω(γ ΚTe’)κK΄AE={ \n·`;?έτ-ΐG5I‘ν.%Α₯²ώιq%Eύs’ι©gFΉs ¦ΈKΊGΡψn4i/,i0·uθx)73SzgβΑV[’―hγDp'ΡLP₯Pπmi]\0ͺφφ΅aV¨Έ=ΏͺΘI6¨΄°ΞΣjK3ΪςΤZ΅Q¦mEΔθπbΣ0:32ΊV4N6³΄ΰ!χlλ^Ϊ¦Ω@h΅hUΠ>:ϊ ΠE>jδθΠϊ0g΄\\|‘Shβ7yΒή\$,5aΔ7&‘λ°:[WX4ΚΨqΦ μJΉΖδΧήc8!°HΈΰΨVD§Δ+νD:‘₯°9,DUa!±X\$ΥΠ―ΐΪGΑάBt9-+oΫtLχ£}ΔυqKx6&――%xΟtRΏιπ\"ΥΟθRIWA`cχ°Θ}l6Β~Δ*Έ0vkύp«ά6ΐλ8z+‘qϊXφδw*·EͺINΆͺεΆκ*qPKFO\0έ,(Π|°k *YF5εε;<6΄@ΨQU\"Χπ\rbΨOAXΓvθχv―)Hτo`STΘpbj1+Ε’e²Α ΚQx8@‘ΠΘη5\\Q¦,ΈΔNλέήb#Y½H₯―p1ΦΚψkB¨8NόoϋX3,#UΪ©ε'Δ\"ιΒeeH#zq^rG[Έ:Ώ\rΈmngςάΜ·5½₯V]«ρ-(έWπΏ0βλΡ~kh\\Zε`οιl°κΔάk oΚjυWΠ!.―hFΤε[tΦAwκΏe₯Mΰ««‘3!¬΅Νζ°nK_SFj©Ώώ-S[rΜwδ΄ψ0^Αhfό-΄ύ°?ύXψ5/±©λλIY ΕV7²ad 8°bq·΅bn\n1YRΗvT±υ,+!ΨύόΆNΐT£ξ2IΓί·ΔΔχΗςΨυ©K`K\"π½τ£χO)\nYΪ4!}K’^²κΒΰD@α
χna\$@¦ Ζ\$AjΙΛΗψ\\D[=Λ bHpωSOAGho!F@lUΛέ`Xn\$\\Ν_’Λ`ΆβHBΕΥ]ͺ2ό«’\"z0i1\\ήΗΒΤwω.
fyή»K)£ξνΒΈ pΐ0δΈXΒS>1 *,]ΰ\r\"Ή\\4OInZnηςvΰ3Έ3τ+P¨
L(χΔπ
ΐΰ.x \$ΰΒ«CειCnͺAkηc:LΩ6¨ΝΒr³wΣΜh°½ΩΘnr³Zκγ=θ»=jΡ³6}MGύu~3ωΔbg4Εωτs6sσQι±#:‘3g~v3ΌσΏ<‘+Ο<τ³a}Ο§=Ξe8£'n)ΣcCΗzΡ4L=hύ{i΄±Jη^~ηΣwgDΰ»jLΣιΟ^Α=6Ξ§NΣκΕΑ’\\ιΫDσΖΡNκEύ?hΓ:SΒ*>τ+‘uϊhh
΄WE1jx²τν΄tΦ'Ξtΰ[ ξwS²Έκ·9―Tφ[«,ΥjvςΥξt£¬A#TΈΤζ9μθjK-υή ³Ώ¨YθiQe?£4ΣΣΑλ_WzίΞισ@JkWYκhΞΦpuηj|z4Χυ θiπm’ ΰO5ΰ\0>η|ί9ΙΧ«΅θ½ φλgVyΤu΄»¨=}gs_ΊγΤVΉsΥ{ηk€@rΧ^υΪ(έwΟ
ψH'°έaμ=i»ΦNΕ4΅¨λ_{Ο6ΗtΟ¨άφΟe [Πh-’Ul?Jξ0O\0^ΫHlυ\0.±ZΌβΪxuζπ\"< /7Α¨Ϊ ϋοi:\nΗ ‘΄ΰ;νΗ!ΐ3ΪΘΐ_0`\0H`Β2\0Hς#h[ΆP<ν¦Χ’gΆά§m@~ο(ώΥ\0ί΅kβY»vΪζβ#>₯ω\nz\n@ΜQρ\n(ΰGέ\nφόΰ'kσ¦θΊ5n5Ϋ¨Ψ@_`Π_l1άώθwpΏPξwͺή\0
c΅ΠoEl{ΕέΎι7»ΌΆo0ΠΫΒτIbΟκnzΫΚήΞο·Ό η{Η8ψw=λξ| /yκ3aνίΌ#xqΫΨςΏ»@οχkaΰ!\08dξmδR[wvΗRGp8ψ vρ\$Zό½ΈmΘϋtάήέΐ₯·½ντΊάϋ·Η½Τξϋuoέpχ`2πγm|;#x»mρnη~;ΛαVλE£ΒνΨπΔό3O\rΈ,~oΏw[ςαNκψ}Ίώ clyαΎρΈOΔΝήρ;
?α~μ^j\"ρWzΌ:ί'xWΒή.ρ Αu(ΈΕΓδqiS>ζΦ¦o°σoςΞfsO 9 .νώιβ\"ΠF
lσ20επE!Qα¦ηΛD9dΡBW4\0ϋy`RoF>FΔa0ωΚσ0 ΐ2η<IΟP'\\ρηΘIΜ\0\$\n R aUΠ.sΠ«ζ\"ω1Π
eΊYη ’Zκqρ1 |Ηχ#―G!±PP\0|HΗFnp>Wό:’`YP%Δβ\nΘa8ΓP>ΑΑθ`]4`<Πr\0ωΓη¨ϋ‘z4Ω₯Λ8ωΞΠ4σ`mγh:’Ξͺ¬HDͺγΐjΟ+p>*δΓΔκ8δΥ 08AΈΘ:ΐ»Ρ΄]wκΓΊωz>9\n+―ηηΝΐρΨ:°iiPoG0°Φφ1ώ¬)μZ°Ϊθn€ΘμΧeRΦάνg£M’ΰΐgsLC½rη8Π!°ΐ3R)Ξϊ0³0τs¨IιJVPpK\n|9e[αΦΗΛ²D0‘Υ ΰz4Οͺo₯Τιαθΰ΄,N8nεΨs΅#{θ·z3π>ΈBSύ\";ΐe5VD0±¬[\$7z0¬ΊψΓΛγ=8ώ T 3χ»¨Qχ'R±ΨnΘΌLΠyΕμφ'£\0oδΫ,»\0:[}(’|ΧϊX>xvqWα?tBE1wG;σ!έ5Ξ|Η0―»JI@―¨#’ήuΕIαψ\\p8Ϋ!']ίl-lεSίBΨπ,Σ·»ς]θρ¬1ΤHφNΒ8%%€ Ε/;FGSτςτhι\\ΩΣcΤt²‘α2|ωWΪ\$tψΞ<ΛhέO¬+#¦BκaN1ωη{ΨΠyΚwς°2\\Z&)½d°b',XxmΓ~Hη@:d >=-¦lK―άώJν\0ΜΜσ@rΟ₯²@\"(AΑροͺύZΌ7Εh>₯χ½\\Νζϊ¨#>¬υψ\0XrγYψοYxΕζq=:ΤΉσ\rloζmgbφφΐΏΐοD_ΰTx·C³ί0.τyR]Ϊ_έλΗZρΗ»WφIΰλGΤο MΙͺ(Ι|@\0SO¬Θsή {ξ£ψ@k}δFXSΫb8ΰε=ΎΘ_ΤΉl²\0ε=ΘgΑΚ{ HΙyGόΥαΫ s_ώJ\$hkϊFΌqΰχ’Ιd4Οψ»ζΦ'ψ½>vΟ¬ !_7ωVqΣ@1zλ€uSe
υjKdyuλΫΒS©.2\"―{ϊΜKώΨΛ?s·δ¬Λ¦hίRνdι`:yΩεϋGΪΎ\nQιύ·Ωίow'φοhSξ>ρ©ΆLΦX}πe·§ΈGΎβ@9ύγνόWέ|νψΟΉϋ@_χuZ=©,ΈεΜ!}₯ήΒ\0δI@δ#·Ά\"±'γY`Ώ\\?Μίpσ·κ,Gϊ―΅ύΧ_±'εGϊ²Π T#ϋoΝH\rώ\"Κλϊoγ}§ς?¬ώOιΌ7η|'ΞΑ΄=8³M±ρQyτaΘH?±
ί ³\0±φbUdθ67ώΑΎI Oφδοϋ\"-€2_0\rυ?ψ« hOΧΏΆt\0\0002°~ώΒ° 4²’ΜK,ΦohΌΞ Pc£·z`@Ϊΐ\"ξβΰΗH; ,=Μ 'S.bΛΗSΎψΰCcκμ‘R,~ρX@ '
8Z0&ν(np<6]#ψ₯;νCχ.’ΛΠ8»Pπ3ώ°;@ζͺL,+>½p(#Π-f1Δz°Αͺ,8»ί ΖΖPΰ:9ΐο·RπΫ³―Ή)e\0Ϊ’R²°!΅\nr{ΖξeψΞGA@*ΫΚnDφ6Α»πςσνNΈ\rRΤψ8QK²0»ΰι’½ΐ>PN°ά©IQ=r<α;&ΐ°fΑNGJ;πUAυά¦ΧAP&ώυΨγ`©Αόΐ);ψ!Πs\0ξ£Αpp\rΆΰΎn(ψ@
%& S²dY«ήμοuCΪ,₯Ί8O#ΟΑσςoͺκRθ¬v,―#θ―|7Ω\"Cp‘Bτ`μj¦X3«~οRΠ@€ΒvΒψ¨£ΐ9B#Ή @\nπ0>Tνυαΐ-5/‘=θ ΎέE―Η\nηΒd\"!;ήΔp*n¬ΌZ²\08/jX°\r¨>F PΟe>ΐO’LΔ―‘¬O0³\0Ω)kΐΒΊγ¦[ ΐΘΟ³Βκ'LΩ Γερι1 1\0ψ‘Cλ 1TΊ`©ΎμRΚzΌΔ£ξp’°ΑάΆμΐ< .£>ξ¨5έ\0δ»Ή> BnΛ<\"he>ΠΊΊΓ£ηsυ!ΊHύ{ά!\rΠ\rΐ\"¬δ| >R1dΰφχ\"U@ΘD6ΠεΑ’3£ηπ>o\r³ηαΏvL:K2ε+Ζ0μΎ>°Θ\0δν ·Bι{!r*HξΉ§y;`8\0ΘΛΨ―τ½dώ³ϋι\rΓ0Νΐ2Aώΐ£ξΌ?°υ+ϋ\0ΫΓ
\0A―wSϋlΑ²Ώ°\r[Τ‘ͺ6τco=ΆόΌ0§z/J+κψW[·¬~C0ωeό30HQPχDPY}4#YDφ
Ίp) Ί|ϋ@₯&γ-ΐ/F αT «¦aH5#λH.A>Ππ0;.¬ώYΔ‘ Γ*ϋD2 =3· pBnuDw\n!ΔzϋCQ \0ΨΜHQ4DΛ*ρ7\0JΔρ%Δ±puD (τO=!°>u,7»ω1γTM+3ω1:\"PΈΔχRQ?ΏόP°Ό+ω11= M\$ZΔΧlT7Ε,Nq%E!ΜS±2Ε&φU*>GDS&Όͺισozh8881\\:ΡΨZ0hΑΘT C+#Κ±A%€€D!\0ΨοςρΑXDAΐ3\0!\\ν#hΌͺν9bΟT!dͺΟΔYj2τSλΘΕΚ\nA+Ν½€HΘwD`ν(AB*χͺ+%ΥEο¬X.Λ Bι#ΊΘΏΈ&ΩΔXeEo\"Χθ|©rΌͺ8ΔW2@8Daο|ψχNϊhτ₯ΚJ8[¬Ϋ³φΒφWzΨ{Z\"L\0Ά\0Θ8ΨxΫΆX@ΐ E£Νολh;ΏafΌ1Βώ;nΓΞhZ3¨EΒ«0|Ό μφAΰ£tB,~τW£8^»Η Χυ<2/ Ί8’+΄¨ΫO+ %P#Ξ\n?»ί?½ώeΛΑO\\]7(#ϋ©DΫΎ(!c) NφΊΡMFE£#DXξgο)Ύ0Aͺ\0:άrBΖΧ`` ΪθQ³H>!\rB¨\0V%ce‘HFHΧρ€m2B¨2Iκ΅ΔΩλ`#ϊΨD>¬ψ³n\n:LύΙ9CρΚ0γλ\0x(ή©(\nώ¦ΊLΐ\"G\n@ιψ`[Γσ\ni'\0π)ωΌy)&€(p\0N ΐ\"N:8±ι.\r!'4|Χ~¬η§άΩΚκ΄·\"
cϊΗDltΣ¨0c«Ε5kQQΧ¨+ZGkκ!FcΝ4ΣRx@&>z=Ή\$(?σοΒ(\nμ¨>ΰ λ΅ΤιCqΫΌt-}ΗG,tςGW xqΫHf«b\0\0zΥμΑT9zwΠ
’Dmn'ξccb H\0z
ρ3Ή!ΌΡΤΕ HσΪHzΧIy\",- \0Ϋ\"<2ξ Π'#H`d-΅#cljΔ`³i(Ί_€ΘdgΘνΗ*Σj\rͺ\0ς>Β 6ΆΊΰ6Ι2σkjγ·<ΪCqΠ9ΰΔΙI\r\$CAI\$x\rHΆΘ7Κ8 άZ²pZrR£ςΰ_²U\0δl\rIRXi\0<²δΔΜr
~xΓS¬ι%^%j@^ΖτT3
3ΙGH±zρ&\$(
Ιq\0f&8+Ε\rΙ%μ2hCόx₯ΥI½lbΙ(hςSY&ΰBͺΐ`fςxΙv n.L+ώ/\"=I 0«dΌ\$4¨7rζΌA£υ(4 2gJ(Dα=F‘β΄Θε(«ϋ-'Δ ςXGτ29Z=Κ,Κΐr`);x\"Ιδ8;²>ϋ&
‘σ',@’€2Γpl²δ:0ΓlI‘¨\rrJDΐϊΚ»°±hAΘz22pΞ`O2h±8H΄ΔwtBF²g`7ΙΒδ₯2{,Kl£πί°%C%ϊomϋΎΰΐ΄+X£νϋΚ41ςΉΈ\nΘ2p ZB!ς=VΖά¨θΘΨ+H6²ΓΚ*θͺ\0ζkΥΰ%<² ψK',3ΨrΔI ;₯ 8\0Z°+Eά`Π²½Κγ+l―ΘΟΛW+¨Y΅-tfΛb‘Qς·Λ_-Σή
§+· 95LjJ.GΚ©,\\·ςΤ
.\$―2ΨJθ\\- ΐ1-c¨²Λ.l·fxBqK°,d·θΛβ8δAΉKo-τΈ²ξΓζ²°3KΖ―rΎΈ/|¬ΚΛε/\\ΈrΎΛρ,‘HΟ€Έ!πYΐ1Ή0€@.Β&|Λβ+ΐιJ\0η0P3JΝ-ZQ³ »\r&Γα\nLΡ*ΐΛήjΔ|εΛζ#ΤΎͺ\"ΛΊAΚο/δΉςϋ8)1#ο7\$\"Θ6\n>\nτ’Γ7L1ΰςh9Ξ\0BZ»d#©b:\0+AΉΎ©22ΑΣ'Μ\nt ΔΜΙOΔη2lΚ³.L’HC\0ι2 σ+L’\\Όr΄Kk+ΌΉ³Λ³.κκΊ;(DΖ’Κω1sΥΜςdΟs9ΜϊΌ P4ΚμΟσ@.μΔαAδΕnhJί1²3σKυ0Ρ3J\$\0μ2νLk3γαQΝ;3Ρn\0\0Δ,ΤsIΝ@ϋu/VAΕ1΅³UMβ<ΖLe4DΦ2ώΝV’% ¨Ap\nΘ¬2ΙΝ35ΨςΠA-΄TΝu53ςΫΉ1+fL~δ\nτ° υ->£° Φ‘M4XLσSυdΩ²ΦΝ*\\Ϊ@Ν¨YΣk€€ΫSDM»5 Xf° ¬ͺD³s€δΐUs% «Μ±p+Kι6Δή/ΝΤόέρ8Xδή=K»6pHΰρ%θ3Ν«7lΨI£K0ϊ€ΙLνΞD»³uκυ`±½P\rόΩSOΝ&(;³L@£ΟN>SόΈ2Λ8(ό³`JE°rF 2όεSEMMΘα\$qΞEΆ\$ΤΓ£/I\$\\γαIDε\" \nδ±Ί½w.tΟS ζΡPπς#\nWΖυ-\0C΅Ξ:jRνΝ^SόνΕ8;dμ`£ς5ΤͺaΚΗτEΉ+(XrφMλ;μ3±;΄σΌB,*1&ξΓΞΛ2XεSΌυ)<Ν L9;ςRSNΌή£ΑgIs+άλΣ°K<¬ρs΅LY-Z:A<αΣΒOO*υ2vΟW7ΉΉ+|τ Λ»μω·Λ7>΄§3@O{.4φpO½?TόbΓΟΛ.λ.~O
4τΟSοΟμ>1SSΟ*4ΆPΘ£σ>ό·ΑΟο3ν\0WΟ>΄τ2ε><λσίP?4Ϋ@τt\nNΐΗωAxpάϋ%=P@ΕCΟ@
RΗΛ?x°σ\n΄0NςwΠO?ΥTJC@υΞ# .dώ·MκΜt―&=Ή\\δ4θΔAΘε:L₯ν\$άιN:\rΞΙI'Ε²AΥrα;\r /ρCτΘεBεΣi>Lθ7:9‘‘φ|©C\$ΚΛ)Ρω‘Ήz@΄tlΗ:>ϊCκ\n²Bi0GΪ,\0±FD%p)o\0°©\n>ϊ`)QZIιKGΪ%M\0#\0DΠ ¦Q.Hΰ'\$ΝE\n «\$ά%4IΡD°3o’:Lΐ\$£Ξm ±0¨ ΤB£\\(«¨8όΓι
hΜ«D½ΤCΡsDX4TK¦{φ£xμ`\n,
Ό\nE£κ:p\nΐ'> κ‘o\0¬ύtIΖ` -\0D½ΐ/KPϊ`/€κψHΧ\$\n=>΄UχFP0£λΘUG}4B\$?EύΫΡ%TWD} *©H0ϋT\0tυ΄ΒΨ\"!o\0Eβ7±οR.ϊtfRFu!ΤDπ\nο\0F-4VQHΕ%4Ρ0uN\0DυQRuEΰ )ΝI\n &Qm)Ηm #\\D½ΐ(\$Μx4WFM&ΤR5Hε%qε[F
+ΘωΡIF \nT«R3DΊLΑo°Όy4TQ/E΄[Ρ<t^ΛFό )Qε+4°QIΥ#΄½IF'TiΡͺXΐ!Ρ±FΠ*ΤnRΚ>ͺ5ΤpΡΗKm+ΤsΗά ϋ£οαIετREύ+Τ©€ΩM\0ϋΐ(R°?+H₯Jν\"TΓDͺ\$ΰ 4wQΰ}Tz\0G΅8|xηΝ©R’υ6ΐRζ 4XR6\n΅4yΡmNτγQχNMΰ&RΣH&Ι2Q/ͺ7#θά{©',|ΗΞ\n° .·\0>Τ{Αo#1D
;ΐΒΠ?UτJς9*Έjύ―FN¨ΡJυ #Ρ~%-?CτΗίL¨3Υ@EP΄{`>QΖΘ΅Τ%Oν)4οR%I@Ττ%,\"ΥΣωIΥ<λΣΟε\$ΤTP>Π\n΅\0QP5DΣkOFΥTY΅<ΑoύQ
=T\0¬x 5©D₯,Β0?ΝiΞ?xώ ΊmE}>Ξ|€ΐΐ[Θη\0&RLϊH«S9GI§1δ
M4VHώoT-S)QγGΗF [ΓωTQRjN±γ#x]N(ΜU8\nuU\n?5,TmΤ?Πά?ώ@ΒU\n΅u-Rκ9γπU/S \nU3IEStQYJu.΅QυF΄o\$&ΐϋi άKPCσ6Β>ε5΅G\0uRu)U'R¨0Π‘DuIU
J@ Τχ:εV8*ΥRf%&΅\\ΏRΘυMU9RψόfUAU[T°UQSe[€΅\0KeZUaUhϊ΅mS<»ΐ,Rθs¨`&Tj@ηGΗ!\\xτ^£0>¨ώ\0&ΐpΞQΏQ)TUεPs@%\0W `\$Τς(1ιQ?Υ\$CοQp\n΅OΤJΉρX#ύV7Xu;Φ!YBξ°ΣSεcώΡ+V£ΞΓρ#MUΥWHΝUύR²Η
U-+τπVmY}\\υΘOK₯Mμ\$ΙSνeToVΝHTωΡ!!<{΄RΣΝZA5RΑ!=3U€({@*Ratz\0)QP5HΨΞΥ°N5+ΟP[Τν9σV%\"΅²ΦΨ\n°ύρδGSL΅Τς9ωΗΜλlΐ£\rVΨ€Ν[ouΊUIY
R_T©Yp5OΦ§\\q`«UΧ[ΥBu'Uw\\mRUΗΤ\\Es5ΣK\\ϊοVΙ\\ΕS{ΧAZ%OυΌ\$ά₯F΅Τ¬>ύ5EΧWVm`υWd]& \$ΡΞΕΫΣ!R₯Z}Τ
]}v5ΐ§ZUgτΤQ^y` Ρ!^=FαRΑ^₯vλUΕKex@+€ήr5ΐ#Χ@?=uΞs €Χ₯YN΅sS!^c5π\$.u`΅ά\0«XE~1ο9
JσUZ’@²#1_[4J2ΰ\nΰ\$VI²4n»\0?ς4aͺRη!U~)&ΣςB>tRίIΥ0ΐΤ_EkTUSΨ|΅ύUk_Β8&E°ό(β?β@υΧΧJ5½JUBQT}HVΦj€Qx\neΦVsU=ΤύVN’4Υ²Ψ\\xθΦοR34έGΏD\": KQώ>[Υ\rΥY_ε#!ͺ#][j<6ΨX ¨μΝcΨ#KL}>`'\0¨5XΡcU[\0υ(ΤΩΡWt|tτR]pΐ/£]H2IQO1βS©QjZ¨Έ΄HΊ΄m¨ΜΩ)d΅^SXCY\rtu@Jλpό΅%ΣMΈψ¨σ΅Φ?ΩUQ°\nφ=Rεar:ΤΏEνΐ₯-G\0\$ΡΗd½φ]meh*ΓμQWtφc‘`AͺY=S\r―« m-΄€=MwΦH£]Jε\"δ΄Δ υώfυ\"΄{#9TeΩΝMΤcΉρNκI£ςΩίD₯υΩάηU6ΩρgΡ2ΩΧέΆeaL΄Q&&uTεX51Y >£σϋSύΦQ#κI΅₯Υj\0ϋ£ΕW PΡώ?ub5FUσLnΆ)V5R’@γλ\$!%oΆΤPϊΙ'E΅UΑΤP-Ά€Bp\n΅F\$S4
t±UF|{qΦΘ0ϋΞUmjsΞΓό²ψύ\$΄Ϊj
cλΪε¦Φ«ΏaZI5Xj26€&>vΡ\n\r)2Υ_kξGΆTJΪΑeQ-cξZρVMΦ½£z>υ]aΉc£Λcμί`tHΪΡjέ6Ή£+kM\0>##3l=ΰ'΄₯^6Ν\0¨Γ¨v¦Z9Se£\"ΧΚκbΞ‘ΤB>)/TΑ=φ9\0ω`Pΰ\$\0Ώ]ν/0Ϊͺ«δ΅½k-6έΫ{kόΦα[F\r|΄SΡΏJ₯υMQΏD=υ/ΘWX’φVa¬'ΆΉιa¨to©lεΆΠXj}C@\"ΐKPΫΞΦΪom3\0#HV΅
vχΡ~{΅Φ?gx n|[Ψ?UΆδ΅[rκ½hΆήGΈ`υ3#Gk%L£κ\0ΏI`CωDήκΈ \"\0Ε§Ά°#cN«6ίΪΉfΒΤzΫκΊ;Ρ€ΓeeF7Ω/N\r:τβQρGΥ9 \$ΤσIψΥΌΊί]£TέΨWGs«ΤdWυMΪIγθΡΩfBcκΫ€κυΒχ!#cnu&(ήSγ_Υw£ωSfλ&TZ:
0CσSΩLN`ά³Yj=·Ά>Ε²ΓρZ!=rV]gϋ Σ£r΅ ΛXlΙ-.ΉUΔ'uJuJ\0sJΆ'W%·Ά\\>?ςBφλVj4΅ΟJ}I/-rRLΊSθ3\0,RgqΣτΗTf>έ1Υο\0₯_Η\\V8υ‘ZΫt
Αcθϊ<^\\ωll΄j\0ΎώT₯]CέΤwΧΞzIΆΩZwN
ΆΆpVW
jv»YΆ>2Σ o\$|UWΓL%{toX3_υΆςRJ5~6\"ΧγZl}΄`ΤkcΡξΫeR=^UΤ₯1ςΡ½w7eΨd΅έvΩb=α\0ωf ,³mε)ΥιGpϋΥ-ΣΌ½)9Lύ>|Τλ \"Μ@θϋ€5§`:τ\0ι,ρt@ΊΔxΊςlΓJΘ»b¨6 ΰ
½έaήA\0Ψ»ARμ[A»Γ0\$qoAΰΚSό@Μψ¬<@ΣyΔΠ\"as.βΞδχV^θ₯^υ
\0άΘHΑ·[H@bK©ή)zΐ\r·¨€€=ιΑ^ΏzB\0ΊΏ€δNιo<Μt<xξ£\0Ϊ¬0*R ΊI{₯ν΄^ζE΅ξ·Έ:{KΥ§1E0²ΣYΊΰ/ΥΡcκΐ\"\0κΈ4ψΙF7'\nΥ0έΙ`U£Tω€?MPΤΐΣl΅Θ4Σr( ΄ΑZΏ|&©t\"I΅ΏΦΫL w+m}
§χWi\r>ΦU__uΕχ63ίy[’8΅T-χΩVΟ}€xγτ_~θ%ψ7Ωί{jMαo_EωχΨΣλ~]τP\$ίJυCaXG9\0007Ε5σA#α\0.ΐδ\rΛ΄_Φ’αΐίΪ%ώαΐΐ\n\r#ο|Bι9ξ «Θξ:Nύρ\$θιS₯ CB:j6ξήιΰΞJkuKπ_WΝ’ΓI =@Tvγ\n0^o
\\ΏΣ ?/Α&uκ.ήΨ_ζ\rξ₯Cζμ+Ϊψc~±JΈb6ΣόΨe\0ΝyσΡ‘\0wxκhΑ8j%SΐVH@N'\\Ϋ―ΖN₯`n\ruήnKθqUΓBι+νf>G°\rΈ»=@G€Εδdη\nγ)¬ΠFOΕ hΚ·ΓfCΙ
X|I
]ζπ3auyΰUi^β9yΦ\no^rt\r8ΐΝ#σξΨβN VΘβY;Κc*β%Vΰ<#Ψh9r \rxcβv(\raα¨ζ(xja‘`gΈ0ηVΜΌ°ΏQ©x(ΗλΐglΥ°{Ζgh`sW<Kj°'Ώ;)°Gnq\$¨pζ+ΞΙ_ΙdψΆ^& ―DΒxΰ!bθvή!EjPV€' ββΑ(=ΟbΒ\r\"b¦έLΌ\0ΏΜbtα\n>J¬Τγ1;όωΌΦξΫΏ4^s¨QΑp`Φfr`7«xͺ»EΠ:Οσ`³1.ξΎ°;7σ@[Ρή>Ί6!‘*\$`²\0ΐζ`,ψΗΰέΑ@°ΰαε?Μm>>\0κLCΗΈρRΈΞn°/+½`;C£Υψ\0κ½*αYψhτμήΎ#Τ;γ΄ά3ΦΊ8ΰ5Η:ο\\ήο¨\0XH·Β
Ά«aώΈM1δ\\ζL[YC
£vN·\0+\0Τδt#ψ\$¬ΖΨΨΰ!@*©l¦ F»dhdέύωFΰ&ΖfσΉ)=¦0‘ 4
x\0004ED6KΝςδ’£±
\0ςnN¨];qΊ4sj-Κ=-8½κ\0ζsΗ¨ϋΉD§f5p4ΰι©Jθ^Φν'Σ[ϊωH^·NR FKwΌz’ άΠEΊαgF|!Θc©τδodbΑκωxί\0μ-εΰ6ί,Eν_νκ3uεp ΗΒ/εwz¨( ΨexRaΊHΌYωce5κ9d\0σ0@2@ΦYωfeyYΩcMΧΊhΩΓΦ[Ήez\rv\\0Αeφ\\ΉcΚξ[ΩueNY`εΫΞ]9hε§~^Yqe±¦]qe_|6!ήσuο`fΥξJζ{θ7ΈΊM{ΆYΩ©ψjeΖΜC»’S6\0DuasFL}Ί\$Θΰ(εMb
ΘΰΖ€,0BuΞ―
μ₯Ρ2φgxFΡ{aΈn:i\rPjύeΟρrΘrΨΟGύBY M+qοηiYdΛι`0ΐ,>6fo0ω©oσ ζXf’δω\0ΐVέL!«f
lα6 Ε/λζ£1e\0>kbfι\r!οufς<%δ(rΛωa& ύ¨ΰYή!‘ρmBg=@Π\rη; \rή5phI 9bm\$BYΛΔgxη#@QEOΗζm9Λ0\"Ίη!t¨κΛΈΠηO* Εε\0Βέ>%Φ\$ιoξrN&s9Ώf£4ηωgδ~jMωfwyθgyν\\`X1y5xω^zο_,& kΡζ’ι|‘ΐ¦1xηΟA6π \nξoθ»&xΩοgg{r
?η·ό-°½
|tδ3±ΘΝ}gHgK’9ΏΏ¨υJΐP+΅?~‘g6\r³φh’Όp«z(θWΩΔ`Β¨±\"y―ρΟ:ΠFadΕ¬6:ω‘fήi\0μέΨΰA;αe’°ΰμ¬η^ΚΦwf >yΝΛυ`-\rΪ
α\0hr\rΞr£8i\"_Ϊ ££Ό9‘CIΉfXΛ2¦\"ΝΕ’
ψh’L~\"φ
%V:!%xyθizygvxΪ]Ζ}qgΔΓZiδ|`Η+ _ϊgθςϊΩ£ΎϊͺΒΐΒθ6PAΚ\$Ά=9’ωΰΝh’|p ’ινθ!’.ψ!ώΆόiη§^ψΪiΛ’8zVCΜωφZ\"ζδΨ(Δ₯Ή°9θU)ϋ₯!DgU\0ΓjγΏ?`Ηπ4γLTo@B€§ϊNa{Γrη:\nΜE»8Γ¦&=κE¨*Z:\n?¨g’θΜ£h’υ. Nώ5(ShΡτi2Φ*cfύ@Ρή7¦z\"α|ΦϊrP.ΗΚL8T'ΏΈk’ί:(Ήq2&ΖED±2~ΏΨ±ώ¬Γ9ϋΒv£©Ό8© @ϊι^X=X`ͺqZΊΠQ«Φ`9jψ5^Ήε@η«ΈΞnΌqv±α¨3±ΪΗθ(I6πͺjdT±ΪΒ\\ 3’,Οhιk’3ϊ(λ3¬PuVΟ|\0ο§Uβk;’ΜJQΆγ ι. Ϊ :J\r1κnμBI\r\0Ι¬h@Ό?N±\nshε\"λς;¦r~7O§\$ ϊ(γ5€RΕθΖ θΚ½jΒξΨFYF ά£«~xήΎ©f Ί\"γvΫoλΛ¨ΊΊΒΊ#άaθυΆPΛ<γαh£-3ιΊ/Gxυ²nΗi@\"G
?σ€,οZpΦxX`v¦4XΖυσΰϋ[IΆ7Γ₯Xc ξΕ!‘bη’}Ϊj_Ύ₯9α5qti¦6f»°ΈέΩ5ϋη FΖΉγiΡ±©pX'ψ2‘r0ΖΖΊι§D,#GλU2ΜΨβIθ\rl(£ μ±£¦¨=ΠAΈaμ©³-8dbSώϋυ4~τH;°Β0ΰ6Ηbι{ͺήΊRζθΓs3zλ―ΓΐόNπή`ΖΛ+ς¦ 4<ψ^ay°¬ }r°Ββy΄υγαϋΈk&4@Α?~ΤδΕcE΄ΒΘ@LS@ιz^qqN¦°
xξω5£==¦2». γ|Ώ'¨ξδ[Μ';όΪv½ω«ΈχΞλΞ;:SA Ί&Π[£meκγn±λϊϋͺξ«Λ΅¦Δ<Ί6ma=Y.η₯ΐΕ:gΆΤώΙθ
ω°Π;«Iί»xΕ[ιI‘J\0χ~ΒzaYνΊξόwT\\`νV\nΖ~P)ιzJΎ©ζ½όρπQ@έΰ[Ά{rΚ΅DξBvο|i-ΉEζψK;^n»{κσ½ε:Nh;Ϊ2Α¨ΖpηΡ΄6ϊ»η½9§9‘₯φΦXΒhQ~ΫΫiA@D j₯ξ}ΡozLVχοηΡ³~ω 8B?β#F}FΎTdλ»αΠe±ΓzcξηFΕΐg7ΞΫκΰ 6ύ#.EΒ£ΌαΐΦΒ£₯πS£.J3₯φ5»―KΙ₯σJ§Έ;€n5ΎΎ:ySοΐCΫvoΥ½.{ρπ d\\0λ?W\0!)π'ϋΌθEgα;ΰ+»\0όY Ntbp+ΐcψώ£\0©B=\"ωcTρ:B±Α€ϊcποώξΖοΈPIάΘDΈΒV0ΚΗ!ROlON~aFώ|%ΙίΊ³Έ¬
ς)OωΏ Wμo΄ϋQπw¨Θ:Ωlι0h@:«ΐΦ
8ξQ£&[ΐnηΉFοΫp,Γ¦ε@ΊJTφw°9½(ώ<ι{ΓΖO\rρ ₯ΰωΪ\$m
/HnP\$o^U‘Μ\"»Ώγ{Δ
<.ξη‘n₯q8\rΥ\0;³n£ΔήΤΫπη‘+Ξή³3’Όn{ΓD\$7¬,Ez7\0
l!{ι8χαΆx°.s8PAΉFxΫrπΔΣτQΫΉ1Μ
Έp+@ΨdΤή9OP5ΌlKΒ/Ύ·Ύ\\mζϊΈΔsq» ξvΊQν/§ά !»ΆεzΌ7ΎoΏEΗ:qΰV 5?G‘HOβO\$όlΎ+β,ς\r;γη°Ύ€~ΞAΔι³ι{Θ`7|ΔΔΰλr'°Ji\rc+’|#+<&Ή’»^ςPπ&nΒJhΠe%dΆζμθΟάCiΆzXΓA'DΝ>ΙΞ‘Ek£Κ¬@©Bςw(.Ύ\n99Aκ―hNζcξkNΎd`£ΠΒp`Βς°%2φ¦½3HΛb2&¨< 9€R(ςΐtαTH¬ ΰzΦ'Χ oςΐ>4?Τ\rZΜwΚΣδΧ4`ΊΘΠι΅³NριΣξ'-IυΘμχ0(S¨rΨw,όΉΠεΛKΚrΝΜ'-2Hlo-ΑUςαΛβ_'W#'/όΙHΦ€j6Μ‘‘ΙΰΘ«Ά\0ι<Ϊϊj1€EQTάTΖrΑBcmν16γΝgΩ«:w6Ν―h@1ΕI:€ΓΑΙώ2σpςL/ΞΑΒw:ςΕΣΞψK<πΜE<ώJ76ΣsΧ.Μ²sZσί/\$χAsEyΟΰrΪr:w?Υ!Ο?³ακΗΠZMΝ9»Υ\0ΟΑ1?ARΝ¦%Π7>ΦMΗARr}sιρr)\\t-8=³φΝΛΠUύΛ,WOCsΥΠ#w½5α―ERlM*―D³η1ϋΡ>]ΟΐgK€²VΉ\nά\\θάΣsά8ΝΉseΝ§9soΞ~ μσw4xΰρf@ΧΠάDφ9ΞΚ6¬\0 @.©ξ²@΄9\0C;Kτy+ΣJπάΩ₯Οu<\\ϋ`ςc{Σ€E£>yΑJ=lόοα/
-7ώΠZ46¨uC5PηΞ©΄RVΠςζ‘άαΠύΚ³lVψaNxϋ`Υ΄?UΫ7(HP}jVΨJλzNQJχSΈ±s-gQ!a₯VΨ_SwRύOυ3amZXwZΝo'έwaΦOΨoZ΅υ!Ω[\n<τZ΅O₯Ά'ΗΕOmoχ[ΧΣa=QΊδ>:υTΠ\n΅¨η\0=ύmΧjϊATΓRΕbu(ΘIΧ΄θ:εΧ\$vΎWυΧ΅ΓπuΕSΏ\\V8Ψηvη\\υΧg!MΠΆ¦uΕΦ_΅&ΦisΏ\\CRVM’]tXT7\\UoTΧΨo_Τ―έS?aΤlΘSΨ-LutZGeΗΥαi` }XZi}QyW[i
TφYo¦ (ZE\\¨}nΩifΪΩΟWΧdΡ%Tύpu3uΝTύf5)vΫ]ΥUR3VEY]₯XΈ\n·^½§VqS½Sύ}XιiGfΪv>Sύv»JMQvΪ
ΤΩ\\g]΄QYEΞέ΅#1Vl5UΨEK]ΥΙ\0³ΨέSύU?\\ΊBwSU7΄ΥmZ½V5\\υΉWfύΒΥ§[₯eUrυ{G\\΅ύU΅Ϊ,ΙφW
[]xφVΧj5mTοVΧjέ~u7Ψ\0ϋV¦U΅Ψ'tύ°w?msέΥΤΙΫ5VέΓvέq}Ωφαέu-UqΥ]έc]ΪWέΨυ]Tt:νfMkΆe]ξΉ[-p}^ΤI[©XDγιΊεYΏVdυΐύO] seNυ£άίZ―WYΪ[Υt
ΘV?ς3ήΗ΅ίMφρέ`Πϋt^w£d²:qTL@@>]Αj\rFέqv΅έ-Lv΄GKwiτLwIPMoωΗΉMgv½ψ[§Uss¦~ θυ
w:BβAΡNEω{δ!-ΤΓdύo\0΄}&ήhXΥΞA5΅%Ω£fzLΦHΩ5d Y
_%
v΄Σ!m]ΦλΨΜ%όρίςώε=B©>E [#^}φhYFΫa·ίΖ>{‘gS
Άπp[μFχ¦ΟDaλ6nζ΄ΐΆx9«₯8LκIγ«Na=SΚ@ϊbPk¦.αNςψHωl\0ϊ:ΰπθξΊ2#ηΞ;ΌνvψO}9ik] &{υ ψ«ΥΩ2|a·&σγΤΗεήQ½₯ͺ±ΜξΞη¨)Ιρ΅oΩΗΈ:ι&.\0Ά5q\0JΠL½ι64hy3ή’«ΉaήωIzΑOρζο\"αΆyB»Κ³{ͺ3Ζ%5r(mΨΘΰΒαΗx.7rb%Αό^ eM»’2\0x½!b}.βY6\$qSΟ\"^|xE
δΘψaγώΌΐλXΗ‘59'TR Γc9ΔγθW’1ίαΡAΞPν¦Ψh6'ήoς-ΰΦΛp΅ΎT(\nn\rΛΕε1ΤRοRUgΫιΘώηx¨Pe#ξι*€βkT<<>b;\0ΑgL½.<k©ZvαΜψ―σz³ΆΖ8~¬πy7YΈοΘκά7w¨αOdn>€<ϊEι3¦wSΫ@Ύ‘λ oτWΕ1
ρϊρΎΊΏzγeνή½θ±ε1έzχ\0f=Ψωcγ€gΉ{ιή>np\0±ΝθΞ:HιBn6FθΖB―rηW=φγC>M.1~@3ΊGν98χqπΛΫ;MΑΛή ΝώώΓο6Sβξ·NΈΪ=#ρλλρ³±`όTό#+μnϋ;·r,Η½π¦ΟX|#οΔ\rό# οΓ?\nόD>¨|VόSρΏΒΪeΟ~Jγm99
αΎ\nsΖ{S|r],~ΛΉρψιΏ ΅qΟI?\"|wρ¦ψ%|j\0rEς,kSnό‘νηΏψqΖΘd8B.ϋρ1«Ρό³\"ί/|Ζ΄Ψ]ςόΈ·EόΟθN²lόΜΥΖxΦΛI°χΟ IcσΏΕΈ.|\$8DΉF¨έΜ
PΥKΖς3τ\\jΎ₯xUΟC/δγ³ΏA{ΉΐΠϋώeόΪΣζΧΆιάΎΥτΰ\rpύU\nηΥWloΒYβ{τγ`]'ΦώύsΥ/|ΌoοΧΰ3ηΐrό}φ;Ϊ[ΚnΞΉϋΊΏOνM7―ΫΙί£ΨΌqΎ΅q(ΟΠ_lβqsNχyςϋρΔηΥ;iΐgΏtΕΞ:ύεΘλΥ§qkΏντα{χί?zύΏχΟήϋκρMΘίoύμ'ΰjϊοαγcψyρίύγψgίgkwΙβf8ΌVcΤ7fAΜY³ε+Kxρ
=gKAkώT,95rdγ+ωGεΐΊνΩ―
ρώ[ΰ%
AΕwζ΅ϊ
½ε7ωίεΰ¬
£%· {½mνϊ8%_ώmϊqΰVΛΛ¨_ ώ%«!ώEϊΌiψ~ω²h ϊ~»Cͺί~§ω¨%΅η_¨ώΩϊε·rLkD«yΜϊπ~Τ?p1O!?ΏvΜ\\οδ±Pm©\"ΈΜ<ϋ―οΕϊE©6
δEVπ³εΞρzkξΗϊ¦9³zΙͺίΠ~Κ/μδΥΊ¬ι!Q> O£εNmθπ3rη Fϊlϊe;€Mγί·
ΊΟ½_a ΄!~C»ΌfϊεΌb}3 KΌfψάν. Ωδ}.©ώ»DX i5Ώ|ϊ?πΐ=\0υ±?ο?»ψ?£ή@Γ£½fu~a^Ψnϋαͺy±Q;ο qΉΜΰώ)sS½,\"G\nu%ΚΗUYοAKl\nΣλBΨIΚ86VCcO\0Φ`}.x©ξ,-Nα@~ΊθTGηό'όΔdΫJχΖy1zlα½Γ¦fχgυ·ωAB aυ!ώM\\<gΚύz4ΖΏμά@/³ήCάΓμ@υ ―Qqχ)€ϋxδΑ/Γ.7inD±#=ΐ *79cΒF²ΛΡd2(Ά .ΐVΐ3΅ΏωΪ\$g`Aα§rl|ψm²Άb§/―qE²ΥΓ΄!bU@Ώ9iβ;ppΚdννΫΧ€=π1ωyx°x =v=ψ(v±ο¬s_³BoςΙγΦ#ΰK\r nρξΘ\\# ΫfPXΠu-3&« ½J&,FΚ(9Άv΄0Α&@khZςyΆgξCΤz ΑΓγ¦hi=‘s9TρΒ eT>gΒ3λdήtFϋφ2b&:Ύπ\0ΠP‘χB-ΉQΛΊ8~ΤLSΖMΰΪ·cgΠΞπTh'ςf(Ρ³Π\$¨.E«§VLΐ°·AύIΌγΓίρΉΌrβ¦γκgΫ\rάΩγ0§ΆλTλΞ1P`1dΤβτΥΔ\r¦4βΑΪ=6@FόΑΌΘ F±Μρ=ΏΙ6ΟAΎΒ>εN₯AVί θΩΪ(\$ΞA/¦·ΨΪυ¦;¦ηΪ?Ύgf^ ¬\nθ&πKO³Ζn{]υΠgΛΞ8εc¬Ρ²Ο·ήύ³\nΘ7LΠΆt:Ρ ³hF°VO\r³θJϊ)b(\"OBΜm° oΨί\$]TSHΞZ^½υK©δwπ\\[A9('ΩcΫβάΰb0ΨΩΔ Kΰ£εΰ²srBx\nθ*BaΖz6o\ry&tX1p'^M·Ή<βCgΉ`Μ4Γ8GHυzd?gX.@,7wΓοΫ:+TiUX16ΰLΈάs:\rLθ6Α±fr\r`γtΰ67~g°xgH9γJΐΏO=-\$π4?rΩͺ4½¨‘Oϋθ:z¦§{ΘώD`σ¨Π21Fά΅£Π(DςMΣΚ;₯Ί½ρ&‘ΝΜ©ΤΪΎU>ΞI6cέΔςίΈ@\r//ΈΆΤύσ_Hΐ\n7zλ Άό7ςaξ Ι»[9D’'όΏμ}BORτέΈB#sΌ]z!(DΐΕ@L^ύ ϋ³x£έ@oαΏuOδοΑ₯DΈΟά!e`\na³k>΄0`αΜ-* 8EZ6=fΜι%‘έΧcγ°K=£ς€F\rΚ
ΒShθyNς[v*vα\rΑδδ@#ίΈνͺAh*γL\$°ΐ±AΐA\\’ϊΣ%Α* Δηp\r*==8μ\$Wξ\r [±Jx0yρΫZΓ+&YΩHA~A\n,\\(Φμp€!FΆκΪ<6SΨ&IP`6Xzό+ν£dfή\rΎΟJΒ£ήΜiλsγ+&5Όε/rE
ΐ£M^\$R(RQΜEw3τlH*m\0Bq¬a―rθκLBͺ₯QΉz6~lΛωB\rIΒGψζXΩΈXVbs‘mB·HͺΧσσcξ_Kη\$pζ-:8Nj:ΒΡ
‘-#’Fε \0aiBΖs\\)Ξ<.!Ζέ\\ίNbIw8§ΝΉt
ψPjWδ¨`Άy\0μέ&0i?‘Γ:«Ia)=C,a&ΊMapΖ\$έIIFcζη\0!YΔxa)~―C1PZL3TΈjέC\0y€`\\ΖWΒό\\t\$€2΅\nζ+a€\0aKbθνΞ\n]ΰC@Ί?I\rΠHγKs%ΟN©παΛ^°ΟΤ9CL/=%Ϋ¨υhΙΖ:?&PώμEY>5’νn[GΩΧ%Vΰα»*τw<₯ωΥgJΈ]Ί*ιwd]ήB5^σΦ’OQ>%s{½Τ
η«;μWφ³ΦzΒGiύΐ*»ωRnμΡG9ΠE°’ή,(u*°±ΥΓXΥs«ΰR¦¦:΅5λ;ζ)°RΆ¦ΝNϊΘvKΨ(R³έM’ΗbπξΤι©_{ΥF<<3ͺ:%ΊΩHVλYS\nα%L+{o.>Z(΄Qk’ΦΒN«!Γμ,:rH}nRNkI ͺ[ς΄ΜλΣ§gΞΞΦ€;mY³g%ρ9V~-J_³ρg²©Λ\\Ι£Q\n!υt«\\UY-tZn¨‘d:B΅°Κ½ά*ν]')t²₯wΑωΙ«[BUm*Ϊr4ΨΥ*yv’ΆΑvZΐΥΉ+GHΞεZn°PΒά
|\nT₯ %#\\·AX\0}5b+wr«Xwά²1uωΧ%Cg=Iςv`creΛ0`..<·κπh+HΜ^\\jyFςέ%Κ]ΉBΚ\0ΙrΕ+> %ZxΉ ζ%C.ͺΓμΔ`Vn1KSΎ₯Ξk\rυηX|΄υ[Μ;υ6H U@©D:ή»Mj ΞΫΚ?ύͺ]Ϊ€ΨbA+ΤΕG£\0thxbώΖL`Εΐ64MήΔτY#ΊhfD=eΨw=΄c+H
ρ‘‘:.%ό^\$ςDZrAzjfLl7o¬ύ°Ϋ\0¨-δά³Edδήyz'V Σ―W΄ Zφ§K+°d(AΜfyήP?xR^hυ
Έ'ζΰA\0―:p\rd(V±ά½dφt SξFcHΘΉ]r’rΚCHY X_Ί/fέΝ½ 4 7eΪ6D³{,ΡθώκΨ<Π€{E9ά&ΰGhh{(ύ±Agg8 (@ήjTϋnΛgZγΩΕ°ΑJΑ³x¦όΌ@icΆΰΥτ(p'oJ0MnΔν&Κ§³\r'\0Υψ\rqΡFθ4½°)ύ½cL§ώ_ΐoJΪ}5οΪco¨ΰΰ|6mΎ}Qͺ£α4QλΗb·΅[ϊx«m( έ&΅@δ;Β+ς₯ΪΕf|IΞΰυRΠ48
{ `ψθηk`u»r`θWγΈ±`\"΄)fI\n©Τ;ς8ZjΝgπ~‘AΞθ!jΌΔ%ΔζT ΒE\\―\r3Ejjκ’FXZ βΟAyζkH ΨXdπgCQ±΄αΞώ0πdό²¨°οϋ‘ϊt¨ Ηzkΐ`@\0001\0nψηHΈΐ\04\0g&.\0ΐϊ\0O(³ΘP@\r’θEΔ\0l\0ΰ°X» \rβζEδΗ8ΐx»₯@ΕΤΦ\0ΐ€^»±z@Eπζ\0ή.€^¨ΈQq\"ιΕΰζYδΒD_p&β3\0mZ.Ppΰ\rEΟχsρv\"ιΕαη0΄`ψΏwβρΖ,σόΌ_Ό`\rcΕβφ/Τ]xΈq3\0qΞ.pΒqβπ\0002_μ³iΔΡ’βEΖ\0aή1δbΐΡwJ \0l\0Ξ1,`Ί1y\09#?0T^ΨΗq£\$F6/\$d¨ΈFDyJ0b»\0 ͺΖWΎ\0ζ.cΈΒ{c EΨ\0s3l]@\rbωF\"\0Β2τ`Α\"ρ7΅Ξ/ΰ\0±’θΕΣa ^04e¨ΊQ{c<ΕΡΙj/_ΑΡc\0001΅*28BAΰγ\0000xΖiΨΎ1£F50ljHΈ\"ιF30\\_Ύq\0Ζf‘T³l_0Ρ£BEΔ#3μ]ψρsΖ½Σ64_Xΐ1\0Ζ½ρΰd`ψΧ`\r£SΖ_JMV/f±1\0005I6tf°γ4FͺΑΆ34fΰ γF-ί6d±\"χ4k½\$h¨Β± #EΕΜϊ\0Φ6€_01c@Fαͺ/d]XΧQ£#G\nχ5¬gΉqγEF\nm\\ΒDnΕq½£YFv1/4`ψΰq½γ4=β8bΧq|ΐ\00043ΔmXΑ1£eφ\0Εξ.¬\\θΰQcIΖ ·.7ό\\xΦ`\"νΖ\0i^3π(η±ΐΖ\"Ev4l_ΘΘq\$Fρ±ΰoΘΎ \r#UEδ©^9όtΑΉ’οΖ.\0ή3|rΘΔ1Ώ\0Ζφω69l^xΉΡΌPF-]\n0ΤvβQy\"νG³2,sxΑQq#F+\0Ω/DiΘλq}£ΐΗ8[6,jψ»\0cmΗoΧN5ΌehΰQv£«GLH3\$tyQ£
ΙECl`9)€VFHMJ7fψφΔ\$HHQ ;όri7#F³-F€HΖQχ#\0G·!1δ^Θώ&4€vG&ϋ7Τgθΰ±\$\0G\rr/ΔdΩR€(Ζγs6@€Ω'RAγΗ¬Θω&’€Ηg\0k z=΄|HΩ±ΙγΕΰΙ^J΄]ΐΡsd€Η,\$1¨ΰ-ͺ3τ|©2\$ύ0= β:xcHΛI\"NP\$bΈΫQρ\$Fρ DΔζΡοδ}Fκ%ͺ?δ(ξ£κΙG3\$O\$^xΒ2T’ιΖρΥ0‘πRΜ#ΘD:ςE€|i/2£XG8¬Ή-ω\$HΙv₯Φ=d θ€Η`ω:laxδΡϊ’πI¦’:μXβRJ€ρRΜmxκJ#\nGG9!N¨δ{cIυΣ&ζI¬ ιR=£I\rω&j:δ8Γg#ΈHα'3_xΈ²b€H}£>7θθρcΜΗΩ\"&K‘\$ΥΡ«erΞ±‘p\nΕΥΌΛ\$es+ξV£IΊΗb«ψeq:ί#]cc7r\nΩf,gYψ³TC²%ρ Τ}Λ\0²©\\*μEWPζaθ:ΟE₯,&WςΖp)Ε¦Λxl²MαΒΔ3\0t\0¦/IipρD'\0 k\$T€¬F€]fΊΝdMςΘK\$ΌύH(@ξΙ»(z΅nW€Ω_Mέ*Ί\0¦eΩlF^H W*BZPe½ΕΦΣR/dRΒRΚ
\0Ku£,yH)Ά\"SΚXI'ΉZ=ηLψRε3εΔ\nΐ'[kπΝ6@;}RνύI²ς³τ¬_ι) wκ[σΐ ϋ\nί΄nͺΌΚbBrΈl,\$vΦνΝέΤ°ΐΥH©ΰ
\\’Ωs*Θ Ίε.QtB
Ίdb½@ο?3ΌS`a@€Kͺ\\.«΄ΰ~Ηfͺ)¬«¨ο,?|&ΣΆKΐ£
Z9.έX³+Sβ|ΐΨ\0PΚΌ’Eςηe/Κ\0VλΦ^KΔ\0\n- :ΛΙSΨ²)Χͺϋ0j9TXεBπ½K\"εΕ―±Β²,2Ζ'2ΛεΦP,‘xτΰpΐΠαKκͺ΄υ\"ΚD’#TV²DΏυ1ρAo;ΨΧ/9TH%V`WJ<9―aeΚ° K/V^/¨Q€Ψ\nBρZ\"9νΛΖX―M~\$°5ίΪ\$0dθ½IUΝ³2Ό^X\nΌ*γE7I\nV3«
+ΞaΓIiNΛKKg0a°z*V©Ί#bJyM¦eυβZ
V ’`ΠςΠU1ΛC.\rF²ͺ-jΞ&LUp§9sιΉ+Q&1¨βRm₯ΥΣ±gZͺ² ,.XryZμ²°0¨Οά3¬2A1©ΦeNϋ©Έϊ²(?Al ήΜ,Nθue²Ο\$|rωα_%²ρE05E}³\$‘ά
X2«%ΪZͺe \n\";<9aΎhγΆ₯ΰa]ϊΚμ8±ΰ*ιu―εΑͺL₯¦Ά±dRΏπ0«ΈΑͺ+ήQm.ό,Gω«¦Mο_±2εedBκΝέΈ,°S
2Α²>UΥκλΤ°»4vlλ~e2©ς2€eΔ΅ΛYg2nf=ΐώ\$%σΜΩFfaμ΅)κ§εΜfTΖΆαG€ΝΧg2ΊW,[νΚX>)tΚA]ΊR*Ί&Z·Ε6j2|₯\0 °(©p κ9Χ Μωuͺτ?τΠ`nε-lZnλ!H9²ηζzLπ’9VLΟΉyΠέ’ZΨJhRgEfL©U²~`4ΝYηζx)\$B±QR#ΓSκ₯ΛΛυ,6i#ΐY¦,;C±r¬βiΩ&ΗXͺϋ]θΝ\nw54Kx\n*&©T£ξWόΣω¦©+SΠ»qNc·yσIWδ―Ϋ\0W5cΤΙ«π&+ΆπVrε)¬κΞ£KgͺΎΤ? ΅₯|«gR¦―hR΄%KλΉ)Z#5δ,Φ΅k
ζΌ»`μl:ΰLsC[MUB©6ldΡΡJ¦°ͺο1nl:Ίωj¦ΛLί’\0hγΆ *)₯p/ή§5\\<9΄σV¦
/ή«hTΗdj΅εrMbx\n]RΉηWͺR MaU΅3=Χ΅`0³oΘΛ,Z¬³lΐΕ}Θσ¦m¨μν²lτΞ΄ΥmLεS6κ\\tΞΉςΊθLξΙ\\Ο%JΆKερ7oΡ©€efM£oC»Y‘vζ
NVΓ4=RΡ’sJέΙΝφ¬Ά*hΤΥιhnδζ-mι4ί4ΰy€σHρMϋ|ξΚis¬U=έΪΝA\$ΪςiΉΟΎ
φΝ>κξΚpβΌpϋσQfψ«ξΐ§ͺq,ΤΥ5sULω£8}έ¬ΕΩͺχ#ΓXH±ΩέμίI««ξ§Ό9U΅8νc:³I»ξνf΄ͺΠ±7klδ5}ΠχfΉLYπ¬αN2ή°σ}&½ iκρc,εIΉ3ΪΔR©6rδΨΜ3b¦ϋΝΗ6>lXYΏϋfύL)+ΩS,ΩΜ*ωelΝτU\"edζΊ\"ZηͺΪ6ZDίE9°α%ΘΞY9rmtγEΠσ'.M²[4¬^εΙ·λ;M»wΩ5
ΧΝ9Έσa¬¦v+70lΝΙΣΣd%£Μ<ω3_<ιlN²¦(v+7YRlΞ
Σͺ].Υ4©I³)Ό³=ΦNT]ΫΉ'U^Σ?ηS«Ό½7ΎXCΕ©Σ¨Υ1ΝuΉ9©E΄ί²kηL;€NhΜμΐSέqNXk;1[υΣLgpVBξ1_€α₯ΞΕgs¬ ;RlξΥEΧίNπTΗ8φw,ξιΕs―1ΝPxrλqκί3¦¬(ͺ;ρZΪύ yΣΎ'{O _΄ΎκrοΘͺMg|ΞIσ92eLηΚσfΌO\rYnkάεuSNΙv9Vkβ Λ3Η§.Μv9zydζ)α¦ΘNΠYμ&s\$μωΝjd'6ΝQ<ΝVάη)θeη+Ο§:ΡΨ¬κYjt₯‘Γpu<±έΚΙί3’]qM°Y:9Xγ΅S³ΎgI«Γ*ΏmδΖΔCλωύv GίμάR@ΐΦ―¬jT=¨:e Ϋΐ(\0_Vn©,?p 3ή'Ξ Έ¨Ψο\r¬Όφ|\"ήiπΊgTnώPη€°\nΣεq,ΫSfΈ.YΠ΅Q AΌA,ZΚΪeSεsEΐμ\rϊvT¬QZ©\"pσ²IσsλUAΟ\0ΎλvZΈ}rΩ₯KtfιPδf9ηΈ{ΌΆ^JηίΟΏψ©\n0%«NGΪ«*~lόD.»¦ΞKeΉ6’[,Τ%ΐπOΥΙ-~μ΅σϊ₯jRO;ϊ@ Λ¨enb_Ύ%sKΏΕλΓοYζΊΞYΡ0ό₯ΓLΛWͺ¦jrίΥσθΟ λ©!BΩρζPv΄£fwΪ«ΙψηγMΓR2΄2z4rϊh;#M@
}
\0|λγ¨MΓ\0
=Ϊ=ε‘ΰf-!6pΚ g[P4΄ΜμσCΪ[5:\r΅Ct¨ΝΓ u@ύΫΊ<ιδifΠNuΌn[ρ!u8j{&9Ku FQlRiΐ(ΛC ΗAδs4λ\0Y Ν;fB<Τ{εΌR_I~
6τΧ|MWTAν]4χe@JeΙP|[ϊ¨r5*ΑOΞ νBt½)€κ―%Π-\0Pͺjm usα§}ΠBi^©Ϊ*¦zΠ0YK.ω`[―Yϋ2νΦΠ«|°XBΡΕΑΣΑ(?Π±.\$lΌ³,ζΞXΆDηΝ\nκλjζ‘OD ->_<Ό₯ΥΦΩ\0£ΩΥ¬₯Αsψh\\
‘ea\\Σ\0ΚφeδY΅`Ό₯΄7UΨ\"e‘ΗCYTμρΩzt:V9P_³
aΠFΤ;έ\0M’΄
2eϊλHCιΠσZ?ξVςΌε'Χ¬εδ³}cΎYόaυθ¬εύ?Qh8 π΄0QCM`Ί«σ6ζψ,’JeZΎZ\"GWͺ‘uu\rΥ>49θKύπI%LΉΝέV9ΟόέΦ΄ψZλ{VEOΔX;©αΡΟΠoΰagPΒ\$\n²RX@}!-SiςRͺΎ’qzΦ φκITH.‘Τν\nk\nο \ndΟTΊ²>Π\nξΒ ?£E
`²Μ5D+f?#z³
IZό7T[¨Qs#ωD\$«ΥΟPω’μI ϋ3ΎΧ*Ό:έ9YI²γH³ΤH¬X«0εD!u7JΈm YB}Eͺ°³Ώη’ςr8Qω\n}'PυSβ² Q±Πυαϊ¨°\$§Ε`RΗ)^αυ(OP\0aK½΅υτmθ3¬\$H.ωXλρΤη)ΠV`Ϊ9 ¨.Y18βΪeUΑ`Xη9΄ πδη\\Lcj°IE Nι«ͺ¦6W‘D¦XBΨ Z:|Ο€: E-P-Ϊ&ΞΑθΏ)ϊπ§*ΣϊΤlΐ)PΒuy|R°³Lh.p€§ι_* QA @ ·?,Ζ§κYκΦ)tΡ<νΑP*κεάjVuQώ:2\0LΈ?JληθΡ,TPHL²ΑϊE%¬\0ͺ’yP(YJZ₯ξ©ϊTHΕX\r Q4hO;\\vVυ#εΐTWwο\\`υO‘Ε«?JR2³ς=υFσβ]»ΠI5TMjIλ9ι,(Ζ€Dv|tΙ)Wy-¦]z¨Ϊea,pQ6\$λI-g=%SΤW#νTP§ά€Ι)«T&]ήΡυX15jB8ζVΟΣ₯\nμem yh*θ€ό»°dη4Ο·bd!0€gRJ\\Ν ΦMtΐ1R\n\nοβxθ‘θάΑͺ.φ_Ύόuς+ΖΌΗ;ύ*4ΞΈ)]ΐ\\‘lά(m\"ρQnT(*\0¬`π1Hμ@2 6hΰκYΐcH_ΜΪΘfπ?°Πa«7=KKdeΒtχHΰΐ2\0/\0
62@b~Λ`·\0.\0ΌvΩ) !~ΊJPΔTΑ½τ½
΅₯σΒΪO{tΎΎ\0005¦Ύ/ΰ―\r©ΑJ^π½0Ϊa!Ά)8¦%KήPP4Ει~ΣHαχΠΕτΌάν\r+¦Lb₯/24)Σ¦GKκe0eΛιS1¦B¨ -0jfΤΔιS¦wLΞΔiκd
ι Σ¦LΊ\r1ΊhτΘ©S ¦MJJΚhtΎ)¨Σ+?LΆe5nΣι|FHΙMNυ5κjΤΙ©SHΥLε4Ι=TΨι΄ΣDΥMn½6Zm@I@S`¦)'ͺΥ7fςz©Sz¦x~OU1kΏ€υSF¦ύMOU4ͺpτΩ£2\0000¦μΎ7
6kΡ#xSl§'Kβ7
7\nlΝγxSu§LR7
7stίγxS}§GM7
8*qtΣ#xS§OM\"7
8ͺuτλ)ΖΣ\0Ώ9ϊr)ΛSr¦2ύ; τπ)ήΣ7§Njm/xη©ΥΣΏ¦sNΪ:jy4Ώ©ΰSͺ§gO:1ύ=\ncTφ©§SΝ§;κ{ρ₯©ξSΘ§/ORH\r=ΚtTτιIέ§₯O€\\zx4χ©Sς§Mώ>j|TύiΊSΆ³OΌ~τΠ\$lΣϊ¨Oφ}tόΘΩ§ίOξ€zΤϋ*%§]PPόvU\"ϊΣέ§―Kβ ν@\noυjΣH¨;P‘>1£ιFd¨P.5BΨΈͺ\rΤ¨3uBΉ<΅L#Τ<¨QPECΚu*\nΕΫ¨yPN‘΄lͺυ\r6Σσ¨?Kϊ’mBZijΣH¨O2’}1J΅ιΤM¨_Mώ’mDκ&ΤK¨ΗQ6‘Fzv΄π6ΣΉ§ιQjε;j΅j)Τ*¨ήΎ£mEΚͺ9Fd¨ΕQv5eGΨΙ΅d€Τ¨EM\0+εDκ\"j)SD©Q€pZf΅ιΖ§mR&’ύHUΫ%§{Rv0m0z₯δ§LΖ₯@ϊ'ΦΤ©ERΆ?eJχ>ιΈΤ¨έM₯΅Iϊ²ͺYT¦ΫRυ/₯BΚ.κUT»©YRΞ‘L:jNΤ
©R‘έLϊ5ji&,Oκ¦mJDί5,γ9Τΐ©Q¦©Νθ1κhTf©NΘΡή₯Q'©Ξ7Ύ§LihΈ²\rcjΤSz§u\0nγΤΊ©gΆ§Ψ9Υ@cΥ\rT§%LΕΥAͺfTMT9uQ\nΥ)’ηU©΅SΊ¨uD:±jU ©Ζ¨
PΪq*EΪͺKSb₯l\\Ϊ€΅FͺΤΕͺGTz§gJ€΅HͺSFͺ \"©½Q:1κΥ©;©½RꦡL*~EίͺoT¦\\z ͺ₯Υ:©βͺ]Sκ±ͺ₯ΥBͺU¨^J©uR*kEυͺ ͺύTκQtκ―ΥR©g2ͺύUj«΅V\$ΕΥ_ͺΉS³mPHΖU\\ͺ±Tό[UΚ«5JhΩ΅\\ͺ΅UpͺΩ’«Vπ7a_*Σ«¬=R>\0I*Ό₯τV«νX:hU8jΙTζKZ¬\\:Υ)jΗT·«8± εWZ³UbςJ8«R=Y³UVU«R¬€\\:Υ-jΛΤΡ«iV.¦₯[z΄±ͺΒΗ-«{T²ΕZͺuojΧU»«3 ‘Ν[ͺ±Υ>ͺΨΘ«E %\\Ί±΅h#bΥ
©WZ-\\ΊΈυCκζΥ«»W>¨]ΪΊg4#ΆΥΐ«KTrνZΚ€wjγΥ\$«z¬-Rj½υtjΠU*«ίW¬tp\nΎ4υπ'NMΊ΄²ͺxUώX32[xς+Λ\$B°US*½υqκUΝͺqXZ}SΚΒΥxκΑΥ@¬-W\n5έXZ¨Υ
ͺγΥJ«U2±=\\ϊͺλF+«ρV0]XXΑUͺμΦ0«¬-VJΉ²+Φ/«Ι±ΝZΚ5sjΉΦD«Uή²%bΨΙ΅ͺΑΗχ«V²%Y^u@d€Υ’WΠζΕ²Rk&ρYR¬\\€ΕRkΦY©cVΖO-\\ kdςΣαKoX²₯KΚΝ/λ9Φ]ΛVͺO-U<΅@έΙε¬₯VΞ³[υ«6UΉΒ=eΟ΅o«4TέYβ0eHΖΥ€ͺ\rΚΝ9«’¬6ΰ(σ+7ΞybΣrI §|Δ\0:FzπΙθ\n
§|ͺs<°R½%JΣΛΤ]¦υFθ΅3υj’Ξ£ΉY΅ZΎ^<5X·IJςΕM`ΧnO\\£B&ΆrυsΕηQuz¨’xΌεΉθ ¬T€VwΝJ5Έg Ο?v¨qF4ο9³Σ·»Υ6ͺzjωθΥOVΏ\rΞuΚ=Β@ΚfTΝποφy΄³ Φ«pKaXU9m²³
\nekMoΓ5\nhTήꦦ
V ¬vύ:Ρs\\p>ΑLΣ:¦)ρO=nk}j₯Sυ«&·Φͺ~΅€y©ΰe¬άίZΦ΅ρ)jΨtΧVR’V΅½s΅rΚ:+aΝo,!TύlUΟή*n5ΎΆ\\πUχdv+M\\)]BΆ|ρJ봦l;4―5φpLΦωΣ΅Ψ¦7Liύ[~bmtΙζSe\"»°BΊ½v©΄dη@Ν§SΑ4)ΨZοΌ»\$)ρ5ic!΅΄’½Ξκξ\\Rω*ίSD¦Ξw\$9ζtSΑ\nαGfςPΤΖξΚΈ΄ίΪγ*¦ KΝτD·VyϋΉ5ΝuΘ¦JΧ\\΅CΉ\$ΩW,―M\\Ί»τεΚζ5¬λΣk^VΥsθ5k‘Φ»―M^κ΅ύ{ΐu°§Ο€wFQΰίJιHϋgWN‘k8ώΊΝτΚ+Έ»§₯1brΔνωΛΨλΣVάX]dLηjν΄YTΞvη6twyΛήkςΧλΰ«vx=
5ΰh»²ο½τ8]ΚΑρΛ·x\"c|ΠufUώΨ\0§5ήjΘ©}PknΜRlΎfΩͺΰ+ςΡΫ£’>c4ΖΧW+TύDoο Ηχqξ―ΙSX¨έb}}Εhn΅&<Ο?/3Ί-Γ‘h°©qnύ§ υp%)SΙyP\r
ΫΝ΅m-Οf5°Ί[\\=ΜTΰ}ψy )ύη Ydη«Ψ€46#Y>₯3ΤΧ m©ϊ\n09h;²4°Β0Γ+ίae\nΘΔ°Θ!ΚΕόΡ)@τx’x}\$¦ΦίύAFϊΓ²0Nφ Rγ Ί°ώΣθiά₯ό¬U¬?½‘b5ν!+Χ\0GύΨw{ΆξΣ€οlI £)w-4;p8ΒΞΨ€;@\r\n\r
ΪN5Ζ
F\\ΣΉhgPE il0¦λX¦%)\nΨLkΘ^Ζ2’έ<5FΨμdI<ρFΖj³bM¬d'α ΆΖ²D£βξBma²Πφ
ύOYρXggΌ8₯ηZVΨ%mf¬Τ%εF‘-₯,Ι\nύaω€FΗwfτsΉη¬Κ0GδΉΨZ²\n 1;Jν1Α\"iPρBΘy΄C¬Μϋ²tzΣγΡΦ;l4βΘ‘JmLX²+lαͺυ{Β8¬\"β\nΜVΑΐΔΫ(Ϊ\$Y\0νd\\έ6D9B΄H±d%¦Σξ1ΫΑ6f Ρ\"ΚTJΦΪ`/²>ΚC=Δc쨱Ό²?e!ύk*±3l~ΓΣi«,ΧAz/dਦMoμΕν΄Ϊ²nΡ\"Ι½ΝΒλΖzTr}eΩ{MΐaCΤ7fiTΊυΛ/6W’©P²μΦΜ8Fa`έμΎ5³σ©ΉM
f2V]['}cn4]h·νΦe«¦ZΕ§\r2ΙΘ½XllGa`(Ϋ(Δς\0θΔύΠ_φlOωf&fΔ1c8μD{ΌQζά S6φp\0δYΒζΉξ\0\rφq
3m&*fΞ;Μpς6r^cΟ³¨`Ι΅&zn^Ϊ±ω;DΘθSγ€oj^γ=ΏL'g5Δ&μδEf&ρήΟ|\nK 6?bX*¬.fΟEϋ~&9Ω!ηdk@v\"F¬Gx\\ι=ύE7οXP2[:ΑΆ\0Χΰ‘ X~¦½7·ΝβX64²Ι(Γ\";Bμ\nήύXΧΡhyΉΜ&DΦΫZΌl\nKCνpΨΔ`mS 2ΠU’;Gΰ8Ά΄{Ρ-±WBmμΈ\$Fψ\rΰl&BY2\r΄¨mAΕ°wΔZΨ6ΨRΠΏΠ%d΄έΒΪ_²Tτ5¦``BaΠΩG΄ΥcαXKφ\rΆ\0ΨgNΌω\\΄Ύ;Nΰ¨ΰΔΪs^\nΜu§δΏΡ²VwzΔU F\"\0T-±,^Ξ\0Ξφθ2 /ζ σΒΟΰEW/\0ΒΌςΔΎΛ4;\"μK-NZ½ΠMcΞ»RVNeZ¦wjΒ6λ―aΆχyΜΩη»KVlN?±Γjt2ΆT/[νN€ϋ±j|0t% #°βΡ\0τΣ`£ψ5F<΄ X@\nΣ’ΑνΛZF\\-mΌ³cd2Δp5GΊv'Bί'’7{k*'LάAͺZ|I±k΄\n-.C’6Ό«ΉΗk-―Χ©SΪϊ°χkΡ]―Λ_\$
Ϊ+GςΧ [^z]kΡΡ8\\φΏF|§’?BΨΑ^ΟB¨Μ|ρλ@ΒχB―₯zPιW/R?[!bBαΉkΐΡ ' (γe:xfΰr7\r_νβqΆMaκ\0#±δ7|ιQ&\0Ι@)΅τΐ1ςλLA[Ptΐ\0ύ`6Υ\\eΆzxΪSέvΥΟU:Ϊ±ΏTΌΑΟ>fΫ\nqlΕ+K(|Ά\\΄Ρ GUΨ³Ζ@(π*ΙiS%F¨\rR\$©CΆΆLΠέΔφ;Ιd΅μΔΌgλ-\$m?φlhΚ3?PͺY\0");}else{header("Content-Type: image/gif");switch($_GET["file"]){case"plus.gif":echo"GIF89a\0\0\0001ξξξ\0\0\0\0\0!ω\0\0\0,\0\0\0\0\0\0!©ΛνMρΜ*)Ύoϊ―) q‘e΅ξ#ΔςLΛ\0;";break;case"cross.gif":echo"GIF89a\0\0\0001ξξξ\0\0\0\0\0!ω\0\0\0,\0\0\0\0\0\0#©Λν#\naΦFo~yΓ._waα1η±JξGΒLΧ6]\0\0;";break;case"up.gif":echo"GIF89a\0\0\0001ξξξ\0\0\0\0\0!ω\0\0\0,\0\0\0\0\0\0 ©ΛνMQN\nο}τa8yaΕΆ\0Ης\0;";break;case"down.gif":echo"GIF89a\0\0\0001ξξξ\0\0\0\0\0!ω\0\0\0,\0\0\0\0\0\0 ©ΛνMρΜ*)Ύ[Wώ\\’ΗL&ΩΖΆ\0Ης\0;";break;case"arrow.gif":echo"GIF89a\0\n\0\0\0!ω\0\0\0,\0\0\0\0\0\n\0\0i±ͺΣ²ή»\0\0;";break;}}exit;}if($_GET["script"]=="version"){$nd=file_open_lock(get_temp_dir()."/adminer.version");if($nd)file_write_unlock($nd,serialize(array("signature"=>$_POST["signature"],"version"=>$_POST["version"])));exit;}global$b,$g,$m,$kc,$sc,$Bc,$n,$pd,$vd,$ba,$Vd,$y,$ca,$pe,$sf,$eg,$Jh,$_d,$qi,$wi,$U,$Ki,$ia;if(!$_SERVER["REQUEST_URI"])$_SERVER["REQUEST_URI"]=$_SERVER["ORIG_PATH_INFO"];if(!strpos($_SERVER["REQUEST_URI"],'?')&&$_SERVER["QUERY_STRING"]!="")$_SERVER["REQUEST_URI"].="?$_SERVER[QUERY_STRING]";if($_SERVER["HTTP_X_FORWARDED_PREFIX"])$_SERVER["REQUEST_URI"]=$_SERVER["HTTP_X_FORWARDED_PREFIX"].$_SERVER["REQUEST_URI"];$ba=($_SERVER["HTTPS"]&&strcasecmp($_SERVER["HTTPS"],"off"))||ini_bool("session.cookie_secure");@ini_set("session.use_trans_sid",false);if(!defined("SID")){session_cache_limiter("");session_name("adminer_sid");$Rf=array(0,preg_replace('~\?.*~','',$_SERVER["REQUEST_URI"]),"",$ba);if(version_compare(PHP_VERSION,'5.2.0')>=0)$Rf[]=true;call_user_func_array('session_set_cookie_params',$Rf);session_start();}remove_slashes(array(&$_GET,&$_POST,&$_COOKIE),$ad);if(function_exists("get_magic_quotes_runtime")&&get_magic_quotes_runtime())set_magic_quotes_runtime(false);@set_time_limit(0);@ini_set("zend.ze1_compatibility_mode",false);@ini_set("precision",15);$pe=array('en'=>'English','ar'=>'Ψ§ΩΨΉΨ±Ψ¨ΩΨ©','bg'=>'ΠΡΠ»Π³Π°ΡΡΠΊΠΈ','bn'=>'বাΰ¦ΰ¦²ΰ¦Ύ','bs'=>'Bosanski','ca'=>'CatalΓ ','cs'=>'ΔeΕ‘tina','da'=>'Dansk','de'=>'Deutsch','el'=>'Ξλληνικά','es'=>'EspaΓ±ol','et'=>'Eesti','fa'=>'ΩΨ§Ψ±Ψ³Ϋ','fi'=>'Suomi','fr'=>'FranΓ§ais','gl'=>'Galego','he'=>'Χ’ΧΧ¨ΧΧͺ','hu'=>'Magyar','id'=>'Bahasa Indonesia','it'=>'Italiano','ja'=>'ζ₯ζ¬θͺ','ka'=>'α₯αα αα£αα','ko'=>'νκ΅μ΄','lt'=>'LietuviΕ³','ms'=>'Bahasa Melayu','nl'=>'Nederlands','no'=>'Norsk','pl'=>'Polski','pt'=>'PortuguΓͺs','pt-br'=>'PortuguΓͺs (Brazil)','ro'=>'Limba RomΓ’nΔ','ru'=>'Π ΡΡΡΠΊΠΈΠΉ','sk'=>'SlovenΔina','sl'=>'Slovenski','sr'=>'Π‘ΡΠΏΡΠΊΠΈ','sv'=>'Svenska','ta'=>'ΰ€βΰΰΏΰ΄ΰ―','th'=>'ΰΈ ΰΈ²ΰΈ©ΰΈ²ΰΉΰΈΰΈ’','tr'=>'TΓΌrkΓ§e','uk'=>'Π£ΠΊΡΠ°ΡΠ½ΡΡΠΊΠ°','vi'=>'TiαΊΏng Viα»t','zh'=>'ηδ½δΈζ','zh-tw'=>'ηΉι«δΈζ',);function
-get_lang(){global$ca;return$ca;}function
-lang($v,$hf=null){if(is_string($v)){$hg=array_search($v,get_translations("en"));if($hg!==false)$v=$hg;}global$ca,$wi;$vi=($wi[$v]?$wi[$v]:$v);if(is_array($vi)){$hg=($hf==1?0:($ca=='cs'||$ca=='sk'?($hf&&$hf<5?1:2):($ca=='fr'?(!$hf?0:1):($ca=='pl'?($hf%10>1&&$hf%10<5&&$hf/10%10!=1?1:2):($ca=='sl'?($hf%100==1?0:($hf%100==2?1:($hf%100==3||$hf%100==4?2:3))):($ca=='lt'?($hf%10==1&&$hf%100!=11?0:($hf%10>1&&$hf/10%10!=1?1:2)):($ca=='bs'||$ca=='ru'||$ca=='sr'||$ca=='uk'?($hf%10==1&&$hf%100!=11?0:($hf%10>1&&$hf%10<5&&$hf/10%10!=1?1:2)):1)))))));$vi=$vi[$hg];}$Ea=func_get_args();array_shift($Ea);$kd=str_replace("%d","%s",$vi);if($kd!=$vi)$Ea[0]=format_number($hf);return
-vsprintf($kd,$Ea);}function
-switch_lang(){global$ca,$pe;echo"\n",lang(19).": ".html_select("lang",$pe,$ca,"this.form.submit();")," \n"," \n";echo"
\n \n";}if(isset($_POST["lang"])&&verify_token()){cookie("adminer_lang",$_POST["lang"]);$_SESSION["lang"]=$_POST["lang"];$_SESSION["translations"]=array();redirect(remove_from_uri());}$ca="en";if(isset($pe[$_COOKIE["adminer_lang"]])){cookie("adminer_lang",$_COOKIE["adminer_lang"]);$ca=$_COOKIE["adminer_lang"];}elseif(isset($pe[$_SESSION["lang"]]))$ca=$_SESSION["lang"];else{$wa=array();preg_match_all('~([-a-z]+)(;q=([0-9.]+))?~',str_replace("_","-",strtolower($_SERVER["HTTP_ACCEPT_LANGUAGE"])),$Fe,PREG_SET_ORDER);foreach($Fe
-as$C)$wa[$C[1]]=(isset($C[3])?$C[3]:1);arsort($wa);foreach($wa
-as$z=>$xg){if(isset($pe[$z])){$ca=$z;break;}$z=preg_replace('~-.*~','',$z);if(!isset($wa[$z])&&isset($pe[$z])){$ca=$z;break;}}}$wi=$_SESSION["translations"];if($_SESSION["translations_version"]!=578941549){$wi=array();$_SESSION["translations_version"]=578941549;}function
-get_translations($oe){switch($oe){case"en":$f="A9DyΤ@s:ΐGΰ‘(Έff¦γ Ω:ΔS°ήa2\"1¦..L'I΄κm#Ηs,KOP#IΜ@%9₯i4Θo2ΟΖσ Λ,9%ΐPΐb2£aΈΰr\n2NCΘ(ήr4Ν1C`(:Ebη9AΘi:&γεy·Fσ½ΠY\r΄\n 8ZΤS=\$A€`Ρ=Λά²0Κ\nγdFι ήn:ZΞ°)γQ¦ΥΘmwΫψέOΌκmfpQΛΞqκaΚΔ―±#qw7SX3 o’\n>ZMziΓΔs;ΩΜ_Ε:ψυπ#|@θ46Γ:Ύ\r-z| (j*¨0¦:-hζι/ΜΈς8)+r^1/ΠΎΞ·,ΊZΣKXΒ9,’pΚ:>#Φγ(ή6ΕqBτ7ΓΨ4΅¨Θ2ΆLu*ΒΤ/Μhε\nH€h\n|Z28―\0ΔϋΉCzΤ7JπΪζH\nj=-BΘ6p«Κ₯):8υ·£Ζ1©#<³ξλΐΠ©©ά9ΎXΠΑθD4 ΰ9Ax^;ΣrA47ξκΞ3
ς\0_AΠ£ΘJ\0|6¬ιΰά3,ςϋbΧxΒ48Κ1©¬ΪβΤOγΊ΅βΣ#c:9Κ;ΜΆT*Έ’Νφ5KJ1€3ΓςhΡΊ9Gd!
0€€¬@\rΠx)€{βλΛv³,²ZKΝςB§φPHϊIN8d'Ε=:X;±γ-kξ\$^ ΕάΚϊk#I !ΔΩH`Ιβ~πμ2ΪΒσ|χvJ?ΓχwίP΄υ¬N~οδλεΧί7ΥΉ/ξώΏ£²ΕμYΚώ¬Xιγi\0Kb/οά5τΜjΐ «°92\"©Nά6.ώόo.ϊνπ.μo,ϋπ*ξ6ύ)FβHaͺΐH00dθ
\0fήuΊOΦPX£&B£\0θ!)Z^\$Ζοώ02W0pF°6pώο.ΞH©0^NΛ\nΏΞTιnΊώN~tβ Ζ,W―^4μΒd+ΚέΜΒΊ\rλ\r°ΣΟ8κLBΠIpΙtGeμ\n£yPΦ%n©ξ―ΡπΎ%\0¨κ\"o|Ω7£ιΪLQi\\¬ H\"¨€ͺ#¨1κ|t·²‘\nϋΘρ| χ!ͺ'¬Ε«e:‘\n&T Β=‘)£χ§»¦ΈΟΤVK¦ΟμvΘ¨2\r―TBP£OpΜ6#ΖΩoPΟhYhΕ΄£Έή³πΈΒΤΓΡ\0δ2\0yqΚ3‘Π:ζαxο}
Γ\rcAPHΞ£p_pόBJ`|6Α-+Τ3A#kt4γpx!ςΔΕ΄ϋUOLΜΓδ3λj©Q8Ί²₯ddΑmWKΤϊΐVΙ£φͺ²nλ\"@P0Cu¬£%R #ω;φΘΪ'gΪ|λYΑe¨/ΘJ]R\nμ\"]γκ6Bγ°Β6£+ο/sΚIGΚΚγ' j>\\¦zlUHσΖE*θυDΫ¬έWM&ΑdσF2Ρ°[ΦΤώGΊLπB6Φ66^cέJ\$Br)\"bΤ©£νk.΅lμ5<κdNύwU;ό»ΖΌaδyOη [‘k\\±ίΦ\rYΦdlͺόuΦqάώh9ξl;ΣkΒΏ±υFΘwΥDέπx@P!jΘo¦Ξ ³κKAίΊcJS @‘Ί³g @eμ7-V2ΙΌ:\r* θ\0Q4\r πΜbΖ0§ΰ33¨ :BAP7,Θ °T:%¨X \rΌ3 ζΊC r!3Τ\"{M7Sv\n)0€ε\\BΥςBU&4ΎΑZLΒ‘’@Ν(t΅OX XqQ.ΗΓHdXλ¬ΠεΰΌ’φ_ι~/θθΐC` ½ @ΐθΖ0\"5Ά6ΗJ{ν/b³²ΐ*βκ³b\\ Θ\"WTΕκ+ΎβΆ&a5ΈάΒRη@‘ΰ8άRμΛΕy―UξΎWΨw_«ό7 `\\ΐ#PRIChp5α΅I. tS«§X¦C[CΝΦ>]H%'νΥdρr=θκ4J΄d{x6:@ΔiC³q§Ν-Δ>a1D8ρ½6ψΈΏ‘₯·ΑβΛaPeXΒΆερK,Τΰ§Θi?fΏjVIijB₯ηΤ633C3ΥΓ\\l+NCPxΩτ*Έ¨(oυF~ f\$lΧsC«N( CzΔppΛfΝπc\rL4uζ(=4€:‘IΘh²)
ͺ
h*3ΣΪΡ&r½\$BΒφCKb&Uί₯x`Q Ι>(bΎVFRΆΧΘQΤwΦκbQJ9ς9b\nY΅V΄\$σΞQΐβfHΠy3λ\"<Υr6Αg)Ύ6kΈ8·ζ
Γ2\r±Κf,zΞCBn«!ΣcHkZPbN
\0Β‘\"*ͺΝ?]΄RΜΌ½ΫFΆQ!6oΆ:ρSΚhCΞ}ςiξM»*{βbiμα%ΎΪ\n \n (ΫκP!·kωl*κL§ZΈΒ0T\n@74ΰΣ6VzίΔwJγ#HiΗGETVΚ΄BRlV±ρPxNT(@.HΙA\"ΐ€\\VNε,)E?Qξaω`Φμω;Ε\0Ώl³WΎΔ,)TKJLDΩ%t LRQ>ρϊ\"άάP^Υ§δΕΤ±6Ύ\r7€°ΘίΓΫDjAίdΟ,οΕ‘.iεόκ9N£/―Pκ3ψa©ώ£F*Σ!β{Ρb¨\0κp’AI'kw[X\\pΞAK*ψΌρ±WΝ=\$\0#!Ξ5C\0PS\r!ιΉTi³S¦Ύ€ΥlHAνR%κλ£<³7HBΨΣheμψΆ³vήNΖ`6ζrΜ¬‘Qβ|W]q'ϊΡ\$J«£Ιήm*δ₯.γζN2QξMV#Ν³cΏζD>f_ΏQΒΑRo±H>aX£Κ)>τΉCώmk2ώ_ΣψψίcΜΤΔΑ)
'Β Aa \\ή
!%ΖY‘Β©΄DLρίdκΰΕh]ixJ±H,ΣοΩ;PΚ€R{Ε}οιΧUΣΎΟ(9ωΛ΄.\$©\n2eε±\$&ΒA%Ξ«θ>,4
Α~ΕYmήMδ\"2P\\[Υτ₯WΔ£O\\Φu4φQΘFw!α½ΰ\n Ώ ξGυΌ₯€ϋ}UNώίηπΗA x6<`-KύLKe\"όyh<O½Μύ+(h=]ω:Ϊ\0±V c\0002\nV<ς§ήΑbζp³\$ΎίCήv¦bgD e₯n²οτd΅Ch!bυ0*
Μ·βIG:\"nO¦~PΠBπcv~# γ\r°αιeΪy£Δ:xWΝ6R°fβnβBle¬ΆΛη\\εΒ>>ΐA\nn)~Η\"ξΟfΠ :?ΨKΔΑ\rOr1
:βζ+\$βPδδΛ\0P:Θ @RQνΊθp5-(wTΤ-XΣM¨\$/Ζwε^₯°¦RΤ²ΤIω΅qMPngM\\~1¦MM\$'ξ\$zpQηRξζρLg0ΰγQd|[C#ξΆ:n’]/\"O―(Ω+ψ1δΨNί\rεΟη\nΝ~~α0ήγ*[kNafΤ§ήRγε±Θ1€π)μξ§'°S>¨Pδ#>/‘P/Β/fZ0oφcg4IΕ*±ωΙH12Ψβ\0ξ)P?ς¨LΗΖ§qπδdΓ
VΏξ\$DΒϊ
=!Dά#¦’0βG\0ν8ΑΠ(2nI`H΄&|uΖΘxrο~ϊs2~\0E7‘LιPίSπ?4 ήΓ ]Ε²8/Q΄΄=θ%%Qλ=KΓμ3L³gϊfa*Πϊπ3ππε(Ξ0Pk~Epέ_>PeTσ-U ¨Γf4CH―\0Κ`¨ XQNVωπφ&lp\$bοσW€c G.s1l\$'0nΑT)ρΫ(β₯ΠHΝbε 0ΐςhXπ`¬Z κ ΪάΖ θ\08βl£:O~gpV:c'Λc'~Ρ,!\"NΟ6IXΐ\rμnγV7e6»_2ZT’ͺKOςώΙ:?ΌK@ \0t @¦\n`";break;case"bg":$f="ΠP΄\rEΡ@4°!Awh Z(&Τ~\nfaΜΠNΕ`ΡώD
4ΠΥό\"Π]4\r;Ae2a°΅’.aΒθϊrpΊ@Χ|.W.X4ςε«FP΅ΜβΨ\$ͺhRΰsΙάΚ}@¨ΠpΩΠζB’4sE²Ξ’7f&E, ΣiX\nFC1 Τl7cςΨMEo)_GΧθΞ_<GΣ}Ν,kλqPX}F³+9€¬7i£Zθ΄iνQ‘³_a·ZΛ*¨n^ΉΙΥS¦ά9Ύ£YVΪ¨~³]ΠX\\Rσ6±υΤ}±jβ} ¬lκ4v±ψ=θ3 ΄\0ω@D|άΒ€³[ͺ^]#πs.Υ3d\0*ΓXά7γp@2Cή9( Β:#Β9‘\0Θ7£Aθκ8\\z8Fcοδm XϊΒΙ4;¦rΤ'HSΉ2Λ6A>ιΒ¦6Λ5 κάΈkJΎ&κͺj½\"KΊόͺ°Ωί9{.δΞ-Κ^δ:*U?+*>SΑ3z>J&SKκ&©ήhR»Φ&³:γΙ>I¬JͺLγHΡ,«Κγ₯/΅\r/ΈΝSYF.°Rc[?ILΞΈ /t°β#ε\nψ°KΌQYi\"±ί4\$©cfΰ 9\0ΪΊ~Δύsχ\$zϊ#νς―P&D°)&°JσΚnόϋxSIQ>WΟ\rή@D²YJ<¦΅J°ΒL!©pβτdήΰuολ(cάΫπΌlΛ
¬8€,W \\ω·Β&γ \r9]\rςͺb\0oΊΑeβΓ\"ΐsΪδ38ρΗ΅SΠCaJ΅Dξ‘LABΐEΖία»Μ.ΊDHέO46ΗZ\$@EDAπΩ)Φ«ΐPD\r!ΝΔj[+DαΊ:Ηtu£ΐeΡ°VΦ\$/eάώ Ψ:.Το²CΣp½.(iτ5‘LLΠΣ£hθΣ*ΕΣ.e©ϊ'Β>S¦ώΓΈ3iδΝΒϊΆΆIΗ/1R΅JU3 gΩSTwc)\\/Fά©ΧrVgΰhF¬4°@Γ`lQ@heq3HJΓ«`:Ϋ ΨΓ:φ΅μ<4 c₯ΉΡέJlη{HU +Χ%ο8(Β·VΡeJwΩΡ\n (&-x-β?ΐΰR^j± j@ΧΈc₯ηφ,Hv\r1Ψ3Ϋ¦,ΤsGa½[InJ(hι4ΐΑΚΉψ€7&Ε*GgΌ4ΗsW¨gdΝβ°Ζh(eO₯aY(4ΜO!?ͺ'tΎΑ2κ#₯\\wςΕΚzM2©bΔχΔnΣΪM}FVXTwαJ)΄AE*Q&sHβjΉ±Mξ§₯(¬P§D5%QΜ«ΐd^¦·BoeAΐV%?e¨j@Ο)α\\ΡJ―άtH·%ΠΙΆtρTΛ§ΛΩΓ\0ω[±
Ζ_;υ0\nζw+6QΚ)₯\$IXd4ΩE_ς
q¬k©ΔtuEAμ\nφκttLΟΖωυΔui~b€³O€δͺ]Έ΄ΒR€Φψ₯O΄Εΰ K/&βΦM6ΑRϊ KWeFlΟ-εtΏ’ΦqΫΰ'¦ZjωΝ2¨έΆwl°½nΜ²J%ρΒΉͺΈ’\nϋΌUqγΑT\rΊξUΌ\rSΉHΦXα°°Ηυ©Β½ /πΖ`<\"x-}μ¬ο©ΠWsϊ½B\$Ρͺθγ\"J'3ΙγαΨΒΰΈφ«ΉmZVΒΔ>bqrθ©ΣΏU¨€;ΗϊΜ(άΥeE¦³Ρ!*ΰξKΊH€κL α3fΊΝB;xϋyrRΖ«WaTQΝflύV4ΥσΎκόdΞtKsΣ~DΨ4VͺΌ~WΠdv_άΞJΘπΧ\rQ1ε\rPα§0δ?rNdw₯μΙx*5dπΈsΟRΧΫ\0
S»:;kk6^έ:Ζο\\Θ[ί―Γ7NΪ ·£ύΞ’Ό yψ¦ΩΆξ;\\nvμεΰβ(j¦B#<ΞjR\0Ε¦%πt¦ρFk\rdΪ.ΗάAμΒsθ°.d:8€βΕπ\$l.θ7R¦ξοzξ€,NE€W-4 \n¨ \0@ κE\0G&\0cμ6G«_ΐδTνD%¨¨M>φK,Ηΰ@#8Αhq°ΎQ(.γFͺΜ²%§ΔqΠΐͺΓ¬zΒΊνiΝ*φν¬Ω’Κ£+0γcdΜδθ\\0κ³0ξΡγ8cΙΗJώ-(+Χ FκΠͺ;ρ+\rͺ«pΕ\nρ8\"XnΫ\rΏkΖ#α6%βΔ½(K ΗZοN-fZπPΌΝΖjΚόΡ1~.*P€²Θwj.! %ΕΞλΛΪzβΟJχ±,ΏF―-άY)μ3 «Lαμ¦Ηω\r`4Ρ+ΨEA ͺ’;Q3ΓόΥgZXΓϊ>X&Ύ±δδη΄@Bjα! B©o‘z©κκΌό§%\\Bγ\"HΦzς,Mφzς:2(6― μΤ]ΰ7g&.Φ5οΘMRΪ.*νΒΨgΡ&n~CRόΠΨR0πJϋ-U(ΚcΟ\$)¬Npk/Τ±ξ;cn[’v\"Ό(G’O.\"Ϊ½HQDΚωβE@ΰ―b.bj―ΤΜBrΪ\\ζζK*ΛνΕvRΐPςΔΟώMΞZ\\.%(ρ`λ\$.NζΤ~¨lsB<\0P²Q@T―(UeΌοJλg)ςwΞΤδn»4lk(T@rΝ@Ωc½'ξΌσJξnΗ\$N/Β£*r7pλ5σM(tΡΟ)~YO―(sg%9ς{5Υ'_:sss}΄\\3Ή9<’B*3ΤΏ5\rΩ-»<ς\$c+dΒ?0θR±3ΠπSί(³γ3-Όδξ%>ΠV*υΦ―?β²6³Σ\0’‘²q8/5T&\0Ρy;t51²)=?Bπ:SsVή.31lάΚξ2tZσαtRτέε¦8k>λNx:λ}γ@{’lͺg2Πz³Γ|΄\$‘γ?EΟΦγθ)FS@¨iG.άhxusX}B’ΑD)Rl0Όi PβoόζΠ;nuJ\\δOmN{<Fͺ4K\$ΟΓObΉ<°7:ΣV+IαOIΡOQE½JI4yt[ΡQQOΖ2Π6ν£C¬ΡS^λ4τ DFΌA|X\\UHtM'U*Q’FΨcU«β%Qυ)85Fv’&e2δ'\$:ar70ν\"β]γ.©Ξ6M>ΰH’%86SρESαP΅?'ΤΙ[3ο3[΄ύU+PπΤ½Ι)Ve8[άnCϊUτί^¨aMuΕAfΕS}ρ_' 6ξφ\r`Χ[n+β§\"·ζ₯Z'ήαΝ]σBE\\Σ«[σ±δQv4ZΗhΤφ?]ξQυδj3 OvNυVScΥTυΞΌT_VΞ(γθ‘d±fr,0O!pp±vdΪih°7N―PtF\$BPΤ:.6‘KΉ^q*uΓ_Υq%η3WΆi ΈPpββ»₯dΦωΦ―m0)jo9uQgB.'©mP*Μv[V_―ϋ^ΓΓV©lml―q\nνYVB|iX'ϋ%©lΕV3id6α W.ά¬ύsS¨5ΡR0/oQsίoς ξΥβLΒβ©υ-\"]PU] #ρ¦Νb ?A¦\"9γpπS₯{’I@7lμ\$μ²]57ARg273,έΌ¨R·!ηΩ\rf/ Q²>oΧIB\"Α@7Χ%=;wύ~5A2\0\0Ψbϊ:bbθdΡsf₯Z+kH°ΝDΚMnh£IAKθ\0ͺ\n q\rΙhέ1 ?]Iεn)f|·ιφ΅1P)mχ
±‘{¨XΌΞg2υ~ς²r7 VεΦ±|§ι(yT?oy_’ Ζ'@E΅τ¦DΣςp΅ώμ3cdTa/ΤN'ZK.·eT¨rN4ΎβΆOglqAβ0db¨°χ4Σμ―%Μ§.εkoR)――CnXρYMw_yXD>xoRΥ.ΐωsMryPτ)&Ή+Ή0U4,D-vΩ'NγΌόGήχ§¨YΠμΡNO98Yά±Ν ήε―\r΄gXO~Ογσ)1* %<νΕi¦ΰροc#φ,\$¦κω]XNd%΅JΥΐtLΡΉΒΈIΞjM£|cKΪhOQΘ\$χ=ψΐWΜθN=³1Of\rΰμE\0ξΒ sφ0V
}ζz/e·― U§v5U|W\"#γ";break;case"bn":$f="ΰS)\nt]\0_ XD)L¨@Π4l5ΑBQpΜΜ 9 \nΈϊ\0,‘ΘhͺSEΐ0θba%. ΡHΆ\0¬.bΣΕ2nDe*D¦M¨Ι,OJΓ°v§©Ρ
\$:IKΚg5U4‘L Nd!u>Ο&ΆΛΤφεa\\@'Jx¬ΙS€Ρν4ΠP²D§±©κκzκ¦.SΙυE<ωOS«ιιkbΚOΜafκhb\0§Bοπψr¦ͺ)φͺε²QΑWπ²λE{K§ΤPP~Ν9\\§λl*_W γή7τβΙΌκ 4NΖQΈή 8'cI°Κg2ΔO9Τΰd0<CA§δ:#άΊΈ%3©5!nnJ΅mkΕό©,qΑξ«@α(n+Lέ9x£‘ΞkIΑΠ2ΑL\0I‘Ξ#Vά¦μ#`¬ζ¬BΔ4Γ:Π ͺ,XΆν2ΐ§§Ξ,(_)μγ7*¬\n£pΦσγp@2Cή9.’#σ\0#Θ2\rοΚ7μ8Mσθα:cΌή2@LΪ άS6Κ\\4ΩGΚ\0Ϋ/n:&Ϊ.Ht½·ΔΌ/0Έ2ξ΄ΙTgPEtΜ₯LΥ,L5HΑ§ΔLΆG«γjί%±R±tΉΊΘΑ-IΤ04=XKΆ\$Gf·JzΊ·R\$a`(ͺηΩ+b0ΦΚzΚ5qLβ/\nΌS5\"Pͺ1[RνΉ]ήΤ¬³RW|·άKk―ϊZΆ^HλW₯\n|8ΈCY|NKΥ
DJͺι !ΨώB# Ϋ&Mρ=<Σθη?Π!\0Β1oη&ωΦe9S«Θ;/γ½>/E CC XhΠ9£0z\r θ8aΠ^ϋ(\\0εΩα7αxΚ7τηBΠαxDΉΓlήςI4ή6Ώ#Hή7xΒQ(MΩ,MΡ°ΚπΡ|zE©ωLPFΞ5dEςΒ0DΪtΰDJQ}ςκ}0·7-έ[Δ/RΫQϊ½Κφ(Ϊ7γBΈΒ9\rΪBυ¬O>gβΫ+A.^βαΤ
¬UIνν+ΕSε3DΰΜ]ΖTUst}~s]Τ(½²\"k#κ6O£°Β¨ew.<©Η(Θ‘Ε@κlκ=bφ\n²/}ͺυΠΉΛΒ\r °₯:KΩ~Qp5K2BΨΆΨΏ8₯uΜ)GήΉΚ5kΕvrκ²BH\n?AN\"‘
σΎθ,μ[ΈΟμ64{\0c!Ή\$
T‘1dλfq\0hΝ'YjYφ£E*
Π¦cLΆΒά\\ s¦D'eRjμ ΔAΙG «}ΨGuΒAT\n5Ζ51kR±ήΖ3SΧZθJΡΌΫ\n)9,.AKυγ\$’2»0»?b)Λ/#£i·c‘!GUMΑΗvRhΉ3 τO<u7¦°έ2ςͺt2τϋn\$p\n;§}γ@ή0lf\n%\nbX)8AP7w\0Θ ³`:³Ζ|Ψ \rΌ3€ΐζΤΓ r!3({eαΈ: PΑLμ jwΟhΓΡΕΧ\npT<)ω7ΰε>ϊMΆ¦Ζ¦ζΠiΕͺ°Φγ^l\r²6fΡM[XrmΌ§p@ϊ§8α\\:0eΉM
ΆΘq -Ρ%Ϋβ&¬
ΉA[κΚv¦@'{¬mΝι\0Ε15:ͺ^ά£QMaΰ8°’£V§νm΅φΒΨΫ(wlν€7&ΐ\\Ϋsp³^lΥ&πChp=Α΅·J°¦ ΄)ζKTC[|PI²{ΪZ΄mΰbΣCΉR£*Ί°uw!ΑMYω²1¨ς3Ί ΰΑH\r41@ΰ)u€y‘3Wδύ?\0΄¦¦h<Μ0Ϊ@@μ=₯\r/ώm½¨F΄%AQ€«^ΉΧTIο±Σ@\$u1-λ²,ͺ6CΓnRΘ(.@¦=
ζ½Qk&¬0Εΰΰμ¨cͺΚΧΦ{Oxeyͺ\09CδΫLΊaΌ;β’λsΕ>M49¨6{DQόoΈ8QVάΪΝητ1TC;]VτH€S²+lnD\np@ΒRΛ\rEΪμΎpZͺrάeI
HEω §ε²ΊMaDX(³Jυξ΄YQΘS?gdVP*Η-ΈQ\rXΈpzΫ\r!J,*&)Π5₯?7dάif9 5:―N0PgΑD¬’P.3'
0¨C£Zύ-7lK
%’ph¦BΚK&\"τΝ½rZG’ΞμΣ«ψLC#W―ΤεXΘΉm8ο|SV7Ά² \nqXlPcMΑSE7m9i<7_λ@δxΣvbΪEυLf\"G@glΪ»Ι·\\΅Ξ±dέ3Qρ―¬#²AF[41₯\\πδ )ζFDLH²s '
X2JήB~ΌψΡΉΕJB^»\nϊω
qBΓ¨σΘ½«’wk»l½γ\$B©ξ²>]G±XWe&Jy©YF*ΤωV1]λoρΌΓΤSΚΘmΜXΜΉc:XτΤΠtμ%-ΒγΞMΥΠMcDδΤ¨½uE/τ\\OIaJΤ.@κh΅5;06ΡύαΕΟ₯όq―ΡE±FΟ]GΗx9ΪΕ€ΗW*Θ[=₯ZlωUΗεΖWIύλΒiPΪ+\0e=ΨA£[sο
ςβ-ΜΊλ~¬θ―όΎiΤύg=ΚηD]uΓnw₯Zdd\"ξΖ\\Η²}*HΟJ>νΒπvθpλ!NΓcΝΒwδΎF\$>€Fθο*e\rΐρκνΟBήίΓ¬HNͺ
JξTο`·’π(Όe%t!b£΄3’ηP\$+«φG°ͺ#υ¨υεX3ΜΞR₯#\rAIσ0JW¨TΝιpv ¨\n`\rtMOIΚΦfnX?Eΐ&\$θFΗ)Φξn^γz@^6y€\nξ~z1,νθt¨ 1φPδ'k'*€/o}o©>}ζΈΜψΣΟπJP1@p³0BtγρB-ΚΫc«*τ1bZ1gQΓ·ΒΗRΈpμ:Mθ
*ήβ\$qΓ΄ΞρrWA\n,δO(έ§Δ0ͺG₯fρ4αH¬QΘρ»PΠορΞ{qΤπpΠv°°s±PδvΗ:ςΔ 0γdάβB1Ύvjΰ€P&NDzxΈέ#hΤqΗeΒΈ1τΪmόΫςAcvφΞqάΜΒΒπ#μΧ&Ubςvbε#².]Η(/xΔ`wO·£uβάb&zΓ'Bεgv2lπ-b5OJΣ§vR#°sΒάt,νϊHi'EUd\n&₯έ p`ωU-wΡx(ό]\0woπJυ%O%π\$wε\"7'!εγ_dΓo-0α%Εͺ]ΈΣπ010AδκΗWχ2[R>J2ΈΜι4ςλ#7!qM.rW4q±γ6/Ι5hσ±F³%7M7σfnΏξd\"Hηdλl\$¬Vο\0
`ά ’#Rγ&.μvKs*Δθ(ΊVβ0κsΎΐεjBω{³ΜZρϋ\rC°/?3;6±K.K23u5σz_PΠ,μ~ΓV2ά\\ΐ@|σΕ*ιδΎ(a©o\rͺσbΎώο3S[8³K0t:φt>qΣ.8-7*Υ8ΤPσTΤ¨ί+΄, F΄N₯RΫTV1I;πI7T4Sι\0/%U3X{t\nsHTQι%q©JςSI³|xI)J3u.E@RYIqLrKNws5>0k6έ@Ρ.17,΄)6§°Β^]ΣOS1)’BεέO3&(ρΫRΓ΄ΑP3ό5ζ5HΘU\"Οο ΄C5rύD΄―FΤεT¬δ±Ω!L5EN4ΝD0δ
(ΎG΄}4UoK5r0iF(HψCrE=m+1υ \\ΟβNΫ΄=Y².R’-j1Mθάξμφυ[’{>5ΏZΒSψ
Yb}TΥ&M»1ε!Ζ8Α%,0TΣt2\"TG40Ν9\\ΣeAe=RPΐIOBS<9ΟΖK'dtMq7U΄W6@`χDNΛDXs`U6Vy8u%UΦTtvn2θ-ΠΙ₯/e΅TπYfT%φΑβΓtΥC³VΤW}iee ₯!g΅jSwe6«°Λ:ΦGjjίΔ―vΦ΅ΙklοΔwpΉάτί+hA&Άδ/θπε½LqͺνΝAθ,)ι,s΄§/Άf6§X}qSΒsΆvΛdφ8χ)NΘIWφΩg6½aH>HIrυid
΅<}β’vS§)uo@f)u|g;tQm·Xά£Wuο0vVώawyX0ϋ.(HcBά|hΣRN ΦJWrί \$U,ν3KzγLhϊW΅fr_{§w{μΩlw1uU
|jΈ|D£}M%}SvΧιzwΦxo=)ΆΝu%·«qΦ`ϋσ%N·%ψ\n]φΧW5~LV8aΥ²V.Νh.[WΓkx²ή3Λ3XJ³]Rtε2QΒmVwkM·ίk΅GΝ #axΒGΆΉQX[%ΡxeMvψHm+p7.ΠηVl)Y'ζHπΰω2ωDxUDΨnψ«_wρxAQ₯YψΆqΈW(cd\nϋqv5bsJBVτθ]<ε1+Y²ΓxΠτt']5;\nςνmWΗΧδηRΡuΙ;΅TYΩlX'.ά2Dλ\rΤLςΫAO2³£6g₯2ςπμ 5\rT j\rVΨΐ`Φ i§όφΐήΙςi\"κΞ\r¬°O¬¨‘ΰͺ\n pΚqD.Ή[]²Τ:ω)Su:-ΙB6sαψX;yRa4+υ!ΩΠΣυY7³|Ώv)\$ΦΠΌΣ7θ\092v©\\XΓΙMZ°r€t#0νOιd«η\0%Β~P²L8ΑwΜθ \ny¦τΗ#π@\0₯Πh@ίRLsi*ΒάϊΣνBR΄gWRxόn!Β8²;YΩgZ8ή(ι6°νyΩΝͺsBγ,5%««Φ)]8RΉi>CΒ4¦Σ)y½FYΑΫ\n,Ξ’Af Έ-±€Ψe3NwΣ|αH\r]ψΕ§Μ43XΥέ£w³ΟA!D6eΰo7άY>9ΰqΓ\$ΡΠέiMΖpVΕtb¨q\$«Ω€Φ\n%άφLITάkΈΝΒ)ΘδΉͺϊώ0hθήΥ4 \n\n:\nΐδ:4P ζ;c\"\\&§HΪ\ro4 αΈxΘΠ@σ,ͺ\nl©EjΡ+)Έ\nψCΘr5 ’°―/ϋ~¨°Ϊ;.γΌΘjβ&²f)|0B8Κ7±€, Γ+-+;Π2tΛζ2¨»ϊQβθ9ΗΔl:βΙβbr’ͺΚά«\n@Γ>ϋ,\nhΤ£4cS=,##«J<ΥηAΠΒ1mPζ’αoP\";ΔC5OB#'\n
\0xΜC@θ:t
γ½4ώ
ΛΞΉΑxα BΘJh|6hB3.cj>4γpx!σ=/οκ @£ιB½Γ¬μΛΓ¨Φ:!¨ ΚΘ`ΣEF;N2_ψ\nι6Ι]ό'\rμ²O’ΈΒΤ#Υ#PθΈβbΏd=ΛθΩ\$§τ@8G`άΏN\"κΪτ―8Κ3#¨Ω2Ω[ Β]« #―ΈΖΓΌ£HεζΙΛΓΟ,M3Z3°‘nbΉZhπΤ:¦Ά‘Γ°\"·Ί9ψΧ§ΡΘΈΦΙ‘ΫM£NΗ67kN\"d9.#Hςδ:'zRS18}`HτΝήτϋΝs#Σ6_Β5ΓτΕP₯ΨσΚΌMO’\"rρbͺv=<³?-JϋΕ_άυΫτ[
ΨvW4έ\"6ϋO΅kψΆθBΏΚ< γuGrip5ZβΜ³xΊ7Γ2«%Β~Β£Τ@o5«7Nϊͺ TA‘ ήΚ(sV©z5 ΒQN)ϋd I³pΚ\n)%ΑTSQ22ΘΰΞsVΈ©(TH©3ϊCμ\r'uJ«s8βΎX b,`ξ²RY‘ΙgpOΟ’ε[\0ϊ'3ΖΉΧI.\nΛΨP\n¨Τr\"[Δ©j£NJ!@¨ΠΈ΄.Oκ±VkXώΰΐΜ .VΚβ +Υ~°VΕXλ&(CrΠ}9υΘ²ΑπIp¦H°δ1ͺΉ8 Φς%AΚΰθ
Λ~λp
T@»Ρ0r=!¬ΝΒ\nj,!\n~(΅X` 0ώΓΓf κUMΐ₯e& ,ωVΠΠBa113ΊΜΓIw}¦@Ύ
BsP#Ην#@Ι,Ή\r\0( ₯§9Uj\nX Β4Kε*Αϊ3Xh‘₯4ζ₯©ΣVmJΌ;Η5ΜΕ5qyiͺ35πnή9-TNΝcf3«ιlfΌάh(&Ζ/ρaL)g
§‘;S©;hΪkf0u%ΚΩΊsφIkTk6ι²g'§84Ο2°Υ# hlήζFψ§I\"‘δΝxwDeΈn¦ΜΥ0βMRΗύ\rΓU₯MΞ²5* ΄ΝMK2eχ@ ΒTΞβ°ΚBG,+
Π¨3@Ρ’2&Μx\$ΙΤ\\3\rΑ
Ε>Ή\n΅n2kμV\\ύ)ϋja½dͺiB\0Sq Φ=³J@B0TξE<)Σ^«δ·Iΐά΅¬Ιλl©Δ
2ΪΩ€j§@'ΰ@BD!P\"\0PhΘD‘Μ₯eFΓ)W@-μ½Χΐχ%ΚφoΕϊ&θ8φVJ±/-Ψ5iΤΊ[@StnΙ`'ψtΣj §lΚSζtE\03άNuv+'φμ.SM£ΕΌΡ?Ω7KnvΣεPτyπBix-&’Μ\"άκ][ΙψωA₯§ζΘk‘½PΝ― ρ=Ά€\\Ώ/Ζ4ψΣQΐκL
ΈMLάυσxΖ€*;\$ ͺόΨSoέτΒϊξέϋΒezqGκ\nα`φK<δhΈcΠz³4οθc.eQt.ϊ5PΚρ;2(ΐΛ\\ΣaN°5A»T:gN!ΣχHΒΫ>!8ΈK°ΪΚϋHx‘
C~Λ8*!Ebf»))6-pπΊΛΓ0<έΆbΉΘσO%μGc#ΣάΏΒ T!\$\nξ»Cφ\nm2
ΚU(°Ν Δ@Ώ Ψ/lΙFKΓHχΜ ΕGt IDw#Φ½DS¬ΡSk6ΰHUβά΅9Έϋ\rά
ΝθΌύy10\\§ρ΅ΖΕ ‘γΛsN Κ9\"φs{\0Έd\"αέτίr8K ίβδ#τNΊ!ΞεgsrOΟα7Aγ½§sΎΘ3·\\νΏͺs\"Zπy}ζπξΖΕγ(δ|<8U₯cl;ζ―R<)T71y7Φηα |sd0ΕtXlmώx4`ΏΥ3EKΌΊ_ψς^
QΟλY²·1g±: ω%/ήΝCοUmς,\$ΟS\$Mu~OqΘίp¦Ε<Ρ«ρ«OΆ£τΎbsη_{Vώ\nΤΟΥ9»°`vxϊ΄θlB·ΊkΖ\"€Σ(΅θΓ#ώΈ\"Ζ ΄°έhιΆP0@¬ΐΙ\0 -`ͺC²3g¨ϊΈG^ΦΔte\"xe\0Θn'λτC Θ)l³―[ΜόOΥΘL-ΚCCenΗ°dϊOάζC/©o¦ύͺ%ΗbΣO¬2π\\OΪϋ Η’όΠ<ύFΖMΨΔβtηNHMΒ'ξδbLιGJ\rΞQνϊPΜ Γ\r#(μΠΨιΊ0αMbνΓ*ϊPςuΜC²(nHό,Ί±Ψλ΅―Ξ'Β}4ΨΡ°ΔοζΆ\"iβzΆ&Te[
3fΊ>4\$JHPκz(ΡNΒGhπEFΰ \"γΡB &#(8\"\nY)ΰ\\l|\$lJΙO―16My±ϋη§ͺΈάlEΰά_ΖΖΥDO\n0Ί©h`ρ(ω©ώΥ1Τϋq=\rΜ\$ΗIaΖkfΚ8£δwQπάΡ)ρξά±τ±ν~Φ
-ζΞxΎ q!~lb1₯>\"δV1/RεξF@]b1©hΫπΞόΡψ2νΑ %RO―ί!&0εύ&-Έ2
ϊΫI!Rlorq(`xT0SΜNI>ͺΔ%η©pl¦²¦\$Ι¬/Ν%Ρε'Mj!Η1θΣg\nCrͺD
&Nd%ΐ/¦^Γ&~( =\$.`ΪQ-QΩHv82[Ρ?/s/²\r2ΰη-‘/(Ϊ31π&j7γβNbΛRόωΒ]3ci3³9Ρ.D;3έ-Ρ> ΣΒγ%bμάj΄1,:'0ΒrA0HΒξ7o8SbO7ΖnνΚ?μΊϊEτ(¦nξζθpΝhEτABd#k£~cΠ±~μdO;±8ΐ#DασΘ Φη1dΌ\rV»VΪΠ)\0CΉ\"\\ΓM\"PB \0ͺ\n p{θsΖλj2XΎͺq\rΞ%쬀Θωτ+t\"Πp~¦±Rγ6³¨i\$Ψώfψ|Ό*+#―Π13DCο:/ik?O3f\"«NF’Ί1MEI΄D@ή=0K\0«H%M±¦ηBΦ+,I¦ϊdΆα§>hmΌ\nΘ:ιOΙT΄ώΪθΪΦ{seBtΑKsΟMτΕ8ήθ0ΠΐΘ%eΌ`¦1*k2>t13qL¬KΟξΓPW'pnpT.ΡzΛΒ0\rΰΔDΓCmΎ2(`Ζ€ΏtπCG¨|'βΑ2P¦\"#lqθΫ'-υ2laFGΒΙΗ?HζM ψc.ξ.Dΰβθ ς₯Oc\nDAΝV\n³ςς:Δ*ΐ";break;case"ca":$f="E9jζe3NCπP\\33ADiΐήs9LFΓ(Βd5MΗC Θ@e6Ζ‘ΰΚr΄d`gIΆhpL§9‘Q*K€Μ5L ΘS,¦W-\rΖω<ςe4&\"ΐPΐb2£aΈΰr\n1e£yΘg4&ΐQ:Έh4\rCΰ M‘Xa η+βϋΐΰΔ\\>RρΚLK&σΒvΦΔ±ΨΣ3ΠρΓ©Βpt0Y\$lΛ1\"Pς εdψι\$Δ`o9>UΓ^yΕ==δΞ\n)νnΤ+Oo§M|°υ*u³ΉΊNr9]xι{d3jP(ΰcΊκ2&\": £:
\0κφ\rrh(¨κ8£ΓpΙ\r#{\$¨j’¬€«#Ri*ϊΒhϋ΄‘B 8BDΒͺJ4²γhΔΚn{ψθ°K« !/28,\$£Γ #―@Κ:.ΜΚ(ΓpΖ4―h*ς; pκΌ«pτi{]\0RL\"r2μqTΐ;CΜ§BHPu&#pΣ3¦Z‘£&fπRM,Υ¨#άνP2&ΤϊM\0ΐc|>D\n0c27θυώΏγΊX44{WAΓΙ ΠΚΑθD4 ΰ9Ax^;Ϊr?R₯αrκ3
ξΠ_£ΘJ|6¨κς3.©σΩxΒB)@ΛXΕ+Υ7Bj/A`N‘Μ¨Ζ:!L
όΗ%l.5Θ7α}\"1,[.ήΚ+€΄ui&£ @1-ΐδωLy@¨Ϊ½G±ό)@KΙFl¦=WΓoBφnxΚ3,T\n;/c¨ΛL#ΔTΘΙΟI’ΞΟVΥ.!₯μ(20ΨΓzR6\r~'ΨNΣ!7ΦCtΛPZoRρdΚ2RάDΥρKZΨΔ-ςΒΐVΰ22\0¦(€§Νψ+RC§§ζ4α΄9μ£+Σ1°ϋμ‘υ―JΪΔ8~OΡ£½,x(5z’hͺκB(ρWLL§ei8ΧDτ[!y=fτ³ΣηΖΌj9ͺN½qΚΚ}Q,Nλ «ςhΩ0MJ££xΜκ81’₯>ΑΜT\rεpΰςVD`3¦ΛΑC)ΞKΙΖ>Μ±R‘°Κ\n)aΞε>Oά?ά¨`Ο]\nΰ@¨ΦΐrC0΄bL±LΘYK1g-€΅ΊΦT
εl΅Ίz/KΎ, }αή^+ΝωBFρ¦+‘ΐ4#ωΛͺϊ:*9H Z§ΰ_§ψάeΐP|k‘±Ϊ3Ιtα\rΘκ°]8°ΔGJ\0re ΝP2±RU΅ΑBΡ\rt’#6hlς΄ΓΙTPβρ3&Γ(FW_zω ‘@\$σx D jEqΎGCΰθW\r`i5ΖΒB·*#Ν°7y \r¦ΫFͺΨ9 ΅e¦κ\rΙ, Μ\0c\rΤ»¬ΖNnfΩi\$ωN}S\nA&Α@p AΚ9>s\\II9V]¦)#‘Nfcj%\$6MIΩ=Q&’Π@Ος &
D\"M\$ώdΤH·i΅FΜ£ \$¨όΨΥ5!>ΑΆσuFΠY±~FΙίO0Β‘RΗΨhΦΤυ^\nR§a[εLφN3§tc£‘Nζ²:¬ζ΄Ή4
yVΑ»Ήg0RG*Oe<Ικ8Θ3WU&A0P^%%>`)ΙVΤ©p\0U\n
@δΐD‘0\"έδτSΤf,ΜΘκμΰψr rΚ# ω8rAΑ«%DAΥ%'\\μεόώΤSχ_΅€:#ΚxhIδ2Α ή/³dΣi7AN§©ιξxκοzvή¨΅κΤoξ\rΒΆ@<θςξή¦%_Ν9;XΫ‘AY#Ύ\$x@ \"‘\nΔ½J4X aIL’i-J|τΕEBθhΩθ#Ω#*Y;θ°7Q―#Χ’ziκΒf‘\r\$!ΰοrΊ½χΩ8Λ0Ξp‘ΌL ΌΤ1`θΙΊ6όKΔ %Κer}τI82ίω)PpVΦQ²εάDΩs,ΟΚ¦ωίdΘΥ3ςΪΙ \$D°I«¨ΛςR& ’jςpUNΔίXd`ϋ\nqΦμiβbPΔςzL(ύ\\ͺ&9?.;=ΒWρ &
lέ }ΟΘrI‘!91dsΞ‘ζZ―\r‘ΓiVb\nΐο5<wW0φΌϋ#Ρ£¦KςLτ\$ΥωΈΝΫγΊc8oqΗSηή
L©ΖjΞe
%ξΙξί.qγmρRΥ!`ΣΒ!ω0εDcdΠJJL3΅ +DWΣψGΡ.©7ΫXΖ)ΗL*%DVι8lfΒν\$(Γ,fd_@Pm₯h%κRI/Zφμ\"Δ,TΖ,,Nl¦@ά¨οτ%/ωl`w¬d(o0ψBQ+’jώο~wLGLM,>θ―RvΆχοd{G]BsΞ=§pGμΏP2g¬5\0δΨbτΰN0{Ξ\rOςαPο&=βΰ@ΰHσ°lάFe=Δ²ΤFΤά/PXψ°P―γ\rPθ&NzmP°N.’ξάctΜ
62d%%ά9CΨH\0ζC+ΣΛΩQ/Kͺ@ΘunRPί²β³%%γ΄R σQ:FdΉ@\r-JΠΕ%ΙeLΚG06I\r:ΐ-@_KΥ\0γ!/}e\$b(kΜχ1Ζ°λbPv,_―pΔ&Ψξ/ev0oM5\rΡΒΧMι ΛpcΝlΤΗLMψΚ£&iLάk’nSQ³ \rΏ\rπΆJ±Η &-bΗt€ΜΜ²aΒΖεd1Ζ~Ε±¨Τ2Ί²0Ω²(θ9Δ}PΎKθβΨ3p(R`β;\rμwB%‘y%ςck%`R\n/%}&2:Ες{&ς~Mύp:1 ς\$)(-6ͺ¨ή\\Υ²³)―<Ι΄dρ'Rυ2ΒΥυf`RΞΦ\"'U-€ρ(ν[.Mb\n\\YηSμHͺΛ/ν.₯0ό\r\"b ό`ΘΨ2@eB²fπh?@¦Y\"E ώ’<ξμ±3£ς`ζ\"δqMΞdΝΖ βH/4αΌφn4,:ώΣlepNΌ Zdΐ\rV―
VΝZi€ϊΖΪ&.Μ|`ΪB\nκ@\n ¨ΐZΞ£VXΈ'4°’έΠ7cxΔ;ΟΞ1fh'fΔzUDHlςJα¬ώΤΜ\0α/>6F3\">ΔήBΝjοFΜΟ¨ΩGγyH0J>UF΄1Tp\n| £5\n^ά`ήΨ&ΜώΤqeζΒ(«2άiίFνUMcC0p ά³foΠp\$\0dJ{\$0&Ψ\r\"iσ¦GxίFdΏt²CΕD/D;@γ Θbμu3ώό 9-/Gγ9Hδ~ξρ'ͺ_R|PH’θΉ ξ.ΓpSm'ΞGJDώ.]~@¦T \0t @¦\n`";break;case"cs":$f="O8'c!Τ~\nfaΜN2\rζC2i6α¦QΈΒh90Τ'HiΌκb7
ΐ’iπi6Θζ΄A;ΝY’@v2\r&³yΞHsJGQͺ8%9₯e:L¦:e2ΛθΗZt¬@\nFC1 Τl7APθΙ4TΪΨͺωΝΎj\nb―dWeHθa1M³Μ¬«N’΄eΎΕ^/Jΰ-{ΒJβpίlPΜDάle2bηcθu:F―ψΧ\rΘbΚ»PΓ77ΰLDn―[?j1F€»7γχ»σΆςI61T7r©¬Ω{FΑE3iυΌΗ^0ςbbβ©ξp@c4{Μ2²&·\0Ά£r\"’JZ\r(ζ₯bδ’¦£k:ΊCPθ)Λz=\n ά1΅c(Φ*\nͺ99*Σ^―ΐΚ:4ΠΖ2ΉξYΦa―£ ς8 QF&°XΒ?|\$ίΈ\n!\r)θδΣ9²θάΕΖzό`xΠΓzώχY@:Γ\\g‘ϊ@ΞζFYCXΙ'CHν=\"Φ#I+cFMBb`ΘγίΒγΖ`WθZτi.zGλσH\"’&Lυa[@V¬2ΜΉZΕ°NsΰΝ+{{Ρ%τη\n'K(οΔρ#’s4v#GfρφEKΛXΡR\0΄;Ό¨\$°+\"SέΫ:(»]ΗΆ WQEyέw8νz=ΠΓ1πΌH9ͺιC2³Γτ@_TK=>Ϋ ύ³πQπfΕ °p‘R-F9bv\0mjLΰ10ζ\\ΑUi₯M©ΣL―Τ|ΖΔCVΝϋ(TAΈΨ`I¬'ΠH7ΑB% ΔSM\0P©α[!;BHΘαY°0°½ΟC(#ΰΡΑ°\\WΑ+!δ>N¨‘RQ6AΨziΊF5 μpΉbgπHJoΘ7)½PB΄φUβΎA\r!a,E²RΜYΛB?-0δ΅VΈ/Ό@Σ%\0>aΜ8D,Wrπ#§Q§ΤTΠRύ%:δMDTΞΈjθ52FͺQBd4DΦ\n+€Ι+―?jυ_ΘE±V:ΙYk4;¬υ’€t[ΌJ άΈΘLm%Δ/(AτEδL¦x`Ι7€`'qBNε@sέΧ¦`ΫΣz€₯<*IXApΚΨ:ΆΉnPY8 ΐ]IΓHvQKh\0 ½TQ^Y¦ΓX»)qNa€φxz;IXLΓβGduLΖ>£ΘJp9)8Τό\0 ¦4ΜVj:\n\n)A© ¦,Θz# -ΈPΟPΪu%.\r (ΡAIΫUA±©K‘ Ϊ\\Μy AΡ^WG#yη\"e(R8_3DF^όpIΰ aL)`\\ 8e;Dνσ.ε?ΰθV\"°CcDH<βXΚKΜα3Mυ‘OΣih!:&Ά<-=σ΄ωΈBOέΦ±6F ~gΡDΗ)EL
\nΗΥ€UαDfΎgΧaC¦¨^©ΐΰΣ\nGςVΓHz«'|VΪRΧP¦‘\$IR«ViM\"M4ςβͺ°+Hz\0θ,Ύ²7c―ι/1Fϊ*[ω'A γUdπΙΫΘ55ΒLI0)bp9εγ`¬IΣ1²+μω £AoAuAώ<ζρ\"wX0Όc\n{³fqu.η»w₯ £ψ#Τi£8¨’Π|ύGΏΆό\n±POΡ>Rj^Z©Ρ ¨c’/`ρM|aΏMκP¬αu¬x±τ¨‘1
‘SΘΔ&₯όΕχσiK\nωρΨSy8ρ&}nτς²Z
ϊΕ5Χ0’vggε#΄fΦ2«aδ(ξt\"\r@(!Γ~²M\\ζβ’lw©Δg |3tχwΩΗ_Χη'ε(kύ\"n`Ζ4ζκ2κΒCχdxωόΏΎεΧ»Ήμ]Ό½1 ;μ^uμ2 ’Λ-2fUUΗ^lήϊΖvΜ2?;ΧΠηξύΗG(\\Κ=;>«±χοYΩύ¦sΞb{HΫνϋΩΆγTfςήΙ'QDD<έtίΚS ί4koΰΕf΅fVξG%`ES\"‘(Α\0w€£β!/ΒX¦ΐEοt₯XN;?Ώ―φukb¬Fl¨P`(ΒRLά8Γt1\0μ7§:¦c#~νC~lzΖcχ§DcNϊ7ηΖ5ν΄J#Δ'P>/Ο~7yp6AΜφ_Μϊ`πdάB―&4°w.΄¨v\r#4Ι&\"0dN#xΆμri¦jmόA¨jΔΩppvΞ ΰ€`Θ4Ά Θ'mLόΘ,ζβ'\r Ψb\nδ|MΜ+)βνNΰάΟζrUνΪ+/βffj`@LΚ40Ψ~FήεMP ΘΩtΞ₯fΞπ\\U`Κ\rFπ;§Ύεk,GΟ¦Ϊ#1)ΓJ\rρ^{~νHέΗ’'l{gfς0|`ο(%gΔ}ΠAΞ: ’£Ξ}8ν+Alp4άςητπνγΡΆF@Ίϋq4―νηTΡhDgb7ρ=Qe¦«ξΰO2ήRΕnϋpΆ`μOώΕ 1ν °ͺΰ[ ΤL'ή ήͺΟ7Γξ&,ΪQ\\Ιώdή&'>!€.€½,΅Δ|x#Η#
Θ€EjΘh9¨\" lebX\$£εΞ\rΝΟ#N&<Κΐ'Λέ\$\$ή+0Δήd<0cMξί(α\"lά-Ώ!Pω&Ο 0n G,RΏ\"1Kΰά^QxεΌaͺδΙξΧΠ{,°sΞJδιω²η/IΧ±PuΨ7ͺ0M\nz3.2ψΗΔΨC:=¦x@Fn b*ΞM\nfΝ<Ωή<ζ Fξ9«χς,Ρ/4ρΉ5Qν±Ω5ρI-ρOπέ`@δFΊ9²―7Ks5^qL7³xkΓ8a1·€ϊ£γ%bόg@¦DBCρ\$ςπxΠ;: Χ:εΝ0m υ;βy<1'60S1\":ΣΟ93lR3άCγςΙ²4’W>Υ5Ρά`gΨ2'ΔGgT=>΄ λ4!±/a`ζξT4σAHHβ5JcGIqοI:V b2³Πe\rf9τ24#ͺmΞΪςΡς\r΄ Ο4ΰ(CDπ1ρ'υK+@#CWOGς―N±φeό\rV;Βnμ\"e!βW\0Oj|?f|ΣΨDΟΛ'2E'f\$ήGafo¬&ΐͺ\n p³Ρ¦ΓΚΗ(ιOΤμ4’\\ηVmmρ°πΥqP5tΓνmPΡΠπ±φLB&\"’/E\$κzphbrtΖBώ? f# b9’όGHΎfͺGΔ&B§Ν(€9[4ϊFΛ\nΞ/Βld'Ε\$―*Β\$AcPJ(2S&v\0κMΗσOΎ4άΟΣφΧ6φΡ8Μ¨XGΦ#aQΖ’jcΜgΦ%ctΦ2rH ,<’
Υ{dπ#RβlΝΎ^Γό9ͺ\$CπAP\$p’ΧΠΐ’
hΩ(B²f ¬'IόU ήE£1iΐσ2\"epJΔ#ΞύeΗΒCΕύSLxuήkaντ¦Ά,ΛμΠ)€’§ΗΞmLΛ¦ͺ6\rοcΆ?kΡ8k->fΎ\n6\rΓxI’@@";break;case"da":$f="E9QΜk5NCπP\\33AAD³©ΈάeAα\"©ΐΨo0#cI°\\\n&MpciΤΪ :IM€Js:0Χ#ΨsBS\nNFMΒ,¬Σ8
P£FY80cA¨Ψn8σh(ήr4Ν&γ °I7ιS |l
IΚFS%¦o7l51Σr₯°Θ(6n7τι13/)°@a:0μ\nΊ]te²λεζσ8Νg:`π’ νφεhΈΆB\r€gΊΠ°ΐΫ)ή0Ε3Λh\n!¦pQTάk7ΞτΈWXε'\"h.¦ήe9<:tαΈ=3½Θ».Ψ@;)Cb)XΒ€bD‘MB£©*ZHΐΎ 8¦:'«Κμ;Mψθ<ψ9γΠ\rξ#jΒΦΒEBpΚ:Ρ Φζ¬ΊΠξγΘΨί#ϋj΅\"<<crΦίΓRbj²hT @-ϊΨ;\rΘή?ΡXθυ¨\0PβΙ\0P
2(ΈάΠΘΛX jΦ‘{βω ―³π0cΰ.,ϊυOb0;# Π7ΒόΏoθδ2\0yI θΜCC.8aΠ^υH\\ΞΘ»Ξ³αzΏCψα\r«:0΅Άγ\"γpx!ςN+0cj2=@P¬§ °ΰκ5¬TaΝ\"0;\r#(ξ[σRBpςΠΆΈ+#Έhl1]c(ήχΝκ%θϊ-\$?\r|ίx―β\r#{
0Β Κ3#¨ΨΠΛhλΩ
5Θ°4ΨΓ©Xΐιy»tξ\r²Ξ9¬~ι·ώ1!©IΜ4ΞΜ0¨¦§cF3θBC\$2@ΞK!άγ`Z9l)\"`Z5¬lσr«΄ΊΩ\\θΘΪ2ά»Z09‘,'Ί±ΊΊ3ΘψoRΡp/Rώ\$―ΈδΕB*WΕ0ΫΓ-ͺ[nώΗZίiή’\"Ί―\nβ³Α=0’8P2 ¨άX£N&)ό`ΕBΝ Ο΄£xΜ3j*€Μⱨ7Ε³hςuγAΨΠA8υτΜ9ε#8Β΅ΈΚV#(P9
=ΐkΈςΖ8¨42I[m΄#k:U¨U21φ#JD@TΨ S¬]P* θ©2¨UJ±;ͺπδ¬Uy-7+}OXλ%\r(6Pax(\\cBAg6¨7 `ΞA1\0δΧψe?Νθ‘B2u rSzͺ5J©ΥHwUiΦε`¬ «¬uΞΒ\n« ζA6)ΖA°|AΟ,dωΊ£β°Lω‘διΆ7€J°\\ͺΪ§ΠΰδΩm@hΡΉ΄‘Jήλξ3F|1Α@@£\rX .Ηδ
,P[O―=[=<υ\$:\rΒA6VFMα€Ά»#\\ή*ΰAιΈ>Dc!δΰs6H\n\0ΆTΏβ|P((¦KΕ2
Ο!¬R/!Ry0E§T4Έ@Κ\\K>+Q>>Λδ*\$dψ©0ζ~έQΚό7\"₯²I!ά4Η&Σ±42.u²ύ^UH)΄ΒF₯ΈPkΧh1
CBTK qafx3ζ^Rα\rι]ΊΦυ\nι
¨Π‘2ήDCΛ»/©%>'‘=,}c¬KίΔ\r
Μ1σΪ£‘ϊ.TYω\0Β’LsͺJfίh /d\rAΪΙ\n¨¦²
Je‘;'¨@₯Eq\$λj²Zc k2DpΘ\\ΙΓ€ky 9H0T\nΈΈ{P°rΙX¨ΧpΔδyΚΚ\0¦pβΘROnα8P TΆ@-ͺKΜ 7RΊqm.ΚΐΘiά·ΒSδrΙ«\$\r%\\«EΡF\rHE \$#}TωθQ\n(Τ Δ^!τ:DΥφ%³ξΪerMιΛ6τ>²hζeγ).ωΠLkezΊIΑΣ’°ΚN\\ΛΉ{*έ:υ
EΘΠΓpp D9΄E₯\neκΡΙYΉ±φ*RξtHzCσ5ΔΎ₯pX©ΦVsθί(³\$ΐΈα\\xtΥDJΛϋq4©!€πIZMb·d&IC1:\rFΪΜΛ5g!hζ'Μ’.2-&ύ5&ΘβήkGeμϊ±³@Ι:ΓAIHΐΠ\rEG₯1·vσ>Ρ\r\nP 0)έ‘>πSTύhϋ\$‘¨ΟVε|l.HA{\0^UαΌ1d%}€)b* e΅\$Ό\\ΎβΑ\0O jgPκs~rZΰD%φVΥ5tl4:ΛZjmFP΄Θ₯ΧZπΚζΨKO=δΠΐΙ«ή‘―[kμ-bΑv₯oVνw°χ\r’ΓΔ½JA#€|²KΌλτΕΎy-½SΰΒQ첨+PΕ0Έ-°ΈH%ΖΓlIZΩc₯\$Ρέ)Ok\"¦ΫIΰνK9APZΆ_Ά₯fA6uΨ@o7Όrκ¨iQΌΌΤ2ΊΎa΅RCξΓΥςsΖϊͺ5<nϊ*J2άΟτ;xιcEHm§―ΘE2\\9ο:\"nZ¨φcnνNΗ«²ΔαΠΖ@^EτήB#DΆΞgQ
K\"+¦Ϋ7λέΤoΝα ½ςηΖώRίΚ1όδάϋmvuάζύOΏωoΣ&KrΌ‘MΎCΞΜ»¬6Χu/aκύo/4^§§=Yσ¬ »Εμ]EͺήΙΩ} ηBcπ‘Δ[ςN»οφ\\ηefgΚ1Χξ2ΐΙ}χo*ώΎ\\ΚoΟύS#΄PqjώLlΣπνΈ€ζec»₯2θς3Ξΐ4’ζΘδΩ(ΒΙf¬o\n\rΕ28§, ’Θ7.*\"z>#;\")ΘlxOΚ³/ή%\$mΕΠΙΞFΚ€άfπ¬r\\OjοΛΚZplχOΔκttώOHΌ₯ΤctΞμςοΰυοΖ\$μπυ0κ0q ΠFφβNΙΘ\n«ΤΟπ·\n\r8λk`ΨR,ξJε€/lcO I¦:EONξ£o χeΌΌ°ρ om ¦\\Η’;θ)&δ?+β/
΄CλΦ41dεΟΗ&: ήPB'¬ζFε΅\0¦Ά)¨X¦Ντς:\rq?Π
;\nΞύkΛBG_Fυ1>δf\r±EJκ1O΅&δl΄Λu\0©λ*υφ}ΡC°―Τ4¬ΔΛbqΜ¨ΠΚK1ΛΛQ₯\nd@;qξ¨iΐζ3C\r£±’pΔUcΐΨQ\"δΣ±(ΎI^Ύe\"ζmΕ %(D \0 fΣ’ΖLbά Ν!:]’0ϋ΄ΧC#Χ/²Ωd8\rV\rd\rmp¨Αbϊ¨ΣQ¬\$(ιfθPWλJ\n\nγΎKδ\$νjΨιh ηMΓ(―(B€±Λ@χVnμ#Xθ\rφ&nΰECzε6²Β7ΰZj2T\rͺοΓL\"ΓQ%ΐΩ£Β£βE\"0rΜ}.@hB0K |#>cKφFξͺιD\"οΌτAfΐ΄ΚΗ>οiς-ϊΉq2JΝ2½1Bl\0ΰμs\"θc(»°κ54³2ΓBώBb2+ι)S2kΖΰξ^¦d³k°#&ͺ³ \rξ΄oΟi>.~ίi8H-°ΞbBΏBtΓκ;ρ5βΪ)ζ-FΊlΦ£τ'€U\"0ΐ3ψ£JΒ»άΉΓ`B/κͺ@ξ-J±e;Ί0BιΠΆ¦Gbάp°Ϊ1ΐhδ%Eh₯CA3Πο₯DΜ(π¦kO}-@έ`ήR I©aκdΜΣc9G)%-νZ
―Υ;χΉϊx΅9>VΨ \re 75¨A―5Υ .πΉz\n«Β0T\n’4i ψ5© ή―½GvΘnd0ΠΓ#obρRp`pAr ΐ*
\0B EΗE\"ΐYr·‘
5%ό3>ιͺr)ΦψBxp¬\$rzLN?ΌΕi»Ί>'ΝΆ:΅¬AE_O*Gζ\rHας9%γη6Ώπ€`χ?Ό7zΒ 3ͺχ`8iz,―έιΪΛΨObΊϊziωΣ₯jπ¨³Τήdέ\r]μ7γ|pDΖδf<13l`5ω)`(5 ΧD¦K=_€°;―ό|3Ρτt‘g\\ZμβrΞDΡLCgHψϊ=λf*[ΐR|6Z/p Σ’έ\nΆΒΰΘ\nbΟ5\\a5'uΙΊJ£\"dΒ‘tk
ΗRXuwζ_ίιRTΓEC{γS\"ΊΚ,tΪ\$nΕbΥ'uC?6τύD]FΈΘP 06fμα‘@ή
’¬MTσ«xSΒΔ3\\4ΫybΜ}²βΗΜ3g‘’\r*C,=2Έ:ή¦LΓ!F, υΚ°Ρ:6λFGuξΨΙ3½ΎΔh^`«\r³mΘ΅:δ§Bq£«DΨS`οXνbσB(}ΰojP’'΅Ϊηβ£?lRΟΑ~υΈq{3F-ΜΞΊ¬,Nξ²Έ²άrεΝ!~Ή)&fΡ±2.6π1LPΗ°Ά₯FέcΟ³\nIRS`αΈΡd£5©ηͺ½9\\ΈPyΚΒΩΧ°ΕΉΤ^οv οπ)»>tΓ8tEΛ¬AώήΰΘQηI0ψ°ΞΟbΟτ#gͺΩ#βn Πύ/θ+pΫπώ-0,ψΜJ8΅άΈ9 δΤήUΝhβώi\"ifτkΔ¨A ΰ{ΚDrΪ5εD0π^k,ΜΙκjPh1F²dbΆvΜέY―6ά’6\0Z\nn9oj\0P ,Ι¬άs\0¬ΨώΗ4uΰc\\\r¨ΔPΠΠΉ\nπ&NLζΟΠΚώ0cκ3η°Φ5pΰuπδλ`xΠypρ\nπΪc,ψgΞCΦ\nN:€°σ<λ¨,υοΚύβώμμ&@ωOγ5ΞΎ{Ξ’ξq&ξ©VήΝPΖ\"0ί#h'pΜΝlφΕΝο,ipςώPΟ_νρc°ΞΟ’c£€\rΰ0\0ζC―ρT4>6THBμ\0θE©τ #ZBiζT‘«ϋνWK&Δon+/ZΔ+ή Ε +Ωρ¦_`Ϋ€+paQdίMή' \rδήFΙ\"α-ό=CaΚaΡ\0ώpέΝΉ!q}ΓΎΟ!%g\"Ζεψγη*βς'\0Μψ€ςB)±k0ή1A\$PΝ#P(&rL(²E&nC%Ξ>§RΓΰ#` JM¬ΞPgΐζσΘαΟj10γG\"g)ρ5U\"¨¦^ε1pjκ&ΕDΡJϊ2ΐjΔ v1\rν°ϊ2fΠV#g²\nC\"`ΦkπGζPξb#υ%/ΤϋμQϊn}&ϋ/;0γ>³/ςΑ1Rύ#Ν1ros+ιω·Α33,x\nΰc«²Hΰσ1Ζ'5ε_4275ΞUσK6«-δ²Z²½%Ne FsWR)sδσ!π9sk#2Έ&`Aβ9\"χ%B=`\r\$R`i\$e A-m{+ͺ2,<²ΔΖ―δ)ΐί=bf gόm|₯ΛΙ
.NΟ;H|%,\r#L'qFμ€hf\rW>Λ2Ό`0£°όjj{+ώ\$FtFΡΆ{ ͺ\n p4 ήεl6&q>οΜώ/Pυ7= ξP\"b;Eτ\"λM+\"Nη―fΓΓ&ήmκ5-iΖΚ0ΟΔ₯C:|¦’:βG874#I²4°Bt.%’fI]H#'θS¬>QT-ΔΒFjLκ6:*βν½2πς#© .l<'\$SτθΎη\\Μ£#Ib: ΰGU\0u4λχ ΐΙTNuQ΄ΛBqQ,0Q\"ςφκΣPΓUΘM£.(ΒΊ°oXΎdΫ#Gr+ΟA\$Ϊ\0Ζ°dΛ\$rUdNΒtQ-Ρ## PρT-N'DS\nΞ€T¦H}½k½-(KΨTJ¬¬΄Χ4j0ΐb2£aΈΰs ]`ζ ͺ¬ήtΞ0ΠωsOjΆωC;3TA]ΊΊςϊaOΠrΙ»¬η4ΥvOΩαxBΆ-wJ`εάλτΖ#§k΅°4LΎ[_Φ\"΅h²ευ-2_Ι‘Uk]Γ΄±»€u*»΄ͺ\"MΩn?O3ϊ’)Ϊ\\Μ(R\nB«ξ’\\₯\nhg6Κ£p7kZ~A@Ω΅πL΅«&
Έ.WBΚΩ«κ\"@I΅’€1H@&tg:0€Z'δ1βΡΑvgΚΞνCΡB¨ά5Γxξ7(δ9\rγ\"# Β1#ΚxΚ9θθ£α2ΞγΪ9σ(Θ»Ϋ[y
J¨’xέΒ[Κ»+ϊ Ίι\\΄FOz³¦\n²Ό]&,Cvζ,λ’ξΌβό‘°[WBkΉ4΅F9~£δlDΉ/²΅/!D(€(²H@K«Cβκό=A²PX€’J°P₯HF[(eHΠBά;©\\tΤCΝκ‘%%%ΪΒπ%*d«7ξ΄½2P»uνh₯vΔμ₯,Ν« ·β,FuΣΌ4Θ€ΘdΣn΅Ν@gAuκ‘0XZ^ΈeκAͺϋͺKq8\$τera,# Ϊ4Σα9N΄ρ=O\0Β1sη ϊTα4Νslή;# Π7³ΈΒOΓA\0y―Κ3‘Π:ζαxο»
Γ} LAtΚ3
γ(άμ;δ2αθ\r³,ί Σ(Ϋ4#xάγ|Ω5p₯δ¦ΟS°―d·ΰqYR`μaoF>RYΟάD΅Ρω»:>=cγΧaλΗjςvςΥΎ΄:P¦rο«Θs
\$&rX+#έ¨#α(ΘCΘθ2>χΑρNyZb^Ri_xώ*Ζw)s?ObΉγj²31u.ρPδτ]3Ί μΩ&5π’T’/\$mΛY°\$ (\\:£~w!ΰΒΩ%±vg\n±)eXFsZm£(FkBαLΝaDE@Τ?r@'YΪ\"\nΧH½B& ±°QλΖ9FνYtNηJψ¬c§uLTb \naD&΄Δ‘`€ hRξxgJ;ΘrDUqΝIνΘ)A?Ος1σ’ΑΜ:T¨H#ΌT^σ,2τΈVς)J=Δ¨>NμΖΪPEΓ\"Ό)«MδB\$H\"tnΑΣ2κΡΉθ\"υ ii¬6&ςθ*a\rΣc'I1Γ(x|aΉ§Ή`ζ]ΰ‘a€Αΐθ\0]-Ν³¨ΙΑ6jυ3€~]±e€ΓXkI9\"#Ο{>%ι’/₯¨Υ·xT<8FΑNΙθΞβee*gE)\"Κ!Ν:A΅:Ap !9φKημά'Ε|uΙ@Τ±Κ ΔTΠΛBΝTς€μQ'KE }SΊqYFLΗ£ΖtΙΰρ|νω:%Τir ((x£@ΠRΪtr!ΘV=gν96PΗ5HdhM6ΦΫ[{qnmΥ»vςήλc~NΑτγ2Γ£p`Xw)ZΓ.β^‘ ςHΧbyΤΆZH΅ΟΊJV©SsSPΠΕ\0©ΔDYΚ6XΎ_Ρ1£ΊΗωΟlΝ‘΅6ΖάάtnΝα½VΆϊίά3NjΨ·§ς§a[\"π·)Vl²KG qSk0C΅Ι
¨#υsPΊ*.Ήδ£Β½tJmΣB!³wthΘΫ(PΫ]’‘e\$=bφήμK\r`6ΗΐΓb¬a΄2½πΒdaΥ¦4ΰΜp°l\rα a6²ZMσ\0ΖΪ«n±!6Mr@ΙI+Zt«ΕΖ ΞΘΏ!Ζj§yΚΐΒ7φ`ιT4ε©π@@P\0 Ί\\ΛΟΈ>Θ©Κs/ε!ΉfμMhΖ!½° LΕψu°'Δι0¨okΨU/aάztkαΝ?4ΠAq\rΑΑΆώ \\>\r€1γ~Ϋ~Ζ8;ΜKΊJTIή\"tωraL)idΐTΑIυ\rώ3BE\$₯©€Ά¬g\nSVs£¬7Wϊ#ή%Q*ΑO4dΞΓ<±Ά2Η%δ@F6Hjbδ²P€ύ\$ZzνK¨jͺήf_Cv k^DώΤχτ{+ dDόΐ MςΆσCjΜ53υΎ»³R k0Gβ'»ψ!Qε₯₯\$΄(π¦%@RΔλΒ¨²©T~ζΝ:ύύΌnΩ>R6τ2 »-~νoFdνΝ§΅χΝf£·ͺDα J*Ρ_ΣΎΊlZ^EλvSaΒeΫΞδ`©\rς%ΕBSΖD\"^ΎWα²ΩDί@ΏΔi3*·αW(ε±ω!/
'Iq\"P#/βIH>4gYF&|R8>*ωqΔT€Xo²)1jΔμών)g3(ήYtλe4η1ψM*Ϊ»J+ίrΩωλ 5ηS;iΛͺΔg'?#Έ|§σ΅9Hν@\"Q\nπ5;qΑJJYv)ψrXJq>S€¬yύΉΊ½1bRΡQ3άΐk6t+Pύ HNξ-%βα%;ζ8CBΪbΒLϊ\\uiφ&/zρ-ψώπκΘΗ`'`tΌΒ*«εΚx,μΐΜBθ}LΝ’4εR#ο>ΒN9ΞXXκπΜ\"\rΘΎ€cθ,B»§ΩΓΜχm¬7kΦOϊΘδi05―μI'¬ΝdB€η_β@¨ ΏPύO²|PuPΪuΠΒdΕpΘθ4xJxΜλόΝΌ'(₯\nZ)DΨB((Wφό,χμψ#2ψcj/f0-ΐπ τcΘBΰ`P€&I:Ρ\$!dΓΑI8χυlΆg*Ε\$x\$\n\"’)!ix z€τht η\$pβG:'Hυ+6tζcΎb¨Jd ¨\n`\0β€Δ\r\$ζiFΤΡ\$ξΔfGΖPgΤIN΄φ Ά/D4ZΞϊgΜΰ@#'ΎΛ’\"X|±ώTβ\"6ρqμ&δ£+4Λbsζ?β\\ύα4’JZ'¨P5βη €W JC!D,/\r2c\"Q΅\"\"05r4(R8Iρ#ξ1 '9εΒΎεb0β(ΎθΑ\"E@ι +Ρ{ͺUbΑςNΰ²p(PπΖο²=%μ\$bz)B§Ν**&r++hΘρx’P° %Ζ='2―lϊ&Ξ’Λόλ₯^0ΑλΔT¬±\r’΄Α^%Ο]PX&ψ'~ψs\0 D%:;ξΕ4υeλΓΞε3ΗanπIl& Ε-p4©dOψζ3ζ5n&ΔvηcF₯^XH zTzͺJ-hIp.EP¦F₯<<3ώσΑ2Ϊμͺ[π8\rΨa\n(D3\0ν¦κΟ:-Η€Zρώ>ώΟρ#’²sά!³ΰIG^ψΙ*q&Αk?
=η©?9v=,¬ζ\$>άΠͺ₯@Ν³υ G«@OέBPθCξ°Π?Τ?τ6£νBι8D\\bOT>:\$h(*JI\$ͺ<)ͺR‘bfΠ6Θ\n8θ\\ZZΊpύ3³Hι';υ;β%pΗ±ρtx/ήΝξ_OΆ
~4Fhφ~Μώ%LΨ}¬Ζ%κ¨,ΐSEρ `Ο=\0SεCQ>΄4YieONRaZ5τ PCEITEτ[Q/ζφl<Δ)DSν@h])Iπώ΄ϋC4]\$Δbc±QiEΛ>υ6‘©vνtΕRΤΙS.υ-dΙ+(v£Ψ5*²Y#_&\"&b½&²(|O²GW*Wkκ-Υ}'u!x7,ςoY\r'O{)Ρμοn£%ϊ/Q8;#1σPHπ<5FUΝ\\dPβD)\\τ?ΤΗS\$ήλ΅γ:C΅^±]\0΄WQΥWSR΅8GΦ©iΦο£ &CZΰΰ%/\"wrvTOΰ^wBKb#ΰΝ.4.M~³Κf9Φ8νCΓ7γc¬Π-l'wLmρcΘE\"\\Ύd(i(KΝυύ\\V<ΝE0Θuαiu^oYQMWξρ&Φ@cβD^MφΡLv£w-ρMο[=Ά4w§[5)
)RυUΠωΠ0γΗ_BΣιTU!npαmvο% SU6VO`ΥΣn¨ x5ά³ιΥOuΥOΥΪ,Pλm±<φγaW@·1r5OpΧVuφv@x―°νλσr !ΥQ\0μrσ7\\΅±B\"\nhwl:Κo
JηKΜγΓβπϋ/ΟΝ§Φ5r΅#WBcYυΣBυΧpΡY·¦Ό·_e_UGY\rΦp«UW±uΌ± ψuθJCΧV7Ωut,·~Watd³FΑͺΰ[p₯5|βΘwξηΧσ°«bνΉ2hωγAeσΕβ€ξΆ«PzΆσ]χΘ }°ΟX|ΦtΧΒ₯v½\02\"J·VS{χ:xc~¨οψE
ͺX7ΙΈC
\r
δ?BNvΤ+T1ΦεB\"qv\$7|χ}HϋuGglΈ{p7ϊ<8΄xΉ_¬DΥMoC<,ΚH/U{Έ―V[Γ§xά³VΈOεΥ+ΣfψΒ~WΡGKΨ%1Cx!ZδotkK(XQ΄ψΡw±B!\rδUο6ί
χ<Κ£§l~cxD7:\$_uxσΒ'δͺJ%’D¨Φ}¨]ΒU£rΗσΠ!jΈ€BS±±['Ώ5c`VΛD7Iqό΄\$~ΛΟ#Q,(?\ngυPΩ©9¦·RGQX΅°
R§Σχ'cbδ)*κ6iΎ\rV`ΨΤΦ©ΆStNKΒa~νp dWθ>5.=%1hWΓekγ‘γΎBCAy\\4} @\n ¨ΐZ@9-Θ?A€5΅\$9υ¦B¦EM\0r|ΝV|³§_Θ±\nΩFTO;8ύmΡωdηΰJδVcκ[ω«=3³s5ςη6,§QkBσΞCzΈ;λΔ³V’²η°ob‘NBξΝ2Θξ’]dΤϋ=o.€₯er\"!63VH.]―OξζSt³rCGΞ`_ΛsXkB;DΗ‘‘n(TύΦ+©RθU‘x;>Ϋ_BcjΔK3η;q§ϋtXdω[TuGσΉ[΄ΕBl²QUG0γMκ5¨H=6vNe6ΚJe·ΈωyFΒΎINqeΫ 3Ω½hϋέf1'»ήκΒ\\ 1zθCo;!G§ΙoΠΑP€cΙΓ\";)ϋw:Δ+YGc
kp«3ΝDwςγΎb½Oιτϋ‘!gHρNU2b+ MλΆΩς8 ήΔΔμό|hC
e£X\rθ jQ;ΛΑf£wQ.qG^E/€3΄)ΐ";break;case"es":$f="Β_NgF@s2Ξ§#xό%ΜΠpQ8ή 2ΔyΜb6Dlpδt0£Α€Ζh4βΰQY(6XkΉΆ\nxEΜ)tΒe Nd)€\nrΜbζθΉ2Ν\0‘Δd3\rFΓqΐδn4‘U@QΌδi3ΪL&ΘVt2η4&Μ1€Η)Lη(N\"-»ήDΛMηQ ΒvU#vσ±¦BgήβηSΓx½Μ#WΙΠuλ@ΎζR <fσqΣΈprqίΌδn£3t\"OΏB7ΐ(§΄ζ¦Ι%ΛvIΑη ’©ΟU7κ{Ρε9Mσ ό9ΝJ¨: νbMπζ;Γ\"h(-Α\0ΜΟΑ`@:‘Έά0\n@6/Μπκ.#R₯)°Κ©8β¬4« 0¨pΨ*\r(β4‘°«C\$Ι\\.9Ή**aCkμB0ΚΓΠ· PσHΒή―PΚ:F[*½²*.<
θΈΗ4κ1hΚ.΄ΈoΌ0xιΓΟτ35ΣΨζο>Ν+έΜ©L!ΈώΚ’7C|&\rλάθ7ΙSβTyc*# Ϊ΄ΎΠθίOP(α₯³2-Im*ΎRcΈ:Jc¬ A#ΒΑδ8410z\r θ8aΠ^φ¨]Tγsμ-Γ8^Ό
φ\r9xD₯Γjά-#2άΈΞ x!ςh+F\rΓΘ=7τόF4ΉΐSΛ7θΜΐ:c’*°,\nΓ₯M*0L#ίΆ¨:ͺ<΄ΚΜxU\0Δ<―\0NQeΘF\r¨ΫGζg/8΄S\$Γ%8¨ΈΓ_=H+αB Λ £d;.xζΡΝΨ:θ1-΅A±L€i&Qk4e6η9©*χ\"ςΔ(cγ³;(&<ν0΅WcS/ΔφΔΞFΥ&κ)»ϊ μ=7F'.j.)\"`u`άVjψv.RSόKPxn-)8υlf\n9υΓ+Φv©Ν)?@=\n\r#LΔ΄ΙCv\";ΨΈΗ*χ₯&kΪuς«)d4qιB;Aσ#PΞ«DhσΜo©7lΣ8€CxΜ\"ΪFGΩP’GJ\nΌάpZβDVK35>¦KHsBΙΰΞKIΤ½l«ΰΚ\n)&LΈ’τKi_Έα@@0ΕI@OdΠ*γβFq*C*U²}²#Ε,c:²VZΝYλEiPξ΅Υ2¨?+uoΰ^Ϋ\r{^\\ΐϊ0bΤΌΧ¬+
°\$α#F\nH(Lμ[Ος8I±ή\0άΗ /Εΰ.\$Ήp\r&1²|QYΛAi-E¬Ά\"άKyp?ςό’ςη`ωγBΡ€hΠ\$₯x`P '!v μεNαϊ‘Ι0c~g¦Wqΐ\"5Ϊρ‘7―τa,lϋDΚCf 8*Kdκμ4άRQΒp430cΜρΑΘSΒΧβΘOΜ4@P α½ηβ4\n\nP))0ζGCλFGm0Ν1xf‘ r4#ς.s;©}aC<0§D―`n\nψ ©ΚCΉ0%ςΘΈ,ΦTH©mCeωh^S\nAκb\nyp.YΖ¨Ι₯7σ
ΊάK&³QgΕ4<'\rm8¬K\"~I'Ι\"0ο! KuvΐνRBͺ:!*a4 \$L<΄:ΐ)\n!4ΨνH!Ά\"Ε΄J©zMdv *jjxO\naQ[ΧrG 1p8‘Υ\$΄¨z0ι’xϊ k6o(~|Θ΄ξLk5\rΖ
*Η₯a4U©Κ`ί[PδΑΰΜΔ\$πΑZ*P+XHήA'\$h3Y2‘VΫ3jO\$6 Ξ ΈσΤ έ`Β UΎ‘\$-€bn°B αH)_βκCRΕ#b-0R\n€ΚβήΞ!qaAπαqΡ3`1f4έ@JLxbΰΤsΙ±εCfνΗΧ―GΪ n1\$0Ljέρ%xΚbF’BβN!ΏΖ―YΤ37dιΙ―Τ)@ΰCsIYE>U@C\nΗΪ6©X₯bΆQΥ8Tδy?'¦fΒTVaτNt5]Y ₯\0€΅yHΛgwΚ#w¦ Β2oNRΨYΛΖΖ+dΔ;»Sj}xRv―³vNΨwKαθbϊlΩeΠΊ³~΅[2n%ΐΌ΄ΦZN{ͺaζ!°βHφgΙνFΟ*Μ΅μ%T9μbάMCuς\$AΒ[ΐζςw‘I«½K<°r)άIΠ4WΕ^ΏQ%Όη¨/ΈHΤ·ωbUr€ΔΤϋΧβXCROWΛυω΅PCΩH/+l½ο`ήΛO\r|,μκπd]ΐC5Θ[FΊW:γ<¬tώE`\noLyMνΎ0ήή5αyD΄¨fΪ©mΘCΞ!7Yy'+AΝe\r³ΒmEυBΧUICu½ίψ’θ0#hΏ-Ώq+XςYiX1ζH|\r€·΄ΜΉYΛc &1χΐC2ͺ9ϋϋΤθ?³υά9σΑνzTz~ΔΉθyπύΎψΪ΄΄,ρp> ΅₯Ή΄υ³ςδα1uΘOdφ`p;Θ΄ΆΌoΙ3ΐ%?ύ#΄[gΏeu¨=S¬iS _PΙ±rςΘnbΠlCP'\0Γ`RύΖτΙl€POCoΜ#C* |Κ0*OgLVμω-vωm,vΔ\\<ΎE'rιΗdφpNwPHbοf :yξ\nεηn6ε£&φ¦δ,xͺ.K,ͺλNγ\\d.ζ0―+ΤΨ ψ½ΠRΘhω\nd6F+―‘€ΨP]ζφD,fδBCΒάΦτ8&κΟ,τ:ΚΎ§ζ]BφG ήBΒd^ iCPΦ/&LDpΞ½πλ\rνp8βO`Y*Pk«S.ρ' \0άFP³OΈ1-ttcΔm¦k\r\rF|9orϊ\rIπTψ±eΠ=LzΒjάͺ0±kNάΕpδqοQJuh±v7ρ’pζlγΒfhΰ1\"X8bJ\$.Φr€F>ΝΌ\rκΜά&1x1ΠάOρaΎ0qγqφq7θ*k©λi±Τpν―ΈΎg £Gρμ;q€ε(j΅\"*ͺΰθXγ.±Ψωr.c)28ΰR3π»‘ Ο#)h\r\$Q(Pr!P¬ψ0υ\$%gR'#Ψlcq'ΒS(ωN(SΠ_&ςJu(NlBU*%FγΆyMΦD²6θrΊ'²RΓ&Βh ό\rόWΒδβΝΙJάveμ―μ΄MΕθΫμ΄Θσ\n°Ι2ζe#\$ObP.³%gmι²ζBfβ
1π3\0L\0ΨdΦ0ΚϊD
\"D#'β0υ@δ\"iG \r€0@¦ ͺ\n pςc0bΤ&; ζξυ o^ΘBH ° ζ€#pmΡIμ@Ζlήϊt/hΠΫe8ΓΘ₯Ρςm€RΑ!υ4d_eϊ \n0₯ΤΒ#ψΓh<' ₯4J€jBφNψτΔΎ9ΰD&2#H| κπ».βΘ₯ JIbτtψβϊλͺͺ\rB χ&Od/Τ,5##γφxPoN¦lΓ αDOψ7`CsΘ7m!ό7d΅'γvτιΪσ,XCτT&UDu ήΔζvCM#μβήΡ\\κρN/-΄£κ%
Υ2©HΖ@ \0t @¦\n`";break;case"et":$f="K0ΔσaΘ 5MΖC)°~\nfaΜF0M\ry9&!€Ϋ\n2IIΩ΅cf±p(a5ζ3#t€ΝΞ§SΦ%9¦±ΤpΛNS\$ΤX\nFC1 Τl7AGHρ \n7&xTΨ\n*LPΪ| ¨Τκ³jΒ\n)NfS9ΰΝf\\U}:€RΙΌκ 4NqΎUj;F¦| ι:/ΗIIΝΓ ³RΛ7
Γν°a¨Γ½a©±ΆtαpΖχAίΈ'#<{ΛΠΰ’]§ξa½Θ ΧΐU7σ§spΚr9Zf€CΖ)2τΉΣ€WROθΰcΊ½ κφ±jx²Ώ©2‘nσv)\nZή£~2§,Xχ#j*D(2<pΒί,
β<1E`P:£Τ Ξβ88#(μη!jD0΄`PΆ#+%γΦ θιJAH#£xΪρRώ\"ΓΓZ9D£±\$Ύ½(\\Ώ )0ή7΄ςp¦χ³rr7ΓrL³Α/N3pΛ:\"Β`ήΆ\"¬ Nxλ ςϊQrP9ΛχZYlΰ^~]0]kxE
vjο6±u.²{R@gAeQ_ 6€{Cd4=©’₯\"bC)5&ζχ«₯ΈΟpx\rΨε~°bJΖY)f,ε ΄ϊΥ:Ul>δ(όVςΰx‘ΐ³°ιAσλ8¬[sOέΰ *D¨χzΟ#rV’H@διΟC§ΤͺCBRͺbΡνV‘±Γ9X‘ΒoUαΦ*
LLpρΔΆL%li1)|4ΠCΰi&AΜR SΛΡx#(P2γ\0γhqH@ΡΓNΑεα\n (N€&
cα
J
\" ΊΙθcf\nΊS@h!TδΑψ«ζ oςΈ6dΡ*ϋ@jUΣ\\Ήpp<ΡωΘ\0ξYh8₯c²γ[6\\c6½.¦S\nA6 £ΪJΡQaΩsΗCvcΡ8'K ΨRob―IS^€2 ηω£Έ6ϊ ¨I\"δΛ*WE!!sb¦γOθf>!ΆE%AIΟhc&Ί\$i ¨P αL*Χ¨k ]5Δnq4φ«\rFj³Vhζυ+y.&4YηΠJ@p¦\rC)[\\aν51Ζ[τhΑ\0SqπάΡ5 Δ0T©ΆUW2#QF1¨τ1&zΑ@ψ¦¨ΙVo’ nΜγZ°φW|iυ.°tϊΥς\rΒS¦}ΟΥΔηhlΙε ΐ)\"S5\nTΛdX*΅:ΜΝnμψ.eΌΈζ΄j`CΣ! οΞςBιέG)ΣΒcOΓΌΓ!¨ΜΫ*s4!;€υζήo &5’ΗJoΘQ'%ΥDLFϊυ\nΗLΛΦaΗθΑ.x΅«d½73pQS ΰ‘0³HΦ§%ZΌRk¨Iα\"
\$΄δ
α:η@`ΥΊη^mΟ¦Ά1ΘςrxiP\"
` SKXΌμq4ΌαP 0+Ί\$4―ξΈ4SώΪθγΐξP£εZiM\"VίE©Wψ`nΚ2Ύ\r€ΏgΥωσΒXuΛeμ%λ§J’&¬΅ o΅][O\rkδΠΥωzΛ(;T―bΒΛΥ`;ΰπ1²NOw\"Ε0άHI%lΊa?J%\"άa;κΫn]ευΤ²ί_;§χB[Βe,΅oβPrOU`gEv£X}tΰA7ΝJ570κfMΖ₯c€½Ύ|υαo%Nr\0¬Λ;&ίSρ\\CΖΆμΘ)Ό₯±ΞuHoTζΌ¨οe9z\\43uΝbΆq£τώΓϊί9rΗ³υ7ξϊγLOΣΞπ§&kΔπΪQρ¬¨V`ΨΪΪIΏ?&΅ΛμJΥ#Ρόot'VAκzΓΫθΟιCςλπ’μΝ
γ8fGΎάί2Z Χσr(ΟDσnlΕΟLNruOώυΓϊ#Δr¬εΠΔPφΞl/sμt'G\\_§b#Τ¬Ο
οg³F1\0οo\0P6΄v0Mdξ’φ\npW°\$υβϊφN8ηώΗπΪΒ4Ες!φύ\$βγ ΪγhP« Υ9¬Zτ°RΉΠΥK’Λ°lφ.tJͺΥmU οΟ\0`~k85ZHtXγ6=⨣\$.ΔBH]h0πsΠπ±οΰe}\r ι\rγ¨φ'ΤIpΠcψΞ.Σ\$RΏe\\4\$Vβπ³ muΒΤ] ‘jΥBZ»οΐV4E>γΆ ΚlΞV#γ·\\d ¨_&&ΦCLiΜ2ωΝ0ύΠd\nΝ¬d+ΎΕAfκΑnφ#1ΘLΡD#tυ4#Q¦Εο>|β3#6¦Δ( `ΰfNΡ\$OKD`£XEΕΜQΦwCi:BΎϊ§pQK ώλώOΪD&ψ\0VN(kκ\nN2ΡΐΗQFΓLβLfbΞN\"dώW9x>-<ϊδΫ*Τ
HMI¬\$4Β0\nN¬xCΑ9ͺc ήO ξ-CY(όΦcή3κ0Ζ7ΓjΔβ\$^+Όwή \0@ t\n`¦";break;case"fa":$f="ΩBΆπΒ²6Pν
aTΫF6νψ(J.0SeΨSΔaQ\nͺ\$6ΤMa+XΔ!(A²‘’Θtν^.§2[\"SΆ-
\\J§)Cfh§!(iͺ2o D6\nΎsRXΔ¨\0Sm`Ϋ¬k6ΪΡΆ΅mkvΪαΆΉ6 ΌC!ZαQdJΙ°X¬+m±cω[Pυvrζsφ\r¦ZUΝΔs³½/κH΄rΒζ%)NΖqGXU°+)6\r*«<ͺ7\rcpή;Α\0Κ9Cxδ θ0Cζ2 ή2a:#c¨ΰ8APΰα cΌ2+d\"ύ%e_!yΗ!m*ΉTΪ€%BrΩ ©ς9«jΊ²S&³%hiTε-%’ͺΗ,:Ι€%Θ@₯5ΙQbό<Μ³^& Ω\\πͺzΠΙλ\" Γ72η‘J&YΉι[Ν₯MΔkLn¨ 3ϋκXΉK’#) \r*FΙΜj/©l½ΓNδ#ιΌ©5(ΖςZΒT3ϊC³TΛV2zK3 Δ( kΩΒ°Ό3\rΓ°όB#Ηo`ΟbB°t! BΈ:\rxλ!F9Δ±8XΘΠ9£0z\r θ8aΠ^χ\\0Χ5άαxΚ7φέΊ9xD‘Γl\n=46ΑΓHή7xΒ9QμΠΑΘ5WU£€3dξ\$¨jBΑΗμ»ήεͺάξ3MΣ<ή\$¬kϊα DΏD.bσ’,Θ0Cu£#Ι@N£ηταΎςΪΒΐJλ\nτ²hϊeνλ'Μ3ΜΙ!²_d\nβ[KQτ0:zVjϊΗD±Λ\$D#¨Yc01₯::40βΏΊnͺf2£ζyβΐ y€+Ύο+B'i TόsΊ°σyήf΄/Ν(\nbΐΠ*ΐΜ ξΎνOΜw΄Τ±sTγ}Ξ]'Ρ7|)βΆΉ*GIxήvΝή:‘ΰ?νΫF)_?.q?iΜ€2jΞ¬L:wεJμκο¬*Xΰ!zjaΆβϋHsB±\n0@0npΐCΐt_k%€:ηzWK!Θ:Γ`l(’*Δάtvg§(Α«Βi’qG*Β\$Σ Hρ)x
\r 6aBhΖ8Aaύ{Ύ)Ι]zΩX9 &RWK:1πΰAC£>m!μ?-.\"Dh\$L%q=Eμ1ΧδyV0qEa%JΡ& ¨\n\0C,(9\0κ²Oh W\nθ7 uΎΰ¨iρpΖΉW:ι]k΅w―ξΌΧ¬^αΙ|―°^
PtaΛπιPΓOkbem₯d€ΝΪ=E¦ά’a!*κΜΙ»btίIΚ>©2LA>€κͺΝ’RΔ3Χβ\\t.₯Ψ»ς^1επΎδAΊ\nJΖΩάκ8d(ΔK |ψ§ΣΗ0p%jSοΕ+ς\" H:0
[ζhq3T%@*s0Z£πhBU0π@΄`l\n!hehΑ3A)\nΓͺΖY: ΨΓ9μ€λL4¨
1rI0έ*lΟΕ>5(₯\"LMυ:2u1)εqΖ%ΉβP B\\PwD ΤAδ 0Rq¬’5§’Ψ|rͺD@ήΆi=p3Σ%΄PΜCA½lRL@μ!ζΦ8 ¨UΡΰΰ΅Φ\$DΜκ*Ίλ¦‘KHΓ΅ό)
Qxk_qf¬¦Ε6HtΫ8SMIͺ.I’πψ€&QϊecdΜ¬£°ATΠNΕ/My·0Qdί3΅ΆΌͺγxI#Aεk!Y%dΠβ\rΝjY%ΘCͺCΩ(UεG@‘‘:kΚ#±§(£·v4φUdSI1;\$ ωnIF2U
UHBοy\nHΕ]ΗΩ Gρ#4\\RΛI'Fρςφ;έ1=Σ6)ΊΧ&δqZJ+ΔαΦΜD‘Jυa½u½B0T1Ώ6Ή\rUΤ!WιUγi]κtEs=vPn9TTD`Βp \n‘@\"¨sΎy&\\ώΗa¬ϋiξΦ¬3§β¦Ϊ?LhI>_C0nΈΘS£?D~ιD\"kόΤfkyυ\rϋ'>\"R?'
ηΦT*\0·¨όλs©MζςιΤςYΊίp|A«΅SoHUΝV]MfώY&1ΧUk^±Φ>W¦Bng(ΞϋίVί\"I>%ξβό%Η|Σ782’έιΦάνφ΄TΣ^ΫIB;4ι€£G=Σ}\"+‘΅yΧS\\+SMRtΨΊΣ2ΡΞ₯σΑβX²χΨαΤΥ[ΟΑP 00\r(ab.Kπ°Q³*££D¦¦ΚΔY£ςΩ\r1#iQΘ¦4ξX|Q1ήΗ)ΗΉ·δ2ΨνP~κTaσG’CzλΞh-₯ωr _―Ζxό{§γξ\\|’ΔπΣΜ}Λ9/9%:KMrτmJnIψ€6n¦8~\\Εwήσ4gΎvβΦMΙ\r?Ώ cσkόzMZΤ€LΡtθ¦`O\$γΌJκΒμhτ€±\0ζrυ&’ΓjγoNπ 4°ηΝHrM&ύv)nj0γΩLjc|ζA^ζFΐ@\r(&ΰRΡΤΔMgΙhΡ-ͺΨ\r’~~ϊbHvjAννΒ8#ωάλ\r ΫJηa§δ%Q‘1 pW±&%q*lΠΆk±j)J>0)ΊΤ°rddΈ’*δhorηΊπθ.Κ+ρRkξ-οΜΒhχΨg¬ΰSL‘PB€yn,CS§Rιq\n\$}pYQ T2Γ¨lq@yoR¬ΜhP\"vJDap!! θR―ΐΞ\$ι1p!cϊμφNc΄θηFΞXΗξNνOy!Q<Ϊq1Q.ΝNεΜΖg°Y!ν1²!πE#λnί±€η2DUNc%&6fΟFF1>ΖϊSζβNα\nIh|?a°\n,+¬8@ΣQN84τρn'?r7i\"d‘!²O§θη\"εΔΔΡ§΅Q1*£Λ%rK+#+p\0¨ΰΛ§>jRΓ\r(γ1/Ω\"Rιpk€xns.Ε-ΛΛ.PΎ<²Ip*hΨ2f©*jlζσJ=RλN―2²―³0ΚΣ+.£1rύ*<4S+σJλ\$Ϋ&.~±ζS2Κsl3cF7ͺK¬3TE@r’S±^ΦFS:c~5θΙ-\"WΜςhBg4 0DΓ¬ί3fΌΈς.―`7@Ψl΅ΰΦρ\nγν9>Ο'QΡΐͺ\n phγxοA,Ο4\">]C·\no;ΚΖmΝη-ς'Ζ[Ζ»ΖζEmχσϋB)RτώΣρ3o(MFΚΉτ*ιτΊIΕNΛοV%i«9g<ΔκGR.,8ΛΟ’02ι'p|ηπ\n,ζJ}p<&μάυΪTχPF}τΧ-VϊρΨπ\"8Δξή°-NυNrP
MDrΤΜΫηιMπ½N&iMlY!ΡΪκC|ΓVFοD΄τηΒΒnM&r£ν(}τ
\nβu,06.6οCξzΡτxy²vUQKGαZ1OΓ°&ιη5'1ώφΖJΔΜqT#ΝYQ wG\0UςU(ΡY-HuϊΊ5 ήΔλT½<%5f-ψ>ceHeΦ'n\$`";break;case"fi":$f="O6N³xμa9L#πP\\33`’‘€Κd7ΞσΚiΝ&Hι°Γ\$:GNaΨΚl4eπp(¦u:&θ²`t:DH΄b4oAωΰζBΕbράv?K
‘Δd3\rFΓqΐδt<\rL5 *Xk:§+dμΚnd©°κj0ΝI§ZA¬Βa\r';e²σ KjI©Nw}G€ψ\r,k2h«©ΨΣ@Ζ©(vΓ₯²aΎp1Iυάέ*mMΫqzaΗMΈC^ΒmΕΚvΘξ;Ύcγεςω¦θπPF±Έ΄ΐKΆuΆ‘Τάt2Β£sΝ1ΘΠe¨Ε£xo}Zφ:©κL9-»fτS\\5\rιJv)ΑjL0M°κ5nKf©(ΘΪ3Β9ΐζβ0`έΌοKPR2iβΠ<\r8'©ε\n\r+9·α\0ΒΟ±vΤ§Nβπ+Dθ #£zd:'L@¬4ΎΓ*fΕ A\0Χ,0\rrδ¨°jj%-*%γk(%r`ΌASΧ¦#JlDp+pύ)+ςMMΘ:BBXΩ'ς9-tΏBΜNβξΔ##ξL\0SH5Κ\"@Ώ°(@4Ry@sπΒKΞ\0ζ₯#@6Σa\0xΚ3‘Π t
γ½\$τΪζ\rγΞαzWφ¨ΘJp|υcΦγ|ΙcNκ C'EΝsΠ7c(Α΄HθάΆ\rcΜάι·βRΧΆ,@ͺ:Γ*υ\0WlvΣΒξ¨θxμ:!.2γl@¦-(<Ζ«Ο)&O|l ΄R .Ιγ£H!°ίέΓ£ͺΟpΦ’EΞ3ΨC>f4ΕUτΓ3ςϊXε £Nψ +s2 θΤτ)BΐΛ(n)\"[Π€W\rύ-¨ΦτεΙ°’&¨&ZΘ;Ή³#΅3χA0χΪqΈά3ΒV£²©qοο*Δ μϋCΈβοj’b(Άϊ&sβό³Πγ* o;°Δ ιώπCRυκ[#MrΧ³|€\\ΦΖm0π«wB覽bE0ε #’3ΣΚ¨JσΜ2Ύ£,H4ΥCoN«TE\"79/sEΓ.Ψa('!H’ΠπE\"΄)\$|ΞβxS\nmΙ ςΰ_²ΐ\$Ε?xόι~―έόηφG_ι©₯1@@σyλE\" `Mc0PΡAccMU\rf\0ΝPϋψ#AΤ4SΘiΘΜ\n=Ξω·Ό¦V:-Ρu|°ΔXΛ!e,ΕΦ.ΑΙj-e°y6ν\"8%ΖC@d5Δ΅\"Ή«!t.’jbYο €7sήώ€\n
Cw]Μ#>Θ«ϊo\nΊ!#ΛύbΡ,_a¬UJΛY«=hΖΈΪ΅ΦΘeΐ7!ΈTA¦ΘP|τAjS\rαTdΩΟ\\CG)\0μΐΜ\$n?΄@ΉΡ€`0ΆάNΠπs0ξͺ©oW) .ρIOXP`Κ^
οΧδ«Λ{©άΦθM4Ξaπδ @ήt&ΞέθP A <Τ-4Ο 8©ιE@SΧ-NPV8e.Dh\rΧ‘ͺPύ<'~kG½(?(&\0Κ²I)ΑTΨψ@s€€ό¨#¨eΚ«Λ(±,tΆ\0C\naH#ΦΒJQ(ΐ&Γξzθ{24T:·.’qwf€΅²]Ι1l\r4ΰςOήΈya-vΟHγΤA(Ξ=Ϊ]©P€\rΗͺA05CS@ \r+IΤ₯:₯½Wί;Α:@'
0¨W
ΠΚ[·Tmrςq©\rZ;,GlΑxd7`ΙΙ\"eΚΞ£υ\$η[ΫϋδL₯`¨Ρ<0Π ΣbHD¬#[\$¬ςbKΙMd.lΝ!{ώΕΘ% 8\rAΰ@BD!P\"ΰΠ@(LΈQ=―yδOΑΘIΐλ₯41\nz\n\r¬,ΕHξΖ¨κnMxrΈΗΌ’&eΖ;OMήQ78ͺ9W4°‘·bcT'ͺΨΠWΙ!Φ+q;:¨V!§\$ώΛωΐ\"°Δ<2\\₯π:z6ξΡΤ)GΞ z/q.ΔU*h’’v-ΔΆg\"κUΡΙ1ΝΟ4iΩZNk!Ν.~h±TX NHΡoΡδάBkπλ¦0G ΜhΖ9MjΔ\"λrυμΊ\r!²#2',TOΔ#P \0ΖΞ%Ιza―πH\nr:.μΙG\$²?CU/j: Χ#ΜΘ1&RhC&Ne)©\$Ox\n6\$fχ«(2lu²ΩMΪωH²σ%πΨ}ς£\r1ώΜζΪ2k1+¦Ω HiβEͺΠc]/w-IKΠ_€κήχoxQ@ζ>ΰΙ0~O@¬#vΡcΚ\rR&Μfbε(T2ΜKpΘ)\"θDEΌ13(";break;case"fr":$f="ΓE§1iΨήu9fSΠΒi7\n’\0ό%ΜΒ(m8Ξg3IΨeζΎIΔcIΠiDΓi6L¦Δ°Γ22@ζsYΌ2:JeS\ntLM&Σ Ps±LeCΘf4γΘ(μi€₯ΖΌUK=uC3(J\nνLΘ6’ 1\r\rπΰλ%Κφ
€hΞ'£\$(³S»h4 φ1Δ‘`@'£C*3‘Πήt
γ½Μ5½rκ%Γ8^2Α{ZΔΘJ |6₯ΙB 3%ΚΒ7xΒ'Bς¦&\r
<7TJΐaiΆΎθάLSΗ+±@;@8τχ§ΞDΙ,HΨ2cc&ϋP0Cu£ @7hθηΉώέ£’ή6Sσ\$(HΞh²¬ΖΝ9₯Λ3θγ\0Κ<«£#&ύE΄^b2θ3σ\nθΞΞΫ°>°3ΥΣVΩ1X³’Σ%όΎ7eΘ*Jΰ³:ΈήωOΈ6 μΐΘ:§Ρ²ΐno§V³4Έιh₯bzΓ€ϋΦΎaRψ¦(Φ[ΔΊ7δϊ1ω6@§£9KΓ
Bw\nd9¦ΩΓ#k yΊΟΡu;Υηaψ&(q+ΎdTψ?Α1β(ρφ:\"£°ΉJΞ{ίρK’υJ\n{δ ‘\$¨YΑTgεux2¨BItHHΰ#²|Θ3ηDΡ`μJRΠFΌΎRtM(§Δπΰ§NΓFΙψ¨ U\nΦ jH<¦`p[-MqeΟΐnE₯ ΒΨ^₯α
q(&\$αΡ#0τΥπAMJn%!#4XΓ sT&@\\:HA\$%2HΑΆ\$1kCHRJκΨL+mnπθΈWε\\λ¦=ΐδ»/xͺΉ|ι&vΟϋ`διF,S²hPkYG\"¨|A ςnTΑS\$½\">ρK
ζχΦD B€κΘ%΄Vβή\\r.`ξΊSoΛ΅w―<Ό ͺρ_!Μ>ΆdΦeaͺ@ωΰK4θ΄Ό\n\$ΡΊPeCq²Δ1YJΔNJ>?glΤ£χδρ'AQ1,BqA{³¬9GStΟ§+¦t1¬@ζρ1\rετΜ¬εHO§κ7D(ΚτQγIFσA?rΔYRw3Π§4rΑ\0P @+χ¨A\0(*PΣσΙ:1\rF6ΨπιΝcε(τ³ηBO_W« ΐΚ£_Δ%yθΒώ\rΑΑ5κΟΉ7&ΜΎ-ϊXHRn{σμ7΅ΰS\nAσT\nRN¨VEΥΞ\rg±3`&yͺ\$R±TΡePΫA )η<9ndμ\r&7vhLκ\r,EσNjMZσ+ΑΊΓ2nωuπ©VJ£ZΦ(δΊ:NΘ|qRω}0OΣ ΒT'Ε·hΘRcH Mb₯Ν cVχ όρ*FΖζΕv~η--§»δφΏ9’¦lc!―'°Δ \0δ«ν2\nΦ{`ϋL]/HΜ·bDRΚΩ0va1²\0)‘ζ₯/£°UΠe·ΖΌ=πδ£CπΤT(ΘΤBi,\$01Ί₯2Ν\0PO ΐ*
\0B EΖ8Μ\"PqΘ\nK]K½Γ°Σ!BK\$₯ΞΫξTA½'n`ξ¨π’8Q.ΔΖ³Ξ¨ώ22LIBHm0 TΘL'{¦Έό£ψ^Ό₯(WβρcSω69ιγ^c²TS₯ΆC§°*8Ϊέo―εNΏ·ότ%Qβg²:δ%γ©-Ψ\\K*#‘LΠ6ι,α! κ rzf}/37κ§yV₯Άδ8νΎJ5‘TMSϋ€’ΆtBJ΄oΈΉογ\0©ͺ9)£0ΨΪ
L`o0R’ι³7GEμ=¬ϊQσω’;ΆL:ΣΌΤθkΏ}’RCΓΘ1l{U YΓ!iΊΧe²έ\nΐΧΫdι}Οώ)L³―,n2Σ¨~uΖpέΗΟι8Uσ²2JΞCS³qV(Q5-rGFΚ Β³D»§βxH©3£ Aa#cΧRΑ(CtΥ`ϊ°C7#=Λu!gΐΌv\"c C+DgΘ3€Η]Ψϊ6P΅A¬Rι\rQb#φ~ΪJγ\r*\0€mίqΟz±.μΫ;ΘcοkY’φΔ,ψΑρͺ¦₯uΝρΐξN7.¦ΧέρΤΤy\nδ
DiνFkΔwkβύ'κίΘχ³ξ\n'nS0ο,ϊi/δeh¦WςM±Gψ&YΗ€o;bP\r\"ε±\0\nΙΤ9ψW‘xΖτώiλ>€WuZlA:Jάν’8ENkFN@@φΨμκ?c\n
’σ1ΰζbfiX-.¨Ρ wΓΝ'°3φ΄?©°;IΔfJΆΒ ί&°*ηVΠIπ4μπw¨οΟ4±Π|&PΆΖ2pxΘg·€Θφl\"NδqΠf Ί\"ΐ gΆάb`Ιΐ`Λ,ΘR'¬δόΤζΕ\0ώFΠπaR€&BβVΰξiL~ PΙ27\rΞΘpzΞipΣ\nκ]-έPx'M=pφ\r°;\"±'π5 !SηΟ'Β§=qΓ¨\0'±OΛy²zΡ)1AcqjΆΟπ<\$<’N?’z,d€~±NτonϊψρPϋ`Q/ξ\$ςΦν°€1 β°4βμNγQw#ς?qD!I―n0ΕP²QOΠιQΕΡΛ1«pkR!,i#%Μx /ΖSΐ5-υ+\$siΌJ6₯¬(* ςξΗδb ΰ\njΰ―=’!!JJ<ΖΛΜk\0Μ=.<§1!°.dΔ1Ϋ3M²ξί&:σ'.\"ΐQ ,IpKΧ)±Ξ+ΡςO·²₯ρo*ν0bM4ddc&ηaPη°/Σβ―Ι,ΠG5*a-x¦΅+QύΞδrΗ.¬a+¬ Ϋ.Ξ\\Νλ0
ΦHΔF2%&ΎΊο<\$ ρ±es*q]0h3Nmαρ53SE²ΆH²φ¦\0δζΰP\"FΤ=£Ύc+Ξ&+&ε5σ+μ½*Η6j°ξS£*tε\rςΨξO)Ρ+3±Χ9#»9r§53?:=9.SU(Q:Σ6ς#'9N±ς,J9-0:SΟ;ϋ Rυ;=³ΐδsθ±ηγNLN·-=Ρ`Bε\0δΞQ*rδSσ@ψ+²ρ>>NA.=Ac(ξGBSφ`©.ΕΒNs0lad€@₯\$ Sϋ4puRηDd©DΤ4tτYD¦ΗA±Cΐ?qfζ±LγjπβΞΝ7νJ«Fg6v+@φt\$h<Πτώt’tΔC²1ζGN!ΝΎ4¨ψFRοFI΄Η0V6¦!ρ+.JBbΔ\rVΕ ΨγV3²Ύ½Ά6σebr'bωΈΌm!ηb²N<1c8Άlh\n pτΡΆος¦Ββπfψθ!MΠSt€'Φ\$BH.ί-ΔmΖPuπE[5οuPΝR(|&D\nΰEVδCX8u\08p%ψΔ\$πΒ\r=ω1p},a§qbgN4MC83Γ@Άc·BU:Ρ*€ΰάuο7PB\\Ϋ\\PqέEBGΥΥUΧ4c°-]μaΤ₯΄S*Υγ_UΥJ@ΔεSF
ΓΆW
Υθ<#―oΖόλ9^bΞ#₯*g.?μͺl²Nθ76<&0ςΰ€¨<τf2oοβ:\nΜώΖ,°r<0\0ά(ε1ΰ¬ήΖA[Ϊκ#’
΅ΚιΜΔΝ¬ή+¬γ7&Ά7±7YΝήΞζ#\rικηsΰ§Hu{.―ΥδK>JVPZYl-₯Έ·\0w\\JΔμ.UΞΊCp/*υ}GD£ό=kρ#\$hΔͺΐ9P>€\$’Wi\rΒ&GΙͺ«e\nU>s°HlNρύ<P\\΄cZλemΥΎΈWm?1½u?BEWzρzAΑ8\0Γρ*aO8§μOBU)€³Δΰ+iC±!³Γ Ε XqΈ0Υδ9 ΐ6O¨,`Ω&¦|Ε©%ΜiNCW‘Μ3ΰ@C9Ψ«ΝήSΊgp ¬6(Xς Έ΄2aΪΤ\r
\0(o{q7dόΓSFlβ@ͺ¨)Ζ°ΰσ\0gKRAUlΥάί\rαέ-MuΠμGA*₯?ΟUκJΛA:nUHg[ΘI²άΌΙ\nΌ5ΒPΒFOκP¨3B*LjnG2H0ψΡ+fy8°πͺLiΓAΉ\$\$©v(JσvmΙι‘Πΰ©jθDΘ*JZ{F~ͺΓ²ΐ`\rI±&(έ§ZΣQfUPΩΚL7)88τͺ+@ \n<)
F΅[mnΞIτ²©·%HκΤΘ2\$3sl;HΩ\$KHAθlΘ!*iμΤΔXrVθΒc³Άf0vJΤ\nd*QτΙ3W³%P5^Z!Ζό\"ϊΛΓΐoπιΉ\\©ΠiBxρθMC\nT ΐRMΑ<'\0ͺ A\nlxR\nXG αPB`EΓxOεσ@Ε΅ΥP\n ¦TΆΓ
Λm
Άά#wadj¨’ι―.
μςU¬{±?κnΤΙsΞ«LSΚη`£²°κΔNΠ0¨ ΈΛXΡε΄C7ίOω'JNΥκKjΕιχΗΘ«©J h?vz©·ύY©C¨Vsτ·*΅η£tYΖmΎπ±~―α―6Tέΰίγ\nq
KΊNγD.‘ΆVΏ\"Nb\$iTΚΌWΜaNΕ\\«@+(\nΎNΡ΅6η\rͺμζχ\0PΓ§DhgnΗJcΫυΌ°ΚqΨ<~ώΉ#lΎzRϋχΨζnΤ»\"ΣΎ\rzΗU\$0«A_ζ2‘Ι!LΪν@ΎXY)U[ζΚ\rhΞΞό©βΪB TΑ! <\"τiD@fu\\jjδH/²HΞσΑx fΜΗ³R;ηθ+MσTXΙF
gΓς[Π\\Tg\0AΡpxι&¦BnNz\\ΕΒ<θQω―CέlHLχGλZσ*Ύc,WUνοσΈ Χέ:\\ΛκΌΉ.η©κpγ§τIfυ,**ΊΖBτ|μξ©]AΞi¨5ΧΡ½(9^φΗδλ³½ΘψΣ@ΔΌ7lς%»
^ό€ΨsGέW°ΈΛ1Ia!D\"2τΥv=η±φ+s_ͺ2λ7΄i»©ΙNRΧC\"dΣΣϋnςcτ~Ι!sτΔύv*λwιLφρΏεϊΝρ’KωpΓ~Γ~^e<2¦¬H-H4δ΄©ΠΛ\\IL!l\$Β\\}Cp\$¨%.¦DΕΓ02r0^^#>)LΚB5Δ1₯zpPVΫ§>g¦~0 PH άpμ|¬XmVOξfLςΛj&²+δ'½ΪώΟ¦0°Ν
\nϋL·\nOΞΨo€ϋGrΨδd3oδNGΚxoάc©;8xΜΒc'#+\rΊώJ2N&/f/κ,ΐκ\r°δ θ€nΊιΓTοΙΝd0\nδ\$+κ/°ΚώΞύDξΎQCβΡ*B.4/ξvbςάΔoF)\"Γ&*bz3τ)Β6Yβ\$^ #C\".ΖNόΖjΝqTέD¬ηj¨¦δΆ(0±ZCΕ&DeΝθhθΈΡ+νt\r©¨zήΘΡh©2\$ρέP«πΧΦΩΠΎγAPΠβε=\"\"Γ wΡψ±ύMΐ¬όγcpβΘ.2z` Γ°ΧM¨',KιipTιΡ°·#NΠϊΖΣ’όR>Θϋ±7#Μ%Dέpl2`%2[\$2{K\nl'RO'0h0^vk\0΄B£>ϊ΅\"Χ\0MQΪKΠ«)§w¬Γ&ι2MrΏ£)!+R¬β―Ρ\$ΡiρέΣ+¦?ςΔ&ςΰΚ\$Νώί%+±ω.ξ/1γ/j7/£ςΙPΜ7\rο/α'Σ0Fw!R.ΰiυ\$Σ*H²3: &\0ΘβQΣrP2€²BΪςnχBX\rξΜ(b4.
5£Z’Α6Khp1θ~₯<\$ε0277οΈsQκhθOͺ0υ9E\ndΒ\rVej\"C6RkΤKCH\$Pσ\" ΄cpO\nqH\n ¨ΐZ}\"F’cθO―*π/τ#§θ9G`Λ¦C&€°`Cb;_<Cέ
mΉ©<.ί(ύηpaΒC;³F`δuJξM¬λDFΪ(4λΩ\"Η2<(πNΜξύ0¦db0ΜΘC΄x€\0ΰDACHΥHMi*ιHπPΝ1%\nΘ)\rIΤuIOόeτxIρΨeζΰΤ₯h΅3Φ\0,tΗΞ4ΗprΗ₯8\$0bU'ΘA τ(J6\rκ:~΄ΐ.’1τ¨Ψcn2 Rγl{2,!Bι5\0Κί#+Fβd1ζ(Κ)N€υ\nΤΨU*)G?H¦ζΚ ξ/CΎ`2Α*FλC’7β(qg¦OπXmΐ+ΰά";break;case"he":$f="ΧJ5\rtθΧU@ ΙΊak₯Ηΰ‘(ΈffΑPΊͺ Π<=―RΑ\rtΫ]SFRd~kΙT-tΛ^q ¦`z\0§2nI&A¨-yZV\r%ΟS ‘`(`1ΖQ°άp9ͺ'άβK΅&cu4ό£ΔQΈυͺ §K*u\rΞΧuI―Π4χ MHγ©|υBjsΌΒ=5β.σ€-ΛσuF¦}D 3~G=¬`1:΅FΖ9΄kν¨)\\χN5Ίτ½³€Η%π (ͺn5ηspΚr9ΞBΰQΒt0'3(Θo2Δ£€dκp8xΎ§YΜξρ\"O€©{Jι!\ryR
ξi&£J Ί\n'*Γ*ΚΆ’-Β Σ―HΪv&jΈ\nΤA\n7t.|£Δ’6'©\\h-,JφkΕ(;Ζ. ΅!ΡRΉ¨c1)!+mzϊΑHizΥ. §DΛZvGMzw°pIρ€Hs’Φ(fΉLΧ§³rφ h7;οsΰω>³πύΖ1Ύ#3Ρ―sΞτ½ohξ4@ή:Ύ£@ώoτ\0εD4C(ΜC@θ:t
γ½t4\rο
ΟΞ£p_RTΓΘJX|6ΌOm3ΈάBJ€<]dΨ@hΝΩΆδ§PΈσ £HΙΎ^όά\\=K/ΰGΑFG\0·DΚCΡ\"Ι\"ΒR]Ψ-FΪbLi2¬CKMΰ0Zρ+z΄ΦμͺCͺlXΪσIΘΩ+ΌξΚΰ9/ͺdυύΉk^δ=\"7IS%oΑΏ#&μΖVD{lυ¨gΫmΞχΧΩΚ=gξ¨Χ\\6ύ1B5&g,¬buΔΓΠ«h\$a΄4»tH*¬t©²<―\rςofΑEόbJu\$A*@ΒFH0o@ΤΐHΠω£§άρΫξΜΙΠΐ](BtOhδH\"a FΧ\"^L΄Η©§δ¬9rA<₯χ₯>Λωj-`χD7L΅\nZJ^)KfXhυ³εΝθdX.σ'D y³Β’ ;7k =°G―j΅He\"Υ€w‘k2Ϊρ|Α&ς[φF©₯·e90.,―³α6ΣA/xZϊBυΟ²Iϊ09QΩΘάεA£Z/±S_
δ \"ζ(αΈ%¨©pΙO)α\\ΒΦί ’I£9m8bvώ&Χόδ΅s΅Μ@rΨiχkUTΚ4VCC'Ϊqb\n,6ΙΟ]ϋ±|Ή)07DΏoΈR9[¦ΡΡ}΄ΙwαΉ|ξχΗΌβuΨ`[Γ¦ξ\$Ο<1ζ>!Ώς§ΛΞχ0&/9/n½Θ©Ψ:Ύεβ_uΏΥι@ΙzVD/)'XKϊΦϋΧr³m>Ωqg4φrγ[az\"³ΕΔlYΧo΄\$ζΙλE€]½Ί>s±ΓέMδkϋ6'Ώ+WDR{\\ύQοkXd±fύήXΗό₯*~6αnΔΜμ]5β\$ΘοJ2Μm\0\"8φ\rNΚOώ^n^ςC’ή\$o0,κ\$ΚΉ\0γΕΒ9’!οpΊp8#―\"χοπΡLμΟg4lηζ4\$Δ²αDήl\nFm
Ξά'@οM-c\"ΦmΟpσ\rΧwcpkζάh\n΄JΥγOmvςll*4Γ¬iϊqm\nc’aα\$΄μB 9―\\ς¦Ν\\ρ€Mp ¨ 0άζ0°pΟπΊpΐρfρΠο\0΄Μρi€Μpό7Ni/n£K¦ΧGΊςPBzΜq\nslΔu+>IyοTLciodJπΟs]B8Oc πλσ«¦Γ#£¦¨\"Τ`©ΟΦϊζόj£\\%£ dΝ4α\">Δ±Mp_OΧ―PΦDB%)ͺI\"dςκMx#ΒZJDςΰζKclnrβΪο{¨¦Pβΐ@T\0Μ qΝ63§ΈrcP@lLdqεΗ’':cΓ2άΈ\rZ@Φτ\$Kq|B^G\$\$κ3ΆΪώb<1ό»LζFdΐ2>η&0ΕΒ\$Η g#\$MΝlΪeξΪ¬Ρ\"ε0yΘxΚNIXC2o 0δxε/΄δζ*Λ*:8zγO f/-x/P\nιζk!ͺΓκ+(Ξ'n·ΖϊXίrΒλ,Ε/ύk&e@-X#g ζxK/μdΕΖmDΧn\"!(Ζ#l:9m©½λΤΌH^ eΒb(y1Rψ@ήΓΎιΈw-δ.0&*θe0³2(\0";break;case"hu":$f="B4σΔe7£πP\\33\r¬5 Μήd8NF0Q8Κm¦C|Μe6kiL 0ΡCT€\\\n Δ'LMBl4Αfj¬MRr2X)\no9‘ΝD©±©:OF\\ά@\nFC1 Τl7AL5ε ζ\nLLtn1ΑeJ°Γ7)£F³)Ξ\n!aOL5ΡΚνxL¦sT’ΓV\r*DAq2QΗΉdήu'c-Lή 8'cI³'
λΞ§!³!4Pd&ιnMJ6ώA»«ΑpΨdo6Nθ‘ΜΒ\nζυΊ\"a«}Εc1Ε=]άΞ\n*JΞUn\\tσ(;1Ί(6B¨ά5Γxξ73γδ7IΈί8γZ7*9·c₯ΰζ;Α\"nύΏ―ϋΜΠR₯ £X¬L«ηzd\r謫jθΐ₯mcή#%\rTJe^£κ·ΘΪ’D’ Κ3#ͺRΨκ2B[fΏ»B°Ζ4Ι#Zp3κ@Ο1’ΊκγΎΉ°ε`ΐ^T(Bη’λΚV5°tΈ5Α±B:GμYm!5(#π₯XΫq6»n-Z1#t~( εΠ― S\$3΄qTδ-φm?’RN8ΜγΡϊ―zvΈ ’ψ§έ¦1Ϊ`±~b:vnιzBdΪ>8:έΫP6Φί·£Η»―τuψγNύ&·tTϊtβμ8¬¨ Έ΄Xa\rΟτΦΘ\0ψed7+uξΙΈL('liB5‘Ό3bB»^>`ϊ
@ήkΧ‘£\r+El²:\rοZ¬\nIg%άCΖb·@eΜΈάΑ.gE~€P \nOW\nS%ΰzZU,Τ¬ε ΄’Φ[h;ΓCArα\\aΈHΧΊκΡΉzΰΞΎWΩΗl‘¬0\"R°jKαΡdTκς η]§NqΟβ0Xc2ΘIHDK)fEε’΄ΦͺΧ[+mnΖΤΉ TΡ±u0|φΓΆΑ<ηώdΡ7\$θΒCΤ8F‘IΙFΑΆ=ΗRC* !«eμYεΘ«΄k\"I(G)ΥcΰfΙc!_Δs\"ΘΘr^AΘΙ2ΐΒ€-V«MΈgω8΄ο @δΡΙ\r,ςσQyFMϊβοAΜ8j\rάΞβφ»‘ΡZ`(‘B
:ΐ ¦\"°ζGΙΈC^δ*q+l΅6μ±ξS«εΚ&zAIsCͺΦ 4ΌrNC«γΓA\r!iχ?Ϊ'&ιΉ8'#΄e@C\naH#\0τ½έϋΈ`Έ²Ψ#,<³*|Γ\nF€ΰΒ|PZ3ͺ=)ςDΚΜa<2ΗVgΜιpDCΙ§U)hΧ!vόpH-l9 ΜΙT[σν6IνC³M~ΔrEZΉ\n<)
B` lL[8Cηr }¬<«!ΐahm:ΖWs9*ΞΰΧΈ1VA»`Iέ\\*¦€&TΙ¬P0@₯t,°½Ω|LB#F± \\ζ\rmYΤΡkx\n΄ε»βq*ΗΜθαpΞxp*aΦ=Y¨!Xt\$9 τΞgm-u§ΘgCΙNξεBsθcSj\nh@μvo«ΔT§:Αoίp‘Oε=Id£
cCxbk93\$»GμΨΉOyTα<`Κς1‘Ψ1τίφΤω1bΝ΅19«Ν!€ώ΄e\nbΙ£‘C<σΝf}PΰΠπ9IS'ΕςFΤΘ\\₯Or £σ-8<\$΅¦όͺxAP2`a΄‘ά°ωΝώ\rΕΜ9±ΞιδήV*z7[5D«{!ΧNd ΏεΰΫsήIΥ(.hνkczΥ\n-α\"Q±ιΛk
CΒγouσY¨ΖΧ@\\2#¦ AQG%1BxΦvυίoEdR\$dξΠ\nΈaά¬Ξ£H;8ω¨ώΕπτΘBYs#€ L&YρUςηEΙXl5Ϋζ£ΉΨ§ΣΞl¬|β£ΜnSωaσe€_εc[oΖ_9X)[s`ωπ©?+Έΰ/ΘHV\"P2F)K9Cm@Al4)\nώifΞ^ζΰ ’΄0Db\r,TΝ=p:Γl:«ΦΐTξΦugξ%'Τ;d| -fFDgΖ,g*ΞΓ@P(Λ-ZBpΉLvΜόPNΙ\0Θyή<ΔiΠΉg ¬Όών\n08F6 ¬―g~c―Ρηy\n’VώΠΘύg|ύͺφ9\n¨3ςέAV\rΰι.hμμNr0δλξΊιNACe‘πθ2pμ νΎ<φη\nφΨμ-3κΰΚ/ΕΞTΐ`Ψ π·\r,ΐ?0Μώͺφ*\r|;±\$ Ζ¨\0Γ4@h¬ΚΠ/C0IΖ&Qn6ΖΰΦY\"c!RG\"FvΜΚBZ·1>βq^W#k)}KVDπq Δ%ΰ²ΡJΩ1\"ήΨ1dOΤLΠ'μΤυ/L2ήμdίG'/ςaΝsέM\\°ρ6όδmbώ&\n°¬―f1ψΛΜΑ%@υέM7&έͺ½±I#?#LRώΐ\$Ul;ςJ#ς7\"Τw +@ΙΞXk\"R’N2§\0Β^γ:BΆ―\rr-Π'2Ω€m)d\$jφsFΜm\rν%Έbΐ\r-~2/Ω%&Ι*€!}rU+Ώ]-άΑΚ9ED9b_\0βΡδ}CΟC/2γ,π½/ΓΟrGσΉΧ,FτAr-§r>0m(ςg±y0όS%2ς°υ36i³!\"BΪ\r«24m¨U\rσPΪ(*Eϋ4U,2²;ν§5Σ1%ηΏδΉ%mά―lPνι,²ω8\rδHνλ#*QΖήΣ`?Cψ3rgE4Ι©γξpήψ£Wβf%δ;,Θ\0Κ»O²/ξ?γHz{x'τ}4{΄zύ<\$D\$@ΚηπFgB%βb/bϊJΓΐ\"τJέΰ€RΑC σο0δI9Β~ΕZωͺγΊM±p*σ«Εφ4Sq¨λ7hA]ͺΦl¨7»έχc'Κφϋ£»½'¬D
\$σHς4δU7ςz δo9KH«―d7ζς³xαθΖNg3Ώ ΘΊC¦\$sΊα**JHΚ5mά½¨ιb\\©ΟͺΛ θΚ,ΒR<πΟΉ¨\0Ξ\"IΜOΈA\0ξA©rΒBS»Β8Κ7£°ϊΤ ΒΪ ΐCS£k\\1£(DΡCN»Ω.\0P£\\½0\"Ρ(δ6§(π j\"οnω’³π‘c`½§H@φlpξ4΄lB6ΏOγόβ4C(ΜC@θ:t
γ½<(spάΟ@Ξ£Α}ώC ^)πΪτ1Θ@ΜτM\nΚγ|ΈΟΰPa£H?0Α²ͺΑ€«VΛ»ΦzΈ.@P7HI2d:BΊd77¨J2\$Τ#%γdΔhΨάπ7’V4xι #KΠ\"RCκ6#c΄:²4B2B3―sXΟH€x¨δΡ2IΎ96λσr:δkΈ\"\"r5EΚ|’hfΧε°20₯C¦!J)\"`1L.jφΨ5Ά²JΑΛv.€\rrk!ΆHη¬Ν\rvΐΑ_i½(2³1@BKVτ[Pο)kNv6i{,ΈζΕC―M;€@@pΠ―ρ(ρ /k,,υΧ¨JL;1ΓxΜ3-5Z%ημ€*\rμ>< λ<Οc6\rγ:9Ρ`0€h@Aα\\θβΫ‘@ζ©iC½ηΊΘΩΥ%’£π¦υΊfκ·‘ΩQ%`ΗΛ\"
ΕR4+KΣ4έ;OΤ3{ΣSUp^ψ@ΥΧμίΖGΥβΎ.Α~°Δ^cΠ@δq23ηIj_IΝUη?κ5GΎ(₯ΒSx;ͺΪό(rTκ₯Ι9@YUz±mΑΐΜ/HrA\r½t/ψΦ^ω%|CΤX±P(PΕ²BnHfz‘ ΗΖώg€Ι΄GW@as)ΑΩ§£φνκξwEA2a# 1Α¨PJ¨BςΨ`[LBkπ( N Σ \ncρC (!UGήμ>2fTΛΚΊt&ζ: άδόS%\nΦ'2A4jΤ7CςJΤRFF1TάΤ±4ζ81°eυC{Y(!)
\$JIΐ%(]΄ΰ/°y¬]ͺgΑ¬@κPP d
94!U9δDΫc€τ¦P\r!¬ !RZHxy1νt'E@cy₯R!Ε!ΈyζΓί~S 5ά hI7#&hυΐ@xS\nΘ9W¦M ι‘/ΔώPLΔ΅\"Κ,AΈ3@‘H0Τb<»B]3m€ΙΉ'A a*HrrΊwP= ©\0PK\$!~/²ΜX+ α8P T *΅\0B`E@('G\"Z}}MHG ΚhR.6¨ΊΊ)Τ#Π«Ζ
ΚψgΩeιC¬ή©zG\$₯Ϊ\nη³0x9%.SIΊΤ©ΒT+Ά³αΗΗF;ΟΠΥ¨&S½η0Σ`ϊHΚ(tΖA₯]SΨh/ΕΥn=ΥZκΪ[ηh;W|#ΦΣ_ θΊf·ΰHN#nZ¦:qζ²Λ2fm―kp<έ»YU υoσΫ¬u¦’[`}γDu>WΕ©ΆΓ\n3;Ασ*BvN/LxY½
ΔJΰqΫH3ί[4οkμ!7ΐ¬Ξ°ΪΊ\n\rc0#ΰ¦ΛΆ΅mν>Υίk#xsvΝΞs.τ§Δδ¨ϊόs--±.Bϋu¦ι{¦ςlΰΫLέηTΊu¨Nϊ]k]kzοt¦ΦΖeέN:k9Ν£5[nθuΞΦ\\5Ω9η\\¬5Ώ=ήΏΩo·|Γmψ~m?.Χ'0A§T\$ΥAΑ\0j^-ξxΗΡ4ο]&>dΕ-ςnGSqiτ+yHΙ\r΄ύσq<ͺx>ϋNλή^Β΅'0―ΐΪxΎ0²θ<ξΦx,Aσ>ξίBΩ·hεφ\rhEΖώκΗ―ΗγΎ~6#ή°ΰqΏέ#Α5Φf/Y0NΓΗJ;\rAΌgτ-NΦxOό’[\"ύΝΟΨϋvΒ>b¦2bΖζPώIΈbf*ΗkwiJNPDLI£-.kjηNIΠ&ίΠfR0^ϊnHύ&ΉqΠ|°εΰε/ΘΫ[βnρΟΪjοDε0= ¦ΓΓΠή₯\n ΎΠ10\$Δp¦\\E<\\\$h\\ΔMD¨Η¦AphpΨ0P`κΝ\rdN;jκZΘLdΖTΛ+ 9,½HόjΤ,€fΒόx₯ώ.π 5§¬ΖξλΝβZd>\rV’Π¦\"ΒΚ©FzcDuΘx'`PZΚ Ϊ\n\n ¨ΐZΒρR#μόξ 0ζ'j²=,’x`φ^nδ½ Μ,dg
φCκΩ’Μ;d£&ΔβN±¨\$jΟ,7\"@²EΘ(₯ψ!\rΒ ή©%fR&φXΡΦc’Μ:Bcΰ±4€¦ΝοZΕΟqc’Δ,Τ2πfΝ!\rςρΒbtπέάήρΐή M\0ΨέMςφΕ€ό (Τj^Κ©±@Z±Ndlr9²Xf.Vΐς^^j’Μ|ΐκλ#d/Β\0A.&γ&&CbΤ]EcΌX2¨ΆΞ~ιqΝ%l\$(Z\rδ’γ(40oDtfo\\ DeκHBDj2\0";break;case"it":$f="S4Ξ§#xό%ΜΒ(a9@L&Σ)Έθo¦Αl2\rΖσp\"u9Ν1qp(abγ¦I!6NsYΜf7ΘXj\0ζBcιH 2ΝNgC,ΆZ0cA¨Ψn8ΗS|\\oΝ&γN&(άZM7\r1γIb2MΎ’s:Ϋ\$Ζ9ZY7D ΪC#\"'j ’ §!© 4NzΨSΆ―ΫfΚ 1Ι³Οc0ΪΞx-T«E%Ά ό¬Ξ\n\"&V»ρ3½Nwβ©ΈΧ#;ΙpPC΄¦ΉΞ€&C~~FthΞΒts;ΪήΤΓ#Cb¨ͺ’l7\r*(怩j\n ©4λQP%’η\r(*\r##ΠCv£`N:ΐͺ’ή:’σMΊΠΏN€\\)±P2θ€.ΏcΚ\rΓΠΆΑ)JΩ:HΤ*Υ*Λ^Α2Γ³ΓBξόC\$^τOP Ε«vΎΘΙΊ\\7I(ΰΑ'#tΝ\r# Ϊ΅°HΛΪΥ½οΰωOΒ1l;@ΤιXΠΘΠLΜΆύ\0x\rΜC@θ:t
γ½L3΄πς8^
ο²w.xD£ΓjΠΰΓ2Π·i x!ςZ+5Mλ€=TKvYDf&\nεόΌ/Kβ`Ξ*vΪς½’Mbι/ΒrΘ;#ΨΚ¬ΒΊ!\rΓ:\0Δ<ͺMρ}_7\"Ω\rΓ£~6ήTΘΠc
Εγ(Μ0£cα&°Π§wM88Δδ,(3ςΓBΎ¬λά8γ P.ΊRτ’²\$TλNωϋ3Γ6£AaΩ`ΐW2#v¨½\0¦(PΒΝ0Ϋkq[·+JΉL.n\\κ1Γ22Ϊ»eήΩξIξΖτμΒ6Ξ°’HΫ@.NηΐHa².«φο²ΓB Χξ«σd+πΥ5©\n-\nΨ1)Όί;Ν£Δ\n€Z](CXΤ¬Θ2HB7Γ3₯9%’+ \rθΔβ<ΈμEΓΨΘAΝ£*εx΅
;Σ(P9
/γ βΓ4sl½\rΒαP©Ψή£ΌΥΧΓDή‘λκ0T«s#_u.ΙΣTε<¨€TΑέT*€δ«V°Ά,άτ4Η9a¬T*‘»kU( 0©V0Hr&€Δ.·ΞΩΙΡT}ΚΘό’ ςB?jYL?Υ:§Υ\n£TͺTΏH {₯tθ[+ό π ω|£ΧΙ‘'!¬ΰTΰΤS1- α΄Γ*μ3ΑζGΙY¦*¨m¨Ηa#
ΠΜ'ΪEΘaΠ¨ψΌ2vρHγΘz\n4:Q!bI\r3\$pΨκΤC\$\$§’£#L1;?δωE]B@\$όα\r8((ΐ€Έ9& -l2ΖυhZα\$y|ΈVjr@AΌ;€7ΠRΡ5kTϋ(W’Id*Ό‘I+8\\ΝKlΖ1O/’C4MΓ8o 7ΕBJΒRΕ9%€Ψ8-fpΒ`D[`i@9\rDώKλ\r3ΐ('.»&K^ΙL1_)ταθ’jMZBf@Ϊό 2y\$1°Sj&φ3Ο’!δHη€£ αL*O\0€C!(~ ΉΕ5ΔΕ!)πmΣβW¦1m2Κα\$¦ͺΎcVk\0¦Σ%3Tz-όϊ=ΰ¨ρJ\nYαRrFεt4 \0U\n
@Ν«ΐD‘0\"ΧβήdS`Λ¦Δ) ε\"NS\n \r’¬Φl*ce₯‘ rΒσ\\'ΔΧΪ\$bZ¨\n¦α΅uT`ήΉOIβΪχTΤp]Κ uls₯χ\0θSrfH#ε&«@\$y`tyr,ΑXΑJ4¨’m1θΚILQe\"ΔHΠ(U-E‘Λ:κΠΠT.eΥτΛQμΣEL|Fτt-Λ9\nnFvg;αD*ΧΩ!ΰiτΦC0·ΙsΟbE
mzg’TkΥjsfΑοΤvΘκ³ΥΎΠΚc ,T3τΖδ¬ΙνF,4§:³½CqΔTάΔ1£LΒ2ΏΘφ©H' e―_YνΌ%Ζ Aa Q²\"gθe>Gc\0δy»Λ¬t9c5ώΑ_%€0―μη7ΣΊ‘Φ§ \0O jUηI\n9θΐ'=,ϋ΄\0 ΠZ;΄Ey’ άj%‘8ΓΔΓ‘4¨<2pκR-_ϊFKκhΣR£νΚ|ωΫ5'«u9§~ϊΔΓΒ|υ«[A\$Σωρ\"H±)ΆζΠΝ²s;ηJι[RΫZUA\\2#Άh2ΌSΥΖΈ&ΰ*J0Ι οddΒ8
GθζΝΎ6Ndσ#vρ°.υΙω7\0ξUΟχDδb`x―άMLPmC4\rε\n§+Πdα\nK Δ[KTG\"\0ςM䦣dοnΠδ¦?E7 Ξc°Ζπδ°Z Λ\rγΞͺΤF,-bVΤDJDδ°υϋb|ηB4€Dη\rFΰγζϊn¬Dύ1ΌDUCwpϊDQq0Ύ,xO0w ©gέ1μjO0BέΠΗqZJΡ5l±β\"ΰ°J\n±ΣHOΞ tC\$½D²NKeΨf dςΨΰkPΡ¬ N΄/Εώz..Bά0T£Δβ80f2ΪͺBxτp]νΡb1lοI
ά^\ni`ΒA 9@ΨjJ ΦέMYgn4\nκ·T:Shiκ1zR xL&±Ξg`’ΙΌκ 4NΖQΈή 8'cI°Κg2ΔMyΤΰd05CA§tt0ΆΒΰS~¦9Όώ¦s=ΧO‘\\£έυλ οt\\
mεt¦T₯BΠͺOsW«χ:QP\n£pΦΧγp@2Cή99#δ#X2\rνΛZ7\0ζί\\28B#οbB Δ>Βh1\\se Κ^§1ReκLr?h1Fλ ΔzP ΘρB*¨*Κ;@1.%[’―,;L§€±η)Kͺ
2ώAΙ\0MερRrΔZzJzK§12Η#ΔeR¨iYD#
|ΞN(Ω\\#εR8ΠθαU8NOYs±ωI%Θω`«j‘3θβA¦\$rsqPΏ(ϊVO³,Ξ[€ͺ(ωsD―δSUTΞ\\ͺyQΙΔJsΓΈsQDͺYΦR# Ϊ4Π@A\nBΝt3\rθε#Ζάw Ξ7<1B-`ξ4Έ5ΰΨD1δ2\0y|Κ3‘Π:ζαxο
Γ\rΕrAt3
γ(άΔEα’\r°[YrΠXΪΰ#xάγ}u=pAιιNE\$ΠhαK3J se’ϋb°*ΑWjZ¦¬t)ΞMΡtxNΔA \nγδ7^PJ2κD/3σF£ε&oΤ8€g9+AJEΦr@1ό\$±DsN'^ο1HNε‘DζeΩΜBτtu\\pO°2mΠμΎVΜ3\\t₯ΌΌdΞΓ¨Ψ67nKm\rcά\nbΎ£χ\0pd΄Z@υ.sΎι#[Tu][aZI©κ΄wΠυφ»φΨHΰdσΖςΌϊ6θ¨'Ε΅ͺB8'V+x#εA(₯]ΰKWud₯ &ΞΪ`+AY/e Tί¨~οUΑΉ\$~B!ΖyF°¨Γt+I0Έ9C0Κn^¬θ9΄%άlΘeπΓ‘pfΑ±4ΊJϊfpAP7φnΘ °θ:―%θ0 \rΌ3@ζΒbY!0@A \\aΈ: PΑLNTQ@AE&π\rJ7LΦUκΊαh!8xC\"ζaf‘1\$Ε³cLqH΄ΘΩ+'BΔ:3Nτ£g!3δL
Ω*#ξψA6όΦΙπS\"\ncVδ{Z2άKΆ1hu\nf{\r\"’pPΒ¬₯°tiaΘ
0Ι*ΔXbμev:ΗΧ,L2XpΙ‘ά§eα\$6lY0t ϊΟέ\rδr!‘τηΜ―*YΙlIπ<Λ\rm₯©f`HΞΦ@Εγ)YΠ _ο#XD\rΠ0i€’κσeQδF8ΚωΔ7a Φ0Γ>\0csδ4ΩIκ1FhΥr`Θ14³ΐ .FΙ#dp/Hx*\$<₯?BΤ2D¦2Δ\$Κ[UPΡ6tΉC₯μΧfmMΈenΈ:£
ΧΗ\rαήΑΚ;,:ωhyΖτqnΥ2¦έΉΕa’9ΞΔι)Γ§0Θ`ΚsSΒ¨!
0€βhj)iΑ9D3―η-2Hjg&΄ΪΔx―©ΘιOβPβLGξ°¬g0΄θΖD,'ντ-\$ΓQΆΘ£4nί\0 EΜFBΔ!¦M@)ΊaΑΔ:2Pm)C[0cBTξΓ’psO\naQπ¬ PI¨&βνφhj€₯Ρ.―X°Ή)δΑφΔ\\3 V¦»Χv1Έω\nεΡΈiήj7Ρ/KiΡ 3X\0@mΘF\nA|ζθgͺψίΰδjΠayXt8ύΛ¨
ξqΨQtκBxNT(@(\nΟ \"PtyL*ψΌρwΥκΏwϊLz+λϋ<Η υ£.ρ
Kiυ6§H2 |D}ς>e²1ZΚho‘¨ύE2!b\"8©ρλ'ΞI{rs\"ω\\©υ½ΝΦΠΪ‘-YΕW³μ)
>jjnds‘l9*r*-Ω‘© jΰxάwUp‘Vκ]^Ίi%fͺ-TJ’ #ΒVK!-ΘηΞYΠPlμκHα~dGΔΛ¨L\"ΌlN9
ΓxΊΨωQUο½b‘4ͺ,LV+ΚΚ£Mm=VA'ρ«’FbWΈ‘xγλkΞͺκΔΞ,₯~m[RfάήΤ4Σύ·*XοήkΤΤU/νo¨΄±°_Pέ*ύKΟ<ΒlΌή}Β\nΓ¬.G
WΩ6N¬WM\r4Ύ/΄3ψT!\$9qΊmΖ±uSΪ¬jΕ¬«·Θΰ©&IΊπAης^cΚͺΦ’@LήΈ ΖΗRϊz_ͺΌεηΤBGΡhp/Zή¬j aL9ͺΎω>¨Πύ9φΤ[\\b\"@>PA300\0@ΊJ»%«ΑX‘[vΕXm&Kελ_Iό.²²ΑΟΗθ4!|5b§ο-ξh΅ϊA\\2%lώ―Θ(ΟΜήϋ«ΦEς4ςΖΈhs²‘mZtoIbbςαβΞπ‘bO!ZjΑΜΑ‘b6Δ’°2\$2ΐlFΘ½n8\$oυgl&Ζl§kΑΜΕGof*0kκ 2Γ0φMtζΓ\0000Oa0ωΠ h(ΗηΨπ ξk€Νͺ-vnζβH0zεξΠΑqgΔεX’όD~ίκξ8μρ°ώmgYΚάε₯\r>gBηΔ}P·’#nvEΕ0ΡJΒd¬ςWΒ0ςh|-j>εNΥ₯
|γbnφΦ ΛΚω°ΝρRξύfΥΝxθΝΧρmπ»\nΘBgσYBΕMwΡzΗλ±
KF½ΑΚ!x(,\"¨»§πξkzφΐ ΙoKn_Ρ»1vι¬ά~Ζ γqΜΦιΡπωc±ξF οδύ NΩΘU«Κkt\"΄h
0ώE> ΕΒ\r¨~ͺcD,μS\"*LBΔq4ηο~ͺC\rW>+°\$2B0Hψ+Μͺ«κΤώηΡBLλbiΡςθF«AζNhτΡτΦςi ω* ρmr³² 1£Ώ,ς€j{!¦.‘jAΘC(Α^ΑΚcς ’mAΚΓgΌ:1ΚX±ΠμπΔΩθ3Β91qΈ~γπέ1¨0{'.N9-’1\0ά’8SΞs4»ζΝ,s>T3BUΝ4ήm-¨Q#ω5’>0άΦΛΣpSu-i·83μσy-±²
[9%
)q9σw-β8EZM%XΉΔέ#°§rΆs°#σ΅-0ΉσΌΌ#ΘΣr©ΡB B*xξNθΘΜa0=a(2kΠNΌ€Θ\"Y4\r©7xηdςλ.βύ8λy
Jsv‘EgIvt/&«p-/fh\rVΒ `Φ
Δ_ μ¨Μ\n―δ\rλφΘ²`Μ¬\r©C*L²Μφ\n p Ώi9\\φΗΑYHPΡ°}.,ΨaΔ,FΞ:d^S³49Γπd2mσ\rΘUL2#&φμn.‘lELαT%π6}&>υqv Α~=cΪ#Tά’z'τ1ΒυΑjΜΑ9)0ΒhΆy£
*Σ\n5/UNaΚx5΅RΟΌχB8·LP½R[³{ΐ¨
ct5#V΅&L
ΐΰ₯ΖεdKZ΄ςΒκθ4Φ0sρ'VδτΞάΕK#a~nzηv .Μ`ΔC4 Ύ@¬^ κ ΫY!\0qδήJLA\rZ(2ξa(bVνkά.’ξ ΟΞΖΔδLFςφΩM\\η #ΐx\"λ[υΒη¨uΠζ ήΝ\0ξ6CQΣ73v}Φ₯\rξfX‘V2€ΎΣτ·αOl!\0";break;case"ka":$f="αA§ n\0%` j’α@s@τ1# (‘0Έ\0ΙT0€ΆV εΘ4΄Π]AΖδΘύC%PΠjXΞP€Ιδ\n9΄=A§`³hJs!OγιΜΒAG€ ,I#¦Ν itA¨gβ\0Pΐb2£aΈΰs@U\\)σ]'V@τh]ρ'¬IΥΉ.%ͺΪ³©:BΔΝΞ θUM@TΨλzψΖ₯duS*w₯ΣΙΣyΨyO΅Σd©(ζβOΖNoκ<©hΧt¦2>\\rΦ₯τϊΟ;7HP<6Ρ%IΈm£s£wi\\Ξ:δμΏ\r£P½3ZH>ΪςσΎ{ͺAΆΙ:¨½P\"9 jtΝ>°Λ±M²s¨»<ά.ΞJυlσβ»*-;.«£JΨAJK· θαZ§mΞO1K²ΦΣΏκ’2mΫp²€©ΚvK
²^ήΙ(Σ³.ΞΣδ―΄κO!FδL¦δ’Ϊͺ¬R¦΄νkΊjA«/9+ΚeΏσ|Ο#Κw/\nβ°Kε+·Κ!LΚΙn=,ΤJ\0οΝu4AΏΜπέ₯N:<τΗYέ.\nJΗMxέ―Ξ,H«0ι0Σ©Ξ’RΒvΞMνXO,T½[Sυέg#RΊ8ΜΒΪΦ€EUau*s=@k;γYΔOdA3 «j+)+tΦΕυK§³W[ΡΠδ/:λX@ h7£«re_R7¨σp‘U΅V’\\3ZκJ(ζ’JΰΒ\rΚ3‘Π:ζαxο
Γ
α‘pή9αxΚ7γΒ9cΎ~2αΎ@*N\n¦xΒ8*ΣΫΚuJΊξύJλΘ.Sk4έU₯Χ\rͺ³Ό{PBΠtV΅νΌΟ8Ϋ-=³\\©ΞκΧ[Ξz9lνΊ8έJV¬²μJpd
/=!(Ι{6: Y4σ@7t½4WͺγRΦtB΅΅-FμjͺNIΏLΒ«sσw·Φ}m=·σRΦΙπο=ΣλOόI-]\r7±p\r>Ώ:ΕΠ[ύ΅yPkAΝ=)_Οω!BTWT0?ς}.¨\nΕ'Y\\²sNrΩz(%[‘;ε\$ ν[Ύ>mδϋnRιXQ!L(Ζ^ ΫΧW ΡuΈ³SrΩCε) %ρβ,oλuΪυΗλΜ[ΑAzS‘r²2Λ^C
ΊΞΉB>οq%:ϋQ@#Ε%]±lεΟϋψq4ͺͺU>ή\r\nΎ
1DΩΒΤ!4<@Pψέ¬UxΦή;p)Jd\"Α.WώW.Yd Wγpv/\":©W °\n!ι\rΠ9ξ%¬ςe,²φbΜΩ«7μεΝ¦|ΠD‘ΰ:40ηB#Nt-ΕC\$άK-ΜL²©Y)IΏR\"NϊA2ΠjeΣ₯Π#`εσ»°&αsR<K²S±ΐνFΝέ2ςκ\"H,\n
915Fq#{φTΆΓΉ&SάjtΙΣEM =8£θ°€ΡΡ%0I:b*©r(υxid1;Lγ©&έ>JΗ!,Λuqcσκ_ΕΎGώNp |uvήͺ:\0)ν\0°Z*ό=Θ―YZΐlΏ·«@έιfk΅ΣJΪη2eιJ,#Ο^!Ω3ώμ½o}JΞ~R%6v<ΩΞ΅βΒRΜ>Χ:F―Ι+m°ΑΠκ:%n#2DΙ&NtΞRRτέΪ΅O|-°.bή#§FNσϋcFΊzδθhκ(}T₯ΕβςwGcz`(VΟ)]\n,Η}ΜΗ5φu-(ΊGΆVΎΨ=Ua¬?ΪRΉΠfEJΐωCoΑq?\n<)
KΪq§#βΊ94ήδδΖΡTζΚΒN-©+<Ξ~TΟyχ?½NΧ%²oM{.ΥS΅’ΗυήNe-[γδ\r,η^Β §XMιδO.ΡΌ#@ Γξ5DΈ>ΫTR»Σ±2HΏlβqλzΞά'Ή7σtΫ·MU`|5ΐ¦S!€k&φΐ‘sόΖκk
uJΥ±χCKςεVϋp§β|qj-κή+ΎΎ―ηI\\Αϋ*:9h61©
€§*ΓC']τΫBΪg|ωψΤDΆοKΓYW^t&zΚΫΪ?cΉ7[Ίeη@Δ³β’- γσΰ£ΠP K[\0θ\\pK[qI*Ρ8UtΎPZ :ν5―'\\y2ζ=
?©%oXΡΚVrΈαIΞ6άΕ+CG\\±Έ²¦ΠζVγ\"j[Υ1Θ©γae?ΦαAλvύjnβΫράΠ₯δ\$ύ°Νά+mu ;XGΒOιrέρ:U΅Ί*Ζ\$ϋiηoς9jLΉ@kωεω/fSε+zAϋO=
½]IFφwc·Ϊε^eΕ<¨d @Σω+\n#O~eΫ*ͺwΐbVΩ²ΆJ.Ή+-\r½O¨?δ18T\n!0Λ6W&οm*\n
fΪd~XνdWοFEΞpξΨA°ΜΟ0Q'\$\0^/\"¦§ΖήμΎΥ\nE,ψΠ8ΐ#ώ#Ζώ¦\$€ ά,hΪσZΒͺ΅eD(ι/ό'πPdΠbC₯ΞqkδχΞΤ)FΆΫλ|
Gά―\r/τ’BΡ―H½ΝP£ΟΒUK\\π1BK(KΤΗ―bσ2ζo.‘4@D#ΕWΩ1ΓOη²2Tυ1bA1\r±S\0:rΞπρIρzγΡZnΓN^°JΡμλΒεBΫ\nWΟ<₯Μ]fΌν¦'gtΗϋ±{iΔμQvΜγR¦+\"±ψ|Η)Qθ;\$ΪcΫ\"ειΥMάVh'/nςLN@Π―Υο4ς£¨₯ HP.vΗ¦,ήώ1ΆΕrδN9qΩ!ddD\$\r¦Ϊδ(OπFίΛH31!Ηθp\n,ο£\$Β±‘Ν\n¦hUR}&ΘΘΰ;&oH¨ry,&Qhm+Tm\nεBμεήΘ‘!Cw'R€[©v\$±`=§4-ͺ8πΘτεTυn]((R§
Ϊβ8υ='2ωcM*ε/Β0ϋ²hΜΚ-QζάΚ°ͺπτ1»f>\$±C.λΨB\$ΪΤΪk6)λ:υQΈt-V*RψHΐΙGΈΌ4έΖ\$i3ΛR€\"hΈ[ιc3°8ΏETKΕ£―Ω’_]7ΒbοΖϊ .2ϋ±1E«9s-5Jk3.Ζ¦―J]s6nQδχχlFΙ\r,r,σΞζViζδAQ=\r=HΥ=ς©TΖ3γ=.Ώ=fΆs{&€ϋtXΟΎχπγσ4τ{%ΑAπq1£%B―Ί)Τ0ΊR#B
+Cς¬yͺ<o2ζEΧCΝΙD4WoΫ@%ΦΪm°7D\\?Gτ²ε«1Bτo@μqηάgΊάάκOHΒΙB1/h¦]ηJ]?πK?2ΑJςΗK4G1±bL3;νEFιEΔK΄Kρ8τ[<\$(So@ΟNFΤΧJΤΪΥEσAEΌΪh18o±#Υ9kjxΤψΐΣυBSΰ―Υ&Sέ@οΘς?2σΪ'2ΡC)SΥ/<IMO~(*DuOA ±½*η=JSρJs΄ECTK\$2Έ}τΡN)1WΥ5q!(ΟeΡgR4¦[£NφσK΅τ©ZοTΓSSY1χ0XFν[LHΌΥ
C΄OF&I#/ΞYrς>ςυYΠ0ύ\nX{a[4·Jή{χWdδ!`?δlμ\"πξTR²ΕOΗ]ΖΗDEy0άY5%-vεs‘tϋ±k¬vv\$XΤ+5_²ΥΪpπα.¦τΤ₯ρ+%+73κ7hήi\rVm,Ό\$~gΘίE\n2N³)3σt\$ΌΡvOΰ@\n ¨Γ`p4σH6h¨8εJ°°Q\\b;/\0±δΛϊoΘτnη¨kΓl\$ε\0υTΒK‘ELTxnΒΪfΔΫΟΐΡΗy(0|7qΣXΫKgJ@\nΝ26~ΞgΈΖG―< 0Avοb―Δt-@Πj1q`T«ΒΕHΣtπΝoh?ΔΥ
>/ΰ¨ΚElZ±Ξqb6A±;±ΗΪg^Δ
x―IRΪv«J’ΙςmwdQm^·―m.ΚKΔqdΞ<.Εvϋ TτI:1£;Σ98,i>M»?―²ζ·wΔΌΏ4RKΥΞzμcρ+9ΧDΘtξΚ―H΅vόςrί;qK«η
#1;i6δΚ±?Iο¬φ‘'g@:γψB|Ησ2·ΦTι=¨\"Z«hR£uq?.*όsΟx+'QprθΪn)l&.θψβΒλ₯*WmrΰήΖΰδ\r*Ί5;dIΨbλ5©aχ,QΤFΞή\$ΐ";break;case"ko":$f="μE©©dHΪL@₯ΨZΊΡhRε? EΓ30Ψ΄D¨Δc±:Ό!#Ιt+Bu€Σdͺ<LJΠΠψN\$€H€iBvrμZΜ2Xκ\\,S\n
%Ιε\nΡΨVAα*zc±*Dϊ°0cA¨Ψn8k#±-^O\"\$ΘΐS±6u¬Χ\$-ahλ\\%+S«LϊAv£Ε:G\n^ΧΠ²(&MΨΔ-VΜ*vΆνΖΦ²\$μ«O-F¬+NΤRβ6u-tζQ΅επͺ}KΛζ§Ά'RΟ³Ύ‘°lΦq#Τ¨τ9έN°Σ€#Λd£©`Μ'cIΈΟV» Μ*[6Ώ³εaΨM Pͺ7\rcpή;Α\0Κ9Cxδ θ0Cζ2 ή2a:κ8H8CCο Α2JΉΚBvhLdxRρ@\0όn)0 *κ#LΧeyp0.CXuΩ
\n";}function
+tablesPrint($T){echo"".script("mixin(qs('#tables'), {onmouseover: menuOver, onmouseout: menuOut});");foreach($T
+as$R=>$Mf){$F=$this->tableName($Mf);if($F!=""){echo'".'select'." ",(support("table")||support("indexes")?'$F ":"$F ")."\n";}}echo" \n";}}$b=(function_exists('adminer_object')?adminer_object():new
+Adminer);$Wa=driver_config();$Le=$Wa['possible_drivers'];$y=$Wa['jush'];$Cg=$Wa['types'];$Of=$Wa['structured_types'];$Jg=$Wa['unsigned'];$ae=$Wa['operators'];$uc=$Wa['functions'];$yc=$Wa['grouping'];$Gb=$Wa['edit_functions'];if($b->operators===null)$b->operators=$ae;define("SERVER",$_GET[DRIVER]);define("DB",$_GET["db"]);define("ME",preg_replace('~\?.*~','',relative_uri()).'?'.(sid()?SID.'&':'').(SERVER!==null?DRIVER."=".urlencode(SERVER).'&':'').(isset($_GET["username"])?"username=".urlencode($_GET["username"]).'&':'').(DB!=""?'db='.urlencode(DB).'&'.(isset($_GET["ns"])?"ns=".urlencode($_GET["ns"])."&":""):''));$da="4.8.1";function
+page_header($mg,$l="",$Ba=array(),$ng=""){global$ba,$da,$b,$zb,$y;page_headers();if(is_ajax()&&$l){page_messages($l);exit;}$og=$mg.($ng!=""?": $ng":"");$pg=strip_tags($og.(SERVER!=""&&SERVER!="localhost"?h(" - ".SERVER):"")." - ".$b->name());echo'
+
-',$mi,'
+',$pg,'
',script_src(preg_replace("~\\?.*~","",ME)."?file=functions.js&version=4.8.1");if($b->head()){echo'
-';foreach($b->css()as$Ob){echo'
+';foreach($b->css()as$eb){echo'
';}}echo'
-
-';$q=get_temp_dir()."/adminer.version";if(!$_COOKIE["adminer_version"]&&function_exists('openssl_verify')&&file_exists($q)&&filemtime($q)+86400>time()){$Zi=unserialize(file_get_contents($q));$wg="-----BEGIN PUBLIC KEY-----
+
+';$o=get_temp_dir()."/adminer.version";if(!$_COOKIE["adminer_version"]&&function_exists('openssl_verify')&&file_exists($o)&&filemtime($o)+86400>time()){$Xg=unserialize(file_get_contents($o));$Ve="-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwqWOVuF5uw7/+Z70djoK
RlHIZFZPO0uYRezq90+7Amk+FDNd7KkL5eDve+vHRJBLAszF/7XKXe11xwliIsFs
DFWQlsABVZB3oisKCBEuI71J4kPH8dKGEWR9jDHFw3cWmoH3PmqImX6FISWbG3B8
@@ -1431,365 +626,283 @@ jHnq1cFpOIISzARlrHMa/43YfeNRAm/tsBXjSxembBPo7aQZLAWHmaj5+K19H10B
nCpz9Y++cipkVEiKRGih4ZEvjoFysEOdRLj6WiD/uUNky4xGeA6LaJqh5XpkFkcQ
fQIDAQAB
-----END PUBLIC KEY-----
-";if(openssl_verify($Zi["version"],base64_decode($Zi["signature"]),$wg)==1)$_COOKIE["adminer_version"]=$Zi["version"];}echo'
',script("mixin(qs('#help'), {onmouseover: function () { helpOpen = 1; }, onmouseout: helpMouseout});"),'
-';if($Va!==null){$A=substr(preg_replace('~\b(username|db|ns)=[^&]*&~','',ME),0,-1);echo'
'.$kc[DRIVER].' » ';$A=substr(preg_replace('~\b(db|ns)=[^&]*&~','',ME),0,-1);$M=$b->serverName(SERVER);$M=($M!=""?$M:lang(34));if($Va===false)echo"$M\n";else{echo"$M » ";if($_GET["ns"]!=""||(DB!=""&&is_array($Va)))echo''.h(DB).' » ';if(is_array($Va)){if($_GET["ns"]!="")echo''.h($_GET["ns"]).' » ';foreach($Va
-as$z=>$X){$dc=(is_array($X)?$X[1]:h($X));if($dc!="")echo"$dc » ";}}echo"$ji\n";}}echo"
$li \n","
\n";restart_session();page_messages($n);$k=&get_session("dbs");if(DB!=""&&$k&&!in_array(DB,$k,true))$k=null;stop_session();define("PAGE_HEADER",1);}function
-page_headers(){global$b;header("Content-Type: text/html; charset=utf-8");header("Cache-Control: no-cache");header("X-Frame-Options: deny");header("X-XSS-Protection: 0");header("X-Content-Type-Options: nosniff");header("Referrer-Policy: origin-when-cross-origin");foreach($b->csp()as$Nb){$Ad=array();foreach($Nb
-as$z=>$X)$Ad[]="$z $X";header("Content-Security-Policy: ".implode("; ",$Ad));}$b->headers();}function
+';if($Ba!==null){$A=substr(preg_replace('~\b(username|db|ns)=[^&]*&~','',ME),0,-1);echo'
'.$zb[DRIVER].' » ';$A=substr(preg_replace('~\b(db|ns)=[^&]*&~','',ME),0,-1);$O=$b->serverName(SERVER);$O=($O!=""?$O:'Server');if($Ba===false)echo"$O\n";else{echo"$O » ";if($_GET["ns"]!=""||(DB!=""&&is_array($Ba)))echo''.h(DB).' » ';if(is_array($Ba)){if($_GET["ns"]!="")echo''.h($_GET["ns"]).' » ';foreach($Ba
+as$z=>$X){$sb=(is_array($X)?$X[1]:h($X));if($sb!="")echo"$sb » ";}}echo"$mg\n";}}echo"
$og \n","
\n";restart_session();page_messages($l);$i=&get_session("dbs");if(DB!=""&&$i&&!in_array(DB,$i,true))$i=null;stop_session();define("PAGE_HEADER",1);}function
+page_headers(){global$b;header("Content-Type: text/html; charset=utf-8");header("Cache-Control: no-cache");header("X-Frame-Options: deny");header("X-XSS-Protection: 0");header("X-Content-Type-Options: nosniff");header("Referrer-Policy: origin-when-cross-origin");foreach($b->csp()as$db){$Dc=array();foreach($db
+as$z=>$X)$Dc[]="$z $X";header("Content-Security-Policy: ".implode("; ",$Dc));}$b->headers();}function
csp(){return
array(array("script-src"=>"'self' 'unsafe-inline' 'nonce-".get_nonce()."' 'strict-dynamic'","connect-src"=>"'self'","frame-src"=>"https://www.adminer.org","object-src"=>"'none'","base-uri"=>"'none'","form-action"=>"'self'",),);}function
-get_nonce(){static$ef;if(!$ef)$ef=base64_encode(rand_string());return$ef;}function
-page_messages($n){$Mi=preg_replace('~^[^?]*~','',$_SERVER["REQUEST_URI"]);$Re=$_SESSION["messages"][$Mi];if($Re){echo"
".implode("
\n
",$Re)."
".script("messagesPrint();");unset($_SESSION["messages"][$Mi]);}if($n)echo"
$n
\n";}function
-page_footer($Ue=""){global$b,$qi;echo'
+get_nonce(){static$Nd;if(!$Nd)$Nd=base64_encode(rand_string());return$Nd;}function
+page_messages($l){$Lg=preg_replace('~^[^?]*~','',$_SERVER["REQUEST_URI"]);$Ed=$_SESSION["messages"][$Lg];if($Ed){echo"".implode("
\n",$Ed)."
".script("messagesPrint();");unset($_SESSION["messages"][$Lg]);}if($l)echo"$l
\n";}function
+page_footer($Hd=""){global$b,$U;echo'
-';switch_lang();if($Ue!="auth"){echo'
+';if($Hd!="auth"){echo'
-
-
+
+
';}echo'
+';$b->navigation($Hd);echo'
',script("setupSubmitHighlight(document);");}function
-int32($Xe){while($Xe>=2147483648)$Xe-=4294967296;while($Xe<=-2147483649)$Xe+=4294967296;return(int)$Xe;}function
-long2str($W,$dj){$ah='';foreach($W
-as$X)$ah.=pack('V',$X);if($dj)return
-substr($ah,0,end($W));return$ah;}function
-str2long($ah,$dj){$W=array_values(unpack('V*',str_pad($ah,4*ceil(strlen($ah)/4),"\0")));if($dj)$W[]=strlen($ah);return$W;}function
-xxtea_mx($pj,$oj,$Nh,$he){return
-int32((($pj>>5&0x7FFFFFF)^$oj<<2)+(($oj>>3&0x1FFFFFFF)^$pj<<4))^int32(($Nh^$oj)+($he^$pj));}function
-encrypt_string($Ih,$z){if($Ih=="")return"";$z=array_values(unpack("V*",pack("H*",md5($z))));$W=str2long($Ih,true);$Xe=count($W)-1;$pj=$W[$Xe];$oj=$W[0];$xg=floor(6+52/($Xe+1));$Nh=0;while($xg-->0){$Nh=int32($Nh+0x9E3779B9);$rc=$Nh>>2&3;for($Of=0;$Of<$Xe;$Of++){$oj=$W[$Of+1];$We=xxtea_mx($pj,$oj,$Nh,$z[$Of&3^$rc]);$pj=int32($W[$Of]+$We);$W[$Of]=$pj;}$oj=$W[0];$We=xxtea_mx($pj,$oj,$Nh,$z[$Of&3^$rc]);$pj=int32($W[$Xe]+$We);$W[$Xe]=$pj;}return
+int32($E){while($E>=2147483648)$E-=4294967296;while($E<=-2147483649)$E+=4294967296;return(int)$E;}function
+long2str($W,$bh){$pf='';foreach($W
+as$X)$pf.=pack('V',$X);if($bh)return
+substr($pf,0,end($W));return$pf;}function
+str2long($pf,$bh){$W=array_values(unpack('V*',str_pad($pf,4*ceil(strlen($pf)/4),"\0")));if($bh)$W[]=strlen($pf);return$W;}function
+xxtea_mx($ih,$hh,$Sf,$ad){return
+int32((($ih>>5&0x7FFFFFF)^$hh<<2)+(($hh>>3&0x1FFFFFFF)^$ih<<4))^int32(($Sf^$hh)+($ad^$ih));}function
+encrypt_string($Nf,$z){if($Nf=="")return"";$z=array_values(unpack("V*",pack("H*",md5($z))));$W=str2long($Nf,true);$E=count($W)-1;$ih=$W[$E];$hh=$W[0];$H=floor(6+52/($E+1));$Sf=0;while($H-->0){$Sf=int32($Sf+0x9E3779B9);$Fb=$Sf>>2&3;for($re=0;$re<$E;$re++){$hh=$W[$re+1];$Jd=xxtea_mx($ih,$hh,$Sf,$z[$re&3^$Fb]);$ih=int32($W[$re]+$Jd);$W[$re]=$ih;}$hh=$W[0];$Jd=xxtea_mx($ih,$hh,$Sf,$z[$re&3^$Fb]);$ih=int32($W[$E]+$Jd);$W[$E]=$ih;}return
long2str($W,false);}function
-decrypt_string($Ih,$z){if($Ih=="")return"";if(!$z)return
-false;$z=array_values(unpack("V*",pack("H*",md5($z))));$W=str2long($Ih,false);$Xe=count($W)-1;$pj=$W[$Xe];$oj=$W[0];$xg=floor(6+52/($Xe+1));$Nh=int32($xg*0x9E3779B9);while($Nh){$rc=$Nh>>2&3;for($Of=$Xe;$Of>0;$Of--){$pj=$W[$Of-1];$We=xxtea_mx($pj,$oj,$Nh,$z[$Of&3^$rc]);$oj=int32($W[$Of]-$We);$W[$Of]=$oj;}$pj=$W[$Xe];$We=xxtea_mx($pj,$oj,$Nh,$z[$Of&3^$rc]);$oj=int32($W[0]-$We);$W[0]=$oj;$Nh=int32($Nh-0x9E3779B9);}return
-long2str($W,true);}$g='';$_d=$_SESSION["token"];if(!$_d)$_SESSION["token"]=rand(1,1e6);$qi=get_token();$eg=array();if($_COOKIE["adminer_permanent"]){foreach(explode(" ",$_COOKIE["adminer_permanent"])as$X){list($z)=explode(":",$X);$eg[$z]=$X;}}function
-add_invalid_login(){global$b;$nd=file_open_lock(get_temp_dir()."/adminer.invalid");if(!$nd)return;$ae=unserialize(stream_get_contents($nd));$gi=time();if($ae){foreach($ae
-as$be=>$X){if($X[0]<$gi)unset($ae[$be]);}}$Zd=&$ae[$b->bruteForceKey()];if(!$Zd)$Zd=array($gi+30*60,0);$Zd[1]++;file_write_unlock($nd,serialize($ae));}function
-check_invalid_login(){global$b;$ae=unserialize(@file_get_contents(get_temp_dir()."/adminer.invalid"));$Zd=($ae?$ae[$b->bruteForceKey()]:array());$df=($Zd[1]>29?$Zd[0]-time():0);if($df>0)auth_error(lang(84,ceil($df/60)));}$Ja=$_POST["auth"];if($Ja){session_regenerate_id();$Yi=$Ja["driver"];$M=$Ja["server"];$V=$Ja["username"];$F=(string)$Ja["password"];$l=$Ja["db"];set_password($Yi,$M,$V,$F);$_SESSION["db"][$Yi][$M][$V][$l]=true;if($Ja["permanent"]){$z=base64_encode($Yi)."-".base64_encode($M)."-".base64_encode($V)."-".base64_encode($l);$qg=$b->permanentLogin(true);$eg[$z]="$z:".base64_encode($qg?encrypt_string($F,$qg):"");cookie("adminer_permanent",implode(" ",$eg));}if(count($_POST)==1||DRIVER!=$Yi||SERVER!=$M||$_GET["username"]!==$V||DB!=$l)redirect(auth_url($Yi,$M,$V,$l));}elseif($_POST["logout"]&&(!$_d||verify_token())){foreach(array("pwds","db","dbs","queries")as$z)set_session($z,null);unset_permanent();redirect(substr(preg_replace('~\b(username|db|ns)=[^&]*&~','',ME),0,-1),lang(85).' '.lang(86));}elseif($eg&&!$_SESSION["pwds"]){session_regenerate_id();$qg=$b->permanentLogin();foreach($eg
-as$z=>$X){list(,$gb)=explode(":",$X);list($Yi,$M,$V,$l)=array_map('base64_decode',explode("-",$z));set_password($Yi,$M,$V,decrypt_string(base64_decode($gb),$qg));$_SESSION["db"][$Yi][$M][$V][$l]=true;}}function
-unset_permanent(){global$eg;foreach($eg
-as$z=>$X){list($Yi,$M,$V,$l)=array_map('base64_decode',explode("-",$z));if($Yi==DRIVER&&$M==SERVER&&$V==$_GET["username"]&&$l==DB)unset($eg[$z]);}cookie("adminer_permanent",implode(" ",$eg));}function
-auth_error($n){global$b,$_d;$ph=session_name();if(isset($_GET["username"])){header("HTTP/1.1 403 Forbidden");if(($_COOKIE[$ph]||$_GET[$ph])&&!$_d)$n=lang(87);else{restart_session();add_invalid_login();$F=get_password();if($F!==null){if($F===false)$n.=($n?' ':'').lang(88,target_blank(),'permanentLogin()');set_password(DRIVER,SERVER,$_GET["username"],null);}unset_permanent();}}if(!$_COOKIE[$ph]&&$_GET[$ph]&&ini_bool("session.use_only_cookies"))$n=lang(89);$Rf=session_get_cookie_params();cookie("adminer_key",($_COOKIE["adminer_key"]?$_COOKIE["adminer_key"]:rand_string()),$Rf["lifetime"]);page_header(lang(38),$n,null);echo"\n","";if(hidden_fields($_POST,array("auth")))echo"
".lang(90)."\n";echo"
\n";$b->loginForm();echo" \n";page_footer("auth");exit;}if(isset($_GET["username"])&&!class_exists("Min_DB")){unset($_SESSION["pwds"][DRIVER]);unset_permanent();page_header(lang(91),lang(92,implode(", ",$kg)),false);page_footer("auth");exit;}stop_session(true);if(isset($_GET["username"])&&is_string(get_password())){list($Fd,$gg)=explode(":",SERVER,2);if(preg_match('~^\s*([-+]?\d+)~',$gg,$C)&&($C[1]<1024||$C[1]>65535))auth_error(lang(93));check_invalid_login();$g=connect();$m=new
-Min_Driver($g);}$_e=null;if(!is_object($g)||($_e=$b->login($_GET["username"],get_password()))!==true){$n=(is_string($g)?h($g):(is_string($_e)?$_e:lang(32)));auth_error($n.(preg_match('~^ | $~',get_password())?' '.lang(94):''));}if($_POST["logout"]&&$_d&&!verify_token()){page_header(lang(83),lang(95));page_footer("db");exit;}if($Ja&&$_POST["token"])$_POST["token"]=$qi;$n='';if($_POST){if(!verify_token()){$Ud="max_input_vars";$Le=ini_get($Ud);if(extension_loaded("suhosin")){foreach(array("suhosin.request.max_vars","suhosin.post.max_vars")as$z){$X=ini_get($z);if($X&&(!$Le||$X<$Le)){$Ud=$z;$Le=$X;}}}$n=(!$_POST["token"]&&$Le?lang(96,"'$Ud'"):lang(95).' '.lang(97));}}elseif($_SERVER["REQUEST_METHOD"]=="POST"){$n=lang(98,"'post_max_size'");if(isset($_GET["sql"]))$n.=' '.lang(99);}function
-select($H,$h=null,$Ef=array(),$_=0){global$y;$ze=array();$x=array();$e=array();$Ta=array();$U=array();$I=array();odd('');for($t=0;(!$_||$t<$_)&&($J=$H->fetch_row());$t++){if(!$t){echo"":"".lang(12))."\n";return$I;}function
-referencable_primary($ih){$I=array();foreach(table_status('',true)as$Rh=>$Q){if($Rh!=$ih&&fk_support($Q)){foreach(fields($Rh)as$o){if($o["primary"]){if($I[$Rh]){unset($I[$Rh]);break;}$I[$Rh]=$o;}}}}return$I;}function
-adminer_settings(){parse_str($_COOKIE["adminer_settings"],$rh);return$rh;}function
-adminer_setting($z){$rh=adminer_settings();return$rh[$z];}function
-set_adminer_settings($rh){return
-cookie("adminer_settings",http_build_query($rh+adminer_settings()));}function
-textarea($D,$Y,$K=10,$pb=80){global$y;echo"";if(is_array($Y)){foreach($Y
+decrypt_string($Nf,$z){if($Nf=="")return"";if(!$z)return
+false;$z=array_values(unpack("V*",pack("H*",md5($z))));$W=str2long($Nf,false);$E=count($W)-1;$ih=$W[$E];$hh=$W[0];$H=floor(6+52/($E+1));$Sf=int32($H*0x9E3779B9);while($Sf){$Fb=$Sf>>2&3;for($re=$E;$re>0;$re--){$ih=$W[$re-1];$Jd=xxtea_mx($ih,$hh,$Sf,$z[$re&3^$Fb]);$hh=int32($W[$re]-$Jd);$W[$re]=$hh;}$ih=$W[$E];$Jd=xxtea_mx($ih,$hh,$Sf,$z[$re&3^$Fb]);$hh=int32($W[0]-$Jd);$W[0]=$hh;$Sf=int32($Sf-0x9E3779B9);}return
+long2str($W,true);}$f='';$Cc=$_SESSION["token"];if(!$Cc)$_SESSION["token"]=rand(1,1e6);$U=get_token();$De=array();if($_COOKIE["adminer_permanent"]){foreach(explode(" ",$_COOKIE["adminer_permanent"])as$X){list($z)=explode(":",$X);$De[$z]=$X;}}function
+add_invalid_login(){global$b;$r=file_open_lock(get_temp_dir()."/adminer.invalid");if(!$r)return;$Uc=unserialize(stream_get_contents($r));$jg=time();if($Uc){foreach($Uc
+as$Vc=>$X){if($X[0]<$jg)unset($Uc[$Vc]);}}$Tc=&$Uc[$b->bruteForceKey()];if(!$Tc)$Tc=array($jg+30*60,0);$Tc[1]++;file_write_unlock($r,serialize($Uc));}function
+check_invalid_login(){global$b;$Uc=unserialize(@file_get_contents(get_temp_dir()."/adminer.invalid"));$Tc=($Uc?$Uc[$b->bruteForceKey()]:array());$Md=($Tc[1]>29?$Tc[0]-time():0);if($Md>0)auth_error(lang(array('Too many unsuccessful logins, try again in %d minute.','Too many unsuccessful logins, try again in %d minutes.'),ceil($Md/60)));}$sa=$_POST["auth"];if($sa){session_regenerate_id();$Wg=$sa["driver"];$O=$sa["server"];$Rg=$sa["username"];$_e=(string)$sa["password"];$j=$sa["db"];set_password($Wg,$O,$Rg,$_e);$_SESSION["db"][$Wg][$O][$Rg][$j]=true;if($sa["permanent"]){$z=base64_encode($Wg)."-".base64_encode($O)."-".base64_encode($Rg)."-".base64_encode($j);$Re=$b->permanentLogin(true);$De[$z]="$z:".base64_encode($Re?encrypt_string($_e,$Re):"");cookie("adminer_permanent",implode(" ",$De));}if(count($_POST)==1||DRIVER!=$Wg||SERVER!=$O||$_GET["username"]!==$Rg||DB!=$j)redirect(auth_url($Wg,$O,$Rg,$j));}elseif($_POST["logout"]&&(!$Cc||verify_token())){foreach(array("pwds","db","dbs","queries")as$z)set_session($z,null);unset_permanent();redirect(substr(preg_replace('~\b(username|db|ns)=[^&]*&~','',ME),0,-1),'Logout successful.'.' '.'Thanks for using Adminer, consider donating .');}elseif($De&&!$_SESSION["pwds"]){session_regenerate_id();$Re=$b->permanentLogin();foreach($De
+as$z=>$X){list(,$Ia)=explode(":",$X);list($Wg,$O,$Rg,$j)=array_map('base64_decode',explode("-",$z));set_password($Wg,$O,$Rg,decrypt_string(base64_decode($Ia),$Re));$_SESSION["db"][$Wg][$O][$Rg][$j]=true;}}function
+unset_permanent(){global$De;foreach($De
+as$z=>$X){list($Wg,$O,$Rg,$j)=array_map('base64_decode',explode("-",$z));if($Wg==DRIVER&&$O==SERVER&&$Rg==$_GET["username"]&&$j==DB)unset($De[$z]);}cookie("adminer_permanent",implode(" ",$De));}function
+auth_error($l){global$b,$Cc;$_f=session_name();if(isset($_GET["username"])){header("HTTP/1.1 403 Forbidden");if(($_COOKIE[$_f]||$_GET[$_f])&&!$Cc)$l='Session expired, please login again.';else{restart_session();add_invalid_login();$_e=get_password();if($_e!==null){if($_e===false)$l.=($l?' ':'').sprintf('Master password expired. Implement %s method to make it permanent.',target_blank(),'permanentLogin()');set_password(DRIVER,SERVER,$_GET["username"],null);}unset_permanent();}}if(!$_COOKIE[$_f]&&$_GET[$_f]&&ini_bool("session.use_only_cookies"))$l='Session support must be enabled.';$ue=session_get_cookie_params();cookie("adminer_key",($_COOKIE["adminer_key"]?$_COOKIE["adminer_key"]:rand_string()),$ue["lifetime"]);page_header('Login',$l,null);echo"\n","";if(hidden_fields($_POST,array("auth")))echo"
".'The action will be performed after successful login with the same credentials.'."\n";echo"
\n";$b->loginForm();echo" \n";page_footer("auth");exit;}if(isset($_GET["username"])&&!class_exists("Min_DB")){unset($_SESSION["pwds"][DRIVER]);unset_permanent();page_header('No extension',sprintf('None of the supported PHP extensions (%s) are available.',implode(", ",$Le)),false);page_footer("auth");exit;}stop_session(true);if(isset($_GET["username"])&&is_string(get_password())){list($Hc,$He)=explode(":",SERVER,2);if(preg_match('~^\s*([-+]?\d+)~',$He,$C)&&($C[1]<1024||$C[1]>65535))auth_error('Connecting to privileged ports is not allowed.');check_invalid_login();$f=connect();$k=new
+Min_Driver($f);}$rd=null;if(!is_object($f)||($rd=$b->login($_GET["username"],get_password()))!==true){$l=(is_string($f)?h($f):(is_string($rd)?$rd:'Invalid credentials.'));auth_error($l.(preg_match('~^ | $~',get_password())?' '.'There is a space in the input password which might be the cause.':''));}if($_POST["logout"]&&$Cc&&!verify_token()){page_header('Logout','Invalid CSRF token. Send the form again.');page_footer("db");exit;}if($sa&&$_POST["token"])$_POST["token"]=$U;$l='';if($_POST){if(!verify_token()){$Pc="max_input_vars";$_d=ini_get($Pc);if(extension_loaded("suhosin")){foreach(array("suhosin.request.max_vars","suhosin.post.max_vars")as$z){$X=ini_get($z);if($X&&(!$_d||$X<$_d)){$Pc=$z;$_d=$X;}}}$l=(!$_POST["token"]&&$_d?sprintf('Maximum number of allowed fields exceeded. Please increase %s.',"'$Pc'"):'Invalid CSRF token. Send the form again.'.' '.'If you did not send this request from Adminer then close this page.');}}elseif($_SERVER["REQUEST_METHOD"]=="POST"){$l=sprintf('Too big POST data. Reduce the data or increase the %s configuration directive.',"'post_max_size'");if(isset($_GET["sql"]))$l.=' '.'You can upload a big SQL file via FTP and import it from server.';}function
+select($J,$g=null,$ie=array(),$_=0){global$y;$qd=array();$x=array();$e=array();$_a=array();$Cg=array();$K=array();odd('');for($u=0;(!$_||$u<$_)&&($L=$J->fetch_row());$u++){if(!$u){echo"":"".'No rows.')."\n";return$K;}function
+referencable_primary($vf){$K=array();foreach(table_status('',true)as$Wf=>$R){if($Wf!=$vf&&fk_support($R)){foreach(fields($Wf)as$m){if($m["primary"]){if($K[$Wf]){unset($K[$Wf]);break;}$K[$Wf]=$m;}}}}return$K;}function
+adminer_settings(){parse_str($_COOKIE["adminer_settings"],$Bf);return$Bf;}function
+adminer_setting($z){$Bf=adminer_settings();return$Bf[$z];}function
+set_adminer_settings($Bf){return
+cookie("adminer_settings",http_build_query($Bf+adminer_settings()));}function
+textarea($F,$Y,$M=10,$Qa=80){global$y;echo"";if(is_array($Y)){foreach($Y
as$X)echo
h($X[0])."\n\n\n";}else
echo
h($Y);echo" ";}function
-edit_type($z,$o,$nb,$jd=array(),$Rc=array()){global$Jh,$U,$Ki,$sf;$T=$o["type"];echo'
';if($T&&!isset($U[$T])&&!isset($jd[$T])&&!in_array($T,$Rc))$Rc[]=$T;if($jd)$Jh[lang(100)]=$jd;echo
-optionlist(array_merge($Rc,$Jh),$T),' ',"('.lang(101).')'.optionlist($nb,$o["collation"]).' ',($Ki?"'.optionlist($Ki,$o["unsigned"]).' ':''),(isset($o['on_update'])?"'.optionlist(array(""=>"(".lang(102).")","CURRENT_TIMESTAMP"),(preg_match('~^CURRENT_TIMESTAMP~i',$o["on_update"])?"CURRENT_TIMESTAMP":$o["on_update"])).' ':''),($jd?"(".lang(103).")".optionlist(explode("|",$sf),$o["on_delete"])." ":" ");}function
-process_length($we){global$Bc;return(preg_match("~^\\s*\\(?\\s*$Bc(?:\\s*,\\s*$Bc)*+\\s*\\)?\\s*\$~",$we)&&preg_match_all("~$Bc~",$we,$Fe)?"(".implode(",",$Fe[0]).")":preg_replace('~^[0-9].*~','(\0)',preg_replace('~[^-0-9,+()[\]]~','',$we)));}function
-process_type($o,$lb="COLLATE"){global$Ki;return" $o[type]".process_length($o["length"]).(preg_match(number_type(),$o["type"])&&in_array($o["unsigned"],$Ki)?" $o[unsigned]":"").(preg_match('~char|text|enum|set~',$o["type"])&&$o["collation"]?" $lb ".q($o["collation"]):"");}function
-process_field($o,$Ci){return
-array(idf_escape(trim($o["field"])),process_type($Ci),($o["null"]?" NULL":" NOT NULL"),default_value($o),(preg_match('~timestamp|datetime~',$o["type"])&&$o["on_update"]?" ON UPDATE $o[on_update]":""),(support("comment")&&$o["comment"]!=""?" COMMENT ".q($o["comment"]):""),($o["auto_increment"]?auto_increment():null),);}function
-default_value($o){$Yb=$o["default"];return($Yb===null?"":" DEFAULT ".(preg_match('~char|binary|text|enum|set~',$o["type"])||preg_match('~^(?![a-z])~i',$Yb)?q($Yb):$Yb));}function
-type_class($T){foreach(array('char'=>'text','date'=>'time|year','binary'=>'blob','enum'=>'set',)as$z=>$X){if(preg_match("~$z|$X~",$T))return" class='$z'";}}function
-edit_fields($p,$nb,$T="TABLE",$jd=array()){global$Vd;$p=array_values($p);$Zb=(($_POST?$_POST["defaults"]:adminer_setting("defaults"))?"":" class='hidden'");$ub=(($_POST?$_POST["comments"]:adminer_setting("comments"))?"":" class='hidden'");echo'
-';if($T=="PROCEDURE"){echo'';}echo' ',($T=="TABLE"?lang(104):lang(105)),' ',lang(49),' ',script("qs('#enum-edit').onblur = editingLengthBlur;"),' ',lang(106),' ',lang(107);if($T=="TABLE"){echo' NULL
- AI ',doc_link(array('sql'=>"example-auto-increment.html",'mariadb'=>"auto_increment/",'sqlite'=>"autoinc.html",'pgsql'=>"datatype.html#DATATYPE-SERIAL",'mssql'=>"ms186775.aspx",)),'',lang(52),(support("comment")?" '," ".script("row_count = ".count($p).";"),'
+edit_type($z,$m,$Pa,$q=array(),$ec=array()){global$Of,$Cg,$Jg,$Wd;$V=$m["type"];echo' ';if($V&&!isset($Cg[$V])&&!isset($q[$V])&&!in_array($V,$ec))$ec[]=$V;if($q)$Of['Foreign keys']=$q;echo
+optionlist(array_merge($ec,$Of),$V),' ',"('.'collation'.')'.optionlist($Pa,$m["collation"]).' ',($Jg?"'.optionlist($Jg,$m["unsigned"]).' ':''),(isset($m['on_update'])?"'.optionlist(array(""=>"(".'ON UPDATE'.")","CURRENT_TIMESTAMP"),(preg_match('~^CURRENT_TIMESTAMP~i',$m["on_update"])?"CURRENT_TIMESTAMP":$m["on_update"])).' ':''),($q?"(".'ON DELETE'.")".optionlist(explode("|",$Wd),$m["on_delete"])." ":" ");}function
+process_length($nd){global$Qb;return(preg_match("~^\\s*\\(?\\s*$Qb(?:\\s*,\\s*$Qb)*+\\s*\\)?\\s*\$~",$nd)&&preg_match_all("~$Qb~",$nd,$ud)?"(".implode(",",$ud[0]).")":preg_replace('~^[0-9].*~','(\0)',preg_replace('~[^-0-9,+()[\]]~','',$nd)));}function
+process_type($m,$Na="COLLATE"){global$Jg;return" $m[type]".process_length($m["length"]).(preg_match(number_type(),$m["type"])&&in_array($m["unsigned"],$Jg)?" $m[unsigned]":"").(preg_match('~char|text|enum|set~',$m["type"])&&$m["collation"]?" $Na ".q($m["collation"]):"");}function
+process_field($m,$Bg){return
+array(idf_escape(trim($m["field"])),process_type($Bg),($m["null"]?" NULL":" NOT NULL"),default_value($m),(preg_match('~timestamp|datetime~',$m["type"])&&$m["on_update"]?" ON UPDATE $m[on_update]":""),(support("comment")&&$m["comment"]!=""?" COMMENT ".q($m["comment"]):""),($m["auto_increment"]?auto_increment():null),);}function
+default_value($m){$ob=$m["default"];return($ob===null?"":" DEFAULT ".(preg_match('~char|binary|text|enum|set~',$m["type"])||preg_match('~^(?![a-z])~i',$ob)?q($ob):$ob));}function
+type_class($V){foreach(array('char'=>'text','date'=>'time|year','binary'=>'blob','enum'=>'set',)as$z=>$X){if(preg_match("~$z|$X~",$V))return" class='$z'";}}function
+edit_fields($n,$Pa,$V="TABLE",$q=array()){global$Qc;$n=array_values($n);$pb=(($_POST?$_POST["defaults"]:adminer_setting("defaults"))?"":" class='hidden'");$Ua=(($_POST?$_POST["comments"]:adminer_setting("comments"))?"":" class='hidden'");echo'
+';if($V=="PROCEDURE"){echo'';}echo' ',($V=="TABLE"?'Column name':'Parameter name'),' Type ',script("qs('#enum-edit').onblur = editingLengthBlur;"),' Length
+ ','Options';if($V=="TABLE"){echo' NULL
+ AI ',doc_link(array('sqlite'=>"autoinc.html",)),'Default value
+',(support("comment")?" '," ".script("row_count = ".count($n).";"),'
-',script("mixin(qsl('tbody'), {onclick: editingClick, onkeydown: editingKeydown, oninput: editingInput});");foreach($p
-as$t=>$o){$t++;$Ff=$o[($_POST?"orig":"field")];$hc=(isset($_POST["add"][$t-1])||(isset($o["field"])&&!$_POST["drop_col"][$t]))&&(support("drop_col")||$Ff=="");echo'
-',($T=="PROCEDURE"?"".html_select("fields[$t][inout]",explode("|",$Vd),$o["inout"]):""),' ';if($hc){echo' ';}echo' ';edit_type("fields[$t]",$o,$nb,$jd);if($T=="TABLE"){echo' ',checkbox("fields[$t][null]",1,$o["null"],"","","block","label-null"),' ',checkbox("fields[$t][has_default]",1,$o["has_default"],"","","","label-default"),' ',(support("comment")?" ":"");}echo"",(support("move_col")?" "." "." ":""),($Ff==""||support("drop_col")?" ":"");}}function
-process_fields(&$p){$kf=0;if($_POST["up"]){$qe=0;foreach($p
-as$z=>$o){if(key($_POST["up"])==$z){unset($p[$z]);array_splice($p,$qe,0,array($o));break;}if(isset($o["field"]))$qe=$kf;$kf++;}}elseif($_POST["down"]){$ld=false;foreach($p
-as$z=>$o){if(isset($o["field"])&&$ld){unset($p[key($_POST["down"])]);array_splice($p,$kf,0,array($ld));break;}if(key($_POST["down"])==$z)$ld=$o;$kf++;}}elseif($_POST["add"]){$p=array_values($p);array_splice($p,key($_POST["add"]),0,array(array()));}elseif(!$_POST["drop_col"])return
+',script("mixin(qsl('tbody'), {onclick: editingClick, onkeydown: editingKeydown, oninput: editingInput});");foreach($n
+as$u=>$m){$u++;$je=$m[($_POST?"orig":"field")];$wb=(isset($_POST["add"][$u-1])||(isset($m["field"])&&!$_POST["drop_col"][$u]))&&(support("drop_col")||$je=="");echo'
+',($V=="PROCEDURE"?"".html_select("fields[$u][inout]",explode("|",$Qc),$m["inout"]):""),' ';if($wb){echo' ';}echo' ';edit_type("fields[$u]",$m,$Pa,$q);if($V=="TABLE"){echo' ',checkbox("fields[$u][null]",1,$m["null"],"","","block","label-null"),' ',checkbox("fields[$u][has_default]",1,$m["has_default"],"","","","label-default"),' ',(support("comment")?" ":"");}echo"",(support("move_col")?" "." "." ":""),($je==""||support("drop_col")?" ":"");}}function
+process_fields(&$n){$Sd=0;if($_POST["up"]){$hd=0;foreach($n
+as$z=>$m){if(key($_POST["up"])==$z){unset($n[$z]);array_splice($n,$hd,0,array($m));break;}if(isset($m["field"]))$hd=$Sd;$Sd++;}}elseif($_POST["down"]){$rc=false;foreach($n
+as$z=>$m){if(isset($m["field"])&&$rc){unset($n[key($_POST["down"])]);array_splice($n,$Sd,0,array($rc));break;}if(key($_POST["down"])==$z)$rc=$m;$Sd++;}}elseif($_POST["add"]){$n=array_values($n);array_splice($n,key($_POST["add"]),0,array(array()));}elseif(!$_POST["drop_col"])return
false;return
true;}function
normalize_enum($C){return"'".str_replace("'","''",addcslashes(stripcslashes(str_replace($C[0][0].$C[0][0],$C[0][0],substr($C[0],1,-1))),'\\'))."'";}function
-grant($qd,$sg,$e,$rf){if(!$sg)return
-true;if($sg==array("ALL PRIVILEGES","GRANT OPTION"))return($qd=="GRANT"?queries("$qd ALL PRIVILEGES$rf WITH GRANT OPTION"):queries("$qd ALL PRIVILEGES$rf")&&queries("$qd GRANT OPTION$rf"));return
-queries("$qd ".preg_replace('~(GRANT OPTION)\([^)]*\)~','\1',implode("$e, ",$sg).$e).$rf);}function
-drop_create($lc,$i,$mc,$di,$oc,$B,$Qe,$Oe,$Pe,$of,$bf){if($_POST["drop"])query_redirect($lc,$B,$Qe);elseif($of=="")query_redirect($i,$B,$Pe);elseif($of!=$bf){$Lb=queries($i);queries_redirect($B,$Oe,$Lb&&queries($lc));if($Lb)queries($mc);}else
-queries_redirect($B,$Oe,queries($di)&&queries($oc)&&queries($lc)&&queries($i));}function
-create_trigger($rf,$J){global$y;$ii=" $J[Timing] $J[Event]".(preg_match('~ OF~',$J["Event"])?" $J[Of]":"");return"CREATE TRIGGER ".idf_escape($J["Trigger"]).($y=="mssql"?$rf.$ii:$ii.$rf).rtrim(" $J[Type]\n$J[Statement]",";").";";}function
-create_routine($Wg,$J){global$Vd,$y;$N=array();$p=(array)$J["fields"];ksort($p);foreach($p
-as$o){if($o["field"]!="")$N[]=(preg_match("~^($Vd)\$~",$o["inout"])?"$o[inout] ":"").idf_escape($o["field"]).process_type($o,"CHARACTER SET");}$ac=rtrim("\n$J[definition]",";");return"CREATE $Wg ".idf_escape(trim($J["name"]))." (".implode(", ",$N).")".(isset($_GET["function"])?" RETURNS".process_type($J["returns"],"CHARACTER SET"):"").($J["language"]?" LANGUAGE $J[language]":"").($y=="pgsql"?" AS ".q($ac):"$ac;");}function
-remove_definer($G){return
-preg_replace('~^([A-Z =]+) DEFINER=`'.preg_replace('~@(.*)~','`@`(%|\1)',logged_user()).'`~','\1',$G);}function
-format_foreign_key($r){global$sf;$l=$r["db"];$ff=$r["ns"];return" FOREIGN KEY (".implode(", ",array_map('idf_escape',$r["source"])).") REFERENCES ".($l!=""&&$l!=$_GET["db"]?idf_escape($l).".":"").($ff!=""&&$ff!=$_GET["ns"]?idf_escape($ff).".":"").table($r["table"])." (".implode(", ",array_map('idf_escape',$r["target"])).")".(preg_match("~^($sf)\$~",$r["on_delete"])?" ON DELETE $r[on_delete]":"").(preg_match("~^($sf)\$~",$r["on_update"])?" ON UPDATE $r[on_update]":"");}function
-tar_file($q,$ni){$I=pack("a100a8a8a8a12a12",$q,644,0,0,decoct($ni->size),decoct(time()));$fb=8*32;for($t=0;$tsend();echo
-str_repeat("\0",511-($ni->size+511)%512);}function
-ini_bytes($Ud){$X=ini_get($Ud);switch(strtolower(substr($X,-1))){case'g':$X*=1024;case'm':$X*=1024;case'k':$X*=1024;}return$X;}function
-doc_link($bg,$ei="? "){global$y,$g;$nh=$g->server_info;$Zi=preg_replace('~^(\d\.?\d).*~s','\1',$nh);$Oi=array('sql'=>"https://dev.mysql.com/doc/refman/$Zi/en/",'sqlite'=>"https://www.sqlite.org/",'pgsql'=>"https://www.postgresql.org/docs/$Zi/",'mssql'=>"https://msdn.microsoft.com/library/",'oracle'=>"https://www.oracle.com/pls/topic/lookup?ctx=db".preg_replace('~^.* (\d+)\.(\d+)\.\d+\.\d+\.\d+.*~s','\1\2',$nh)."&id=",);if(preg_match('~MariaDB~',$nh)){$Oi['sql']="https://mariadb.com/kb/en/library/";$bg['sql']=(isset($bg['mariadb'])?$bg['mariadb']:str_replace(".html","/",$bg['sql']));}return($bg[$y]?"$ei ":"");}function
-ob_gzencode($P){return
-gzencode($P);}function
-db_size($l){global$g;if(!$g->select_db($l))return"?";$I=0;foreach(table_status()as$R)$I+=$R["Data_length"]+$R["Index_length"];return
-format_number($I);}function
-set_utf8mb4($i){global$g;static$N=false;if(!$N&&preg_match('~\butf8mb4~i',$i)){$N=true;echo"SET NAMES ".charset($g).";\n\n";}}function
-connect_error(){global$b,$g,$qi,$n,$kc;if(DB!=""){header("HTTP/1.1 404 Not Found");page_header(lang(37).": ".h(DB),lang(112),true);}else{if($_POST["db"]&&!$n)queries_redirect(substr(ME,0,-1),lang(113),drop_databases($_POST["db"]));page_header(lang(114),$n,false);echo"\n";foreach(array('database'=>lang(115),'privileges'=>lang(71),'processlist'=>lang(116),'variables'=>lang(117),'status'=>lang(118),)as$z=>$X){if(support($z))echo"$X \n";}echo"
".lang(119,$kc[DRIVER],"".h($g->server_info)." ","$g->extension ")."\n","
".lang(120,"".h(logged_user())." ")."\n";$k=$b->databases();if($k){$dh=support("scheme");$nb=collations();echo"
\n","\n",script("mixin(qsl('table'), {onclick: tableClick, ondblclick: partialArg(tableClick, true)});"),"".(support("database")?"":"")." ".lang(37)." - ".lang(121)." "." ".lang(122)." ".lang(123)." ".lang(124)." - ".lang(125)." ".script("qsl('a').onclick = partial(ajaxSetHtml, '".js_escape(ME)."script=connect');","")." \n";$k=($_GET["dbsize"]?count_tables($k):array_flip($k));foreach($k
-as$l=>$S){$Vg=h(ME)."db=".urlencode($l);$u=h("Db-".$l);echo"".(support("database")?"".checkbox("db[]",$l,in_array($l,(array)$_POST["db"]),"","","",$u):"")," ".h($l)." ";$mb=h(db_collation($l,$nb));echo"".(support("database")?"$mb ":$mb)," ".($_GET["dbsize"]?$S:"?")." ","".($_GET["dbsize"]?db_size($l):"?"),"\n";}echo"
\n",(support("database")?"\n":"")," \n"," \n",script("tableCheck();");}}page_footer("db");}if(isset($_GET["status"]))$_GET["variables"]=$_GET["status"];if(isset($_GET["import"]))$_GET["sql"]=$_GET["import"];if(!(DB!=""?$g->select_db(DB):isset($_GET["sql"])||isset($_GET["dump"])||isset($_GET["database"])||isset($_GET["processlist"])||isset($_GET["privileges"])||isset($_GET["user"])||isset($_GET["variables"])||$_GET["script"]=="connect"||$_GET["script"]=="kill")){if(DB!=""||$_GET["refresh"]){restart_session();set_session("dbs",null);}connect_error();exit;}if(support("scheme")){if(DB!=""&&$_GET["ns"]!==""){if(!isset($_GET["ns"]))redirect(preg_replace('~ns=[^&]*&~','',ME)."ns=".get_schema());if(!set_schema($_GET["ns"])){header("HTTP/1.1 404 Not Found");page_header(lang(77).": ".h($_GET["ns"]),lang(128),true);page_footer("ns");exit;}}}$sf="RESTRICT|NO ACTION|CASCADE|SET NULL|SET DEFAULT";class
+grant($vc,$Se,$e,$Vd){if(!$Se)return
+true;if($Se==array("ALL PRIVILEGES","GRANT OPTION"))return($vc=="GRANT"?queries("$vc ALL PRIVILEGES$Vd WITH GRANT OPTION"):queries("$vc ALL PRIVILEGES$Vd")&&queries("$vc GRANT OPTION$Vd"));return
+queries("$vc ".preg_replace('~(GRANT OPTION)\([^)]*\)~','\1',implode("$e, ",$Se).$e).$Vd);}function
+drop_create($_b,$h,$Ab,$gg,$Cb,$B,$Dd,$Bd,$Cd,$Ud,$Ld){if($_POST["drop"])query_redirect($_b,$B,$Dd);elseif($Ud=="")query_redirect($h,$B,$Cd);elseif($Ud!=$Ld){$cb=queries($h);queries_redirect($B,$Bd,$cb&&queries($_b));if($cb)queries($Ab);}else
+queries_redirect($B,$Bd,queries($gg)&&queries($Cb)&&queries($_b)&&queries($h));}function
+create_trigger($Vd,$L){global$y;$lg=" $L[Timing] $L[Event]".(preg_match('~ OF~',$L["Event"])?" $L[Of]":"");return"CREATE TRIGGER ".idf_escape($L["Trigger"]).($y=="mssql"?$Vd.$lg:$lg.$Vd).rtrim(" $L[Type]\n$L[Statement]",";").";";}function
+create_routine($nf,$L){global$Qc,$y;$P=array();$n=(array)$L["fields"];ksort($n);foreach($n
+as$m){if($m["field"]!="")$P[]=(preg_match("~^($Qc)\$~",$m["inout"])?"$m[inout] ":"").idf_escape($m["field"]).process_type($m,"CHARACTER SET");}$qb=rtrim("\n$L[definition]",";");return"CREATE $nf ".idf_escape(trim($L["name"]))." (".implode(", ",$P).")".(isset($_GET["function"])?" RETURNS".process_type($L["returns"],"CHARACTER SET"):"").($L["language"]?" LANGUAGE $L[language]":"").($y=="pgsql"?" AS ".q($qb):"$qb;");}function
+remove_definer($I){return
+preg_replace('~^([A-Z =]+) DEFINER=`'.preg_replace('~@(.*)~','`@`(%|\1)',logged_user()).'`~','\1',$I);}function
+format_foreign_key($p){global$Wd;$j=$p["db"];$Od=$p["ns"];return" FOREIGN KEY (".implode(", ",array_map('idf_escape',$p["source"])).") REFERENCES ".($j!=""&&$j!=$_GET["db"]?idf_escape($j).".":"").($Od!=""&&$Od!=$_GET["ns"]?idf_escape($Od).".":"").table($p["table"])." (".implode(", ",array_map('idf_escape',$p["target"])).")".(preg_match("~^($Wd)\$~",$p["on_delete"])?" ON DELETE $p[on_delete]":"").(preg_match("~^($Wd)\$~",$p["on_update"])?" ON UPDATE $p[on_update]":"");}function
+tar_file($o,$qg){$K=pack("a100a8a8a8a12a12",$o,644,0,0,decoct($qg->size),decoct(time()));$Ha=8*32;for($u=0;$usend();echo
+str_repeat("\0",511-($qg->size+511)%512);}function
+ini_bytes($Pc){$X=ini_get($Pc);switch(strtolower(substr($X,-1))){case'g':$X*=1024;case'm':$X*=1024;case'k':$X*=1024;}return$X;}function
+doc_link($Ae,$hg="? "){global$y,$f;$yf=$f->server_info;$Xg=preg_replace('~^(\d\.?\d).*~s','\1',$yf);$Ng=array('sql'=>"https://dev.mysql.com/doc/refman/$Xg/en/",'sqlite'=>"https://www.sqlite.org/",'pgsql'=>"https://www.postgresql.org/docs/$Xg/",'mssql'=>"https://msdn.microsoft.com/library/",'oracle'=>"https://www.oracle.com/pls/topic/lookup?ctx=db".preg_replace('~^.* (\d+)\.(\d+)\.\d+\.\d+\.\d+.*~s','\1\2',$yf)."&id=",);if(preg_match('~MariaDB~',$yf)){$Ng['sql']="https://mariadb.com/kb/en/library/";$Ae['sql']=(isset($Ae['mariadb'])?$Ae['mariadb']:str_replace(".html","/",$Ae['sql']));}return($Ae[$y]?"$hg ":"");}function
+ob_gzencode($Q){return
+gzencode($Q);}function
+db_size($j){global$f;if(!$f->select_db($j))return"?";$K=0;foreach(table_status()as$S)$K+=$S["Data_length"]+$S["Index_length"];return
+format_number($K);}function
+set_utf8mb4($h){global$f;static$P=false;if(!$P&&preg_match('~\butf8mb4~i',$h)){$P=true;echo"SET NAMES ".charset($f).";\n\n";}}function
+connect_error(){global$b,$f,$U,$l,$zb;if(DB!=""){header("HTTP/1.1 404 Not Found");page_header('Database'.": ".h(DB),'Invalid database.',true);}else{if($_POST["db"]&&!$l)queries_redirect(substr(ME,0,-1),'Databases have been dropped.',drop_databases($_POST["db"]));page_header('Select database',$l,false);echo"\n";foreach(array('database'=>'Create database','privileges'=>'Privileges','processlist'=>'Process list','variables'=>'Variables','status'=>'Status',)as$z=>$X){if(support($z))echo"$X \n";}echo"
".sprintf('%s version: %s through PHP extension %s',$zb[DRIVER],"".h($f->server_info)." ","$f->extension ")."\n","
".sprintf('Logged as: %s',"".h(logged_user())." ")."\n";$i=$b->databases();if($i){$rf=support("scheme");$Pa=collations();echo"
\n","\n",script("mixin(qsl('table'), {onclick: tableClick, ondblclick: partialArg(tableClick, true)});"),"".(support("database")?"":"")." ".'Database'." - ".'Refresh'." "." ".'Collation'." ".'Tables'." ".'Size'." - ".'Compute'." ".script("qsl('a').onclick = partial(ajaxSetHtml, '".js_escape(ME)."script=connect');","")." \n";$i=($_GET["dbsize"]?count_tables($i):array_flip($i));foreach($i
+as$j=>$T){$mf=h(ME)."db=".urlencode($j);$v=h("Db-".$j);echo"".(support("database")?"".checkbox("db[]",$j,in_array($j,(array)$_POST["db"]),"","","",$v):"")," ".h($j)." ";$Oa=h(db_collation($j,$Pa));echo"".(support("database")?"$Oa ":$Oa)," ".($_GET["dbsize"]?$T:"?")." ","".($_GET["dbsize"]?db_size($j):"?"),"\n";}echo"
\n",(support("database")?"\n":"")," \n"," \n",script("tableCheck();");}}page_footer("db");}if(isset($_GET["status"]))$_GET["variables"]=$_GET["status"];if(isset($_GET["import"]))$_GET["sql"]=$_GET["import"];if(!(DB!=""?$f->select_db(DB):isset($_GET["sql"])||isset($_GET["dump"])||isset($_GET["database"])||isset($_GET["processlist"])||isset($_GET["privileges"])||isset($_GET["user"])||isset($_GET["variables"])||$_GET["script"]=="connect"||$_GET["script"]=="kill")){if(DB!=""||$_GET["refresh"]){restart_session();set_session("dbs",null);}connect_error();exit;}$Wd="RESTRICT|NO ACTION|CASCADE|SET NULL|SET DEFAULT";class
TmpFile{var$handler;var$size;function
__construct(){$this->handler=tmpfile();}function
-write($Eb){$this->size+=strlen($Eb);fwrite($this->handler,$Eb);}function
-send(){fseek($this->handler,0);fpassthru($this->handler);fclose($this->handler);}}$Bc="'(?:''|[^'\\\\]|\\\\.)*'";$Vd="IN|OUT|INOUT";if(isset($_GET["select"])&&($_POST["edit"]||$_POST["clone"])&&!$_POST["save"])$_GET["edit"]=$_GET["select"];if(isset($_GET["callf"]))$_GET["call"]=$_GET["callf"];if(isset($_GET["function"]))$_GET["procedure"]=$_GET["function"];if(isset($_GET["download"])){$a=$_GET["download"];$p=fields($a);header("Content-Type: application/octet-stream");header("Content-Disposition: attachment; filename=".friendly_url("$a-".implode("_",$_GET["where"])).".".friendly_url($_GET["field"]));$L=array(idf_escape($_GET["field"]));$H=$m->select($a,$L,array(where($_GET,$p)),$L);$J=($H?$H->fetch_row():array());echo$m->value($J[0],$p[$_GET["field"]]);exit;}elseif(isset($_GET["table"])){$a=$_GET["table"];$p=fields($a);if(!$p)$n=error();$R=table_status1($a,true);$D=$b->tableName($R);page_header(($p&&is_view($R)?$R['Engine']=='materialized view'?lang(129):lang(130):lang(131)).": ".($D!=""?$D:h($a)),$n);$b->selectLinks($R);$tb=$R["Comment"];if($tb!="")echo"".lang(50).": ".h($tb)."\n";if($p)$b->tableStructurePrint($p);if(!is_view($R)){if(support("indexes")){echo"
".lang(132)." \n";$x=indexes($a);if($x)$b->tableIndexesPrint($x);echo''.lang(133)." \n";}if(fk_support($R)){echo"
".lang(100)." \n";$jd=foreign_keys($a);if($jd){echo"\n","".lang(134)." ".lang(135)." ".lang(103)." ".lang(102)." \n";foreach($jd
-as$D=>$r){echo"","".implode(" , ",array_map('h',$r["source"]))." ","".($r["db"]!=""?"".h($r["db"])." .":"").($r["ns"]!=""?"".h($r["ns"])." .":"").h($r["table"])." ","(".implode(" , ",array_map('h',$r["target"]))." )","".h($r["on_delete"])."\n"," ".h($r["on_update"])."\n",' '.lang(136).' ';}echo"
\n";}echo''.lang(137)." \n";}}if(support(is_view($R)?"view_trigger":"trigger")){echo"
".lang(138)." \n";$Bi=triggers($a);if($Bi){echo"\n";foreach($Bi
-as$z=>$X)echo"".h($X[0])." ".h($X[1])." ".h($z)." ".lang(136)." \n";echo"
\n";}echo''.lang(139)." \n";}}elseif(isset($_GET["schema"])){page_header(lang(70),"",array(),h(DB.($_GET["ns"]?".$_GET[ns]":"")));$Th=array();$Uh=array();$ea=($_GET["schema"]?$_GET["schema"]:$_COOKIE["adminer_schema-".str_replace(".","_",DB)]);preg_match_all('~([^:]+):([-0-9.]+)x([-0-9.]+)(_|$)~',$ea,$Fe,PREG_SET_ORDER);foreach($Fe
-as$t=>$C){$Th[$C[1]]=array($C[2],$C[3]);$Uh[]="\n\t'".js_escape($C[1])."': [ $C[2], $C[3] ]";}$ri=0;$Qa=-1;$ch=array();$Hg=array();$ue=array();foreach(table_status('',true)as$Q=>$R){if(is_view($R))continue;$hg=0;$ch[$Q]["fields"]=array();foreach(fields($Q)as$D=>$o){$hg+=1.25;$o["pos"]=$hg;$ch[$Q]["fields"][$D]=$o;}$ch[$Q]["pos"]=($Th[$Q]?$Th[$Q]:array($ri,0));foreach($b->foreignKeys($Q)as$X){if(!$X["db"]){$se=$Qa;if($Th[$Q][1]||$Th[$X["table"]][1])$se=min(floatval($Th[$Q][1]),floatval($Th[$X["table"]][1]))-1;else$Qa-=.1;while($ue[(string)$se])$se-=.0001;$ch[$Q]["references"][$X["table"]][(string)$se]=array($X["source"],$X["target"]);$Hg[$X["table"]][$Q][(string)$se]=$X["target"];$ue[(string)$se]=true;}}$ri=max($ri,$ch[$Q]["pos"][0]+2.5+$hg);}echo'
+write($Za){$this->size+=strlen($Za);fwrite($this->handler,$Za);}function
+send(){fseek($this->handler,0);fpassthru($this->handler);fclose($this->handler);}}$Qb="'(?:''|[^'\\\\]|\\\\.)*'";$Qc="IN|OUT|INOUT";if(isset($_GET["select"])&&($_POST["edit"]||$_POST["clone"])&&!$_POST["save"])$_GET["edit"]=$_GET["select"];if(isset($_GET["download"])){$a=$_GET["download"];$n=fields($a);header("Content-Type: application/octet-stream");header("Content-Disposition: attachment; filename=".friendly_url("$a-".implode("_",$_GET["where"])).".".friendly_url($_GET["field"]));$N=array(idf_escape($_GET["field"]));$J=$k->select($a,$N,array(where($_GET,$n)),$N);$L=($J?$J->fetch_row():array());echo$k->value($L[0],$n[$_GET["field"]]);exit;}elseif(isset($_GET["table"])){$a=$_GET["table"];$n=fields($a);if(!$n)$l=error();$S=table_status1($a,true);$F=$b->tableName($S);page_header(($n&&is_view($S)?$S['Engine']=='materialized view'?'Materialized view':'View':'Table').": ".($F!=""?$F:h($a)),$l);$b->selectLinks($S);$Ta=$S["Comment"];if($Ta!="")echo"
".'Comment'.": ".h($Ta)."\n";if($n)$b->tableStructurePrint($n);if(!is_view($S)){if(support("indexes")){echo"
".'Indexes'." \n";$x=indexes($a);if($x)$b->tableIndexesPrint($x);echo'
'.'Alter indexes'." \n";}if(fk_support($S)){echo"
".'Foreign keys'." \n";$q=foreign_keys($a);if($q){echo"
\n","".'Source'." ".'Target'." ".'ON DELETE'." ".'ON UPDATE'." \n";foreach($q
+as$F=>$p){echo"","".implode(" , ",array_map('h',$p["source"]))." ","".($p["db"]!=""?"".h($p["db"])." .":"").($p["ns"]!=""?"".h($p["ns"])." .":"").h($p["table"])." ","(".implode(" , ",array_map('h',$p["target"]))." )","".h($p["on_delete"])."\n"," ".h($p["on_update"])."\n",' '.'Alter'.' ';}echo"
\n";}echo'
'.'Add foreign key'." \n";}}if(support(is_view($S)?"view_trigger":"trigger")){echo"
".'Triggers'." \n";$Ag=triggers($a);if($Ag){echo"
\n";foreach($Ag
+as$z=>$X)echo"".h($X[0])." ".h($X[1])." ".h($z)." ".'Alter'." \n";echo"
\n";}echo'
'.'Add trigger'." \n";}}elseif(isset($_GET["schema"])){page_header('Database schema',"",array(),h(DB.($_GET["ns"]?".$_GET[ns]":"")));$Xf=array();$Yf=array();$ca=($_GET["schema"]?$_GET["schema"]:$_COOKIE["adminer_schema-".str_replace(".","_",DB)]);preg_match_all('~([^:]+):([-0-9.]+)x([-0-9.]+)(_|$)~',$ca,$ud,PREG_SET_ORDER);foreach($ud
+as$u=>$C){$Xf[$C[1]]=array($C[2],$C[3]);$Yf[]="\n\t'".js_escape($C[1])."': [ $C[2], $C[3] ]";}$sg=0;$xa=-1;$qf=array();$ff=array();$ld=array();foreach(table_status('',true)as$R=>$S){if(is_view($S))continue;$Ie=0;$qf[$R]["fields"]=array();foreach(fields($R)as$F=>$m){$Ie+=1.25;$m["pos"]=$Ie;$qf[$R]["fields"][$F]=$m;}$qf[$R]["pos"]=($Xf[$R]?$Xf[$R]:array($sg,0));foreach($b->foreignKeys($R)as$X){if(!$X["db"]){$jd=$xa;if($Xf[$R][1]||$Xf[$X["table"]][1])$jd=min(floatval($Xf[$R][1]),floatval($Xf[$X["table"]][1]))-1;else$xa-=.1;while($ld[(string)$jd])$jd-=.0001;$qf[$R]["references"][$X["table"]][(string)$jd]=array($X["source"],$X["target"]);$ff[$X["table"]][$R][(string)$jd]=$X["target"];$ld[(string)$jd]=true;}}$sg=max($sg,$qf[$R]["pos"][0]+2.5+$Ie);}echo'
-';foreach($ch
-as$D=>$Q){echo"
",'
'.h($D)." ",script("qsl('div').onmousedown = schemaMousedown;");foreach($Q["fields"]as$o){$X='
'.h($o["field"]).' ';echo"
".($o["primary"]?"
$X ":$X);}foreach((array)$Q["references"]as$ai=>$Ig){foreach($Ig
-as$se=>$Eg){$te=$se-$Th[$D][1];$t=0;foreach($Eg[0]as$yh)echo"\n
";}}foreach((array)$Hg[$D]as$ai=>$Ig){foreach($Ig
-as$se=>$e){$te=$se-$Th[$D][1];$t=0;foreach($e
-as$Zh)echo"\n
";}}echo"\n
\n";}foreach($ch
-as$D=>$Q){foreach((array)$Q["references"]as$ai=>$Ig){foreach($Ig
-as$se=>$Eg){$Te=$ri;$Je=-10;foreach($Eg[0]as$z=>$yh){$ig=$Q["pos"][0]+$Q["fields"][$yh]["pos"];$jg=$ch[$ai]["pos"][0]+$ch[$ai]["fields"][$Eg[1][$z]]["pos"];$Te=min($Te,$ig,$jg);$Je=max($Je,$ig,$jg);}echo"
\n";}}}echo'
-
',lang(140),'
-';}elseif(isset($_GET["dump"])){$a=$_GET["dump"];if($_POST&&!$n){$Hb="";foreach(array("output","format","db_style","routines","events","table_style","auto_increment","triggers","data_style")as$z)$Hb.="&$z=".urlencode($_POST[$z]);cookie("adminer_export",substr($Hb,1));$S=array_flip((array)$_POST["tables"])+array_flip((array)$_POST["data"]);$Oc=dump_headers((count($S)==1?key($S):DB),(DB==""||count($S)>1));$de=preg_match('~sql~',$_POST["format"]);if($de){echo"-- Adminer $ia ".$kc[DRIVER]." ".str_replace("\n"," ",$g->server_info)." dump\n\n";if($y=="sql"){echo"SET NAMES utf8;
+';foreach($qf
+as$F=>$R){echo"
",'
'.h($F)." ",script("qsl('div').onmousedown = schemaMousedown;");foreach($R["fields"]as$m){$X='
'.h($m["field"]).' ';echo"
".($m["primary"]?"
$X ":$X);}foreach((array)$R["references"]as$eg=>$gf){foreach($gf
+as$jd=>$cf){$kd=$jd-$Xf[$F][1];$u=0;foreach($cf[0]as$Ff)echo"\n
";}}foreach((array)$ff[$F]as$eg=>$gf){foreach($gf
+as$jd=>$e){$kd=$jd-$Xf[$F][1];$u=0;foreach($e
+as$dg)echo"\n
";}}echo"\n
\n";}foreach($qf
+as$F=>$R){foreach((array)$R["references"]as$eg=>$gf){foreach($gf
+as$jd=>$cf){$Gd=$sg;$yd=-10;foreach($cf[0]as$z=>$Ff){$Je=$R["pos"][0]+$R["fields"][$Ff]["pos"];$Ke=$qf[$eg]["pos"][0]+$qf[$eg]["fields"][$cf[1][$z]]["pos"];$Gd=min($Gd,$Je,$Ke);$yd=max($yd,$Je,$Ke);}echo"
\n";}}}echo'
+Permanent link
+';}elseif(isset($_GET["dump"])){$a=$_GET["dump"];if($_POST&&!$l){$bb="";foreach(array("output","format","db_style","routines","events","table_style","auto_increment","triggers","data_style")as$z)$bb.="&$z=".urlencode($_POST[$z]);cookie("adminer_export",substr($bb,1));$T=array_flip((array)$_POST["tables"])+array_flip((array)$_POST["data"]);$bc=dump_headers((count($T)==1?key($T):DB),(DB==""||count($T)>1));$Xc=preg_match('~sql~',$_POST["format"]);if($Xc){echo"-- Adminer $da ".$zb[DRIVER]." ".str_replace("\n"," ",$f->server_info)." dump\n\n";if($y=="sql"){echo"SET NAMES utf8;
SET time_zone = '+00:00';
SET foreign_key_checks = 0;
".($_POST["data_style"]?"SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
":"")."
-";$g->query("SET time_zone = '+00:00'");$g->query("SET sql_mode = ''");}}$Kh=$_POST["db_style"];$k=array(DB);if(DB==""){$k=$_POST["databases"];if(is_string($k))$k=explode("\n",rtrim(str_replace("\r","",$k),"\n"));}foreach((array)$k
-as$l){$b->dumpDatabase($l);if($g->select_db($l)){if($de&&preg_match('~CREATE~',$Kh)&&($i=$g->result("SHOW CREATE DATABASE ".idf_escape($l),1))){set_utf8mb4($i);if($Kh=="DROP+CREATE")echo"DROP DATABASE IF EXISTS ".idf_escape($l).";\n";echo"$i;\n";}if($de){if($Kh)echo
-use_sql($l).";\n\n";$Lf="";if($_POST["routines"]){foreach(array("FUNCTION","PROCEDURE")as$Wg){foreach(get_rows("SHOW $Wg STATUS WHERE Db = ".q($l),null,"-- ")as$J){$i=remove_definer($g->result("SHOW CREATE $Wg ".idf_escape($J["Name"]),2));set_utf8mb4($i);$Lf.=($Kh!='DROP+CREATE'?"DROP $Wg IF EXISTS ".idf_escape($J["Name"]).";;\n":"")."$i;;\n\n";}}}if($_POST["events"]){foreach(get_rows("SHOW EVENTS",null,"-- ")as$J){$i=remove_definer($g->result("SHOW CREATE EVENT ".idf_escape($J["Name"]),3));set_utf8mb4($i);$Lf.=($Kh!='DROP+CREATE'?"DROP EVENT IF EXISTS ".idf_escape($J["Name"]).";;\n":"")."$i;;\n\n";}}if($Lf)echo"DELIMITER ;;\n\n$Lf"."DELIMITER ;\n\n";}if($_POST["table_style"]||$_POST["data_style"]){$bj=array();foreach(table_status('',true)as$D=>$R){$Q=(DB==""||in_array($D,(array)$_POST["tables"]));$Rb=(DB==""||in_array($D,(array)$_POST["data"]));if($Q||$Rb){if($Oc=="tar"){$ni=new
-TmpFile;ob_start(array($ni,'write'),1e5);}$b->dumpTable($D,($Q?$_POST["table_style"]:""),(is_view($R)?2:0));if(is_view($R))$bj[]=$D;elseif($Rb){$p=fields($D);$b->dumpData($D,$_POST["data_style"],"SELECT *".convert_fields($p,$p)." FROM ".table($D));}if($de&&$_POST["triggers"]&&$Q&&($Bi=trigger_sql($D)))echo"\nDELIMITER ;;\n$Bi\nDELIMITER ;\n";if($Oc=="tar"){ob_end_flush();tar_file((DB!=""?"":"$l/")."$D.csv",$ni);}elseif($de)echo"\n";}}if(function_exists('foreign_keys_sql')){foreach(table_status('',true)as$D=>$R){$Q=(DB==""||in_array($D,(array)$_POST["tables"]));if($Q&&!is_view($R))echo
-foreign_keys_sql($D);}}foreach($bj
-as$aj)$b->dumpTable($aj,$_POST["table_style"],1);if($Oc=="tar")echo
-pack("x512");}}}if($de)echo"-- ".$g->result("SELECT NOW()")."\n";exit;}page_header(lang(73),$n,($_GET["export"]!=""?array("table"=>$_GET["export"]):array()),h(DB));echo'
+";$f->query("SET time_zone = '+00:00'");$f->query("SET sql_mode = ''");}}$Pf=$_POST["db_style"];$i=array(DB);if(DB==""){$i=$_POST["databases"];if(is_string($i))$i=explode("\n",rtrim(str_replace("\r","",$i),"\n"));}foreach((array)$i
+as$j){$b->dumpDatabase($j);if($f->select_db($j)){if($Xc&&preg_match('~CREATE~',$Pf)&&($h=$f->result("SHOW CREATE DATABASE ".idf_escape($j),1))){set_utf8mb4($h);if($Pf=="DROP+CREATE")echo"DROP DATABASE IF EXISTS ".idf_escape($j).";\n";echo"$h;\n";}if($Xc){if($Pf)echo
+use_sql($j).";\n\n";$pe="";if($_POST["routines"]){foreach(array("FUNCTION","PROCEDURE")as$nf){foreach(get_rows("SHOW $nf STATUS WHERE Db = ".q($j),null,"-- ")as$L){$h=remove_definer($f->result("SHOW CREATE $nf ".idf_escape($L["Name"]),2));set_utf8mb4($h);$pe.=($Pf!='DROP+CREATE'?"DROP $nf IF EXISTS ".idf_escape($L["Name"]).";;\n":"")."$h;;\n\n";}}}if($_POST["events"]){foreach(get_rows("SHOW EVENTS",null,"-- ")as$L){$h=remove_definer($f->result("SHOW CREATE EVENT ".idf_escape($L["Name"]),3));set_utf8mb4($h);$pe.=($Pf!='DROP+CREATE'?"DROP EVENT IF EXISTS ".idf_escape($L["Name"]).";;\n":"")."$h;;\n\n";}}if($pe)echo"DELIMITER ;;\n\n$pe"."DELIMITER ;\n\n";}if($_POST["table_style"]||$_POST["data_style"]){$Zg=array();foreach(table_status('',true)as$F=>$S){$R=(DB==""||in_array($F,(array)$_POST["tables"]));$hb=(DB==""||in_array($F,(array)$_POST["data"]));if($R||$hb){if($bc=="tar"){$qg=new
+TmpFile;ob_start(array($qg,'write'),1e5);}$b->dumpTable($F,($R?$_POST["table_style"]:""),(is_view($S)?2:0));if(is_view($S))$Zg[]=$F;elseif($hb){$n=fields($F);$b->dumpData($F,$_POST["data_style"],"SELECT *".convert_fields($n,$n)." FROM ".table($F));}if($Xc&&$_POST["triggers"]&&$R&&($Ag=trigger_sql($F)))echo"\nDELIMITER ;;\n$Ag\nDELIMITER ;\n";if($bc=="tar"){ob_end_flush();tar_file((DB!=""?"":"$j/")."$F.csv",$qg);}elseif($Xc)echo"\n";}}if(function_exists('foreign_keys_sql')){foreach(table_status('',true)as$F=>$S){$R=(DB==""||in_array($F,(array)$_POST["tables"]));if($R&&!is_view($S))echo
+foreign_keys_sql($F);}}foreach($Zg
+as$Yg)$b->dumpTable($Yg,$_POST["table_style"],1);if($bc=="tar")echo
+pack("x512");}}}if($Xc)echo"-- ".$f->result("SELECT NOW()")."\n";exit;}page_header('Export',$l,($_GET["export"]!=""?array("table"=>$_GET["export"]):array()),h(DB));echo'
-';$Vb=array('','USE','DROP+CREATE','CREATE');$Vh=array('','DROP+CREATE','CREATE');$Sb=array('','TRUNCATE+INSERT','INSERT');if($y=="sql")$Sb[]='INSERT+UPDATE';parse_str($_COOKIE["adminer_export"],$J);if(!$J)$J=array("output"=>"text","format"=>"sql","db_style"=>(DB!=""?"":"CREATE"),"table_style"=>"DROP+CREATE","data_style"=>"INSERT");if(!isset($J["events"])){$J["routines"]=$J["events"]=($_GET["dump"]=="");$J["triggers"]=$J["table_style"];}echo"".lang(141)." ".html_select("output",$b->dumpOutput(),$J["output"],0)."\n";echo" ".lang(142)." ".html_select("format",$b->dumpFormat(),$J["format"],0)."\n";echo($y=="sqlite"?"":" ".lang(37)." ".html_select('db_style',$Vb,$J["db_style"]).(support("routine")?checkbox("routines",1,$J["routines"],lang(143)):"").(support("event")?checkbox("events",1,$J["events"],lang(144)):""))," ".lang(123)." ".html_select('table_style',$Vh,$J["table_style"]).checkbox("auto_increment",1,$J["auto_increment"],lang(51)).(support("trigger")?checkbox("triggers",1,$J["triggers"],lang(138)):"")," ".lang(145)." ".html_select('data_style',$Sb,$J["data_style"]),'
-
-
+';$lb=array('','USE','DROP+CREATE','CREATE');$Zf=array('','DROP+CREATE','CREATE');$ib=array('','TRUNCATE+INSERT','INSERT');if($y=="sql")$ib[]='INSERT+UPDATE';parse_str($_COOKIE["adminer_export"],$L);if(!$L)$L=array("output"=>"text","format"=>"sql","db_style"=>(DB!=""?"":"CREATE"),"table_style"=>"DROP+CREATE","data_style"=>"INSERT");if(!isset($L["events"])){$L["routines"]=$L["events"]=($_GET["dump"]=="");$L["triggers"]=$L["table_style"];}echo"
".'Output'." ".html_select("output",$b->dumpOutput(),$L["output"],0)."\n";echo" ".'Format'." ".html_select("format",$b->dumpFormat(),$L["format"],0)."\n";echo($y=="sqlite"?"":" ".'Database'." ".html_select('db_style',$lb,$L["db_style"]).(support("routine")?checkbox("routines",1,$L["routines"],'Routines'):"").(support("event")?checkbox("events",1,$L["events"],'Events'):""))," ".'Tables'." ".html_select('table_style',$Zf,$L["table_style"]).checkbox("auto_increment",1,$L["auto_increment"],'Auto Increment').(support("trigger")?checkbox("triggers",1,$L["triggers"],'Triggers'):"")," ".'Data'." ".html_select('data_style',$ib,$L["data_style"]),'
+
+
-',script("qsl('table').onclick = dumpClick;");$mg=array();if(DB!=""){$db=($a!=""?"":" checked");echo""," ".lang(123)." ".script("qs('#check-tables').onclick = partial(formCheck, /^tables\\[/);",""),"".lang(145)." ".script("qs('#check-data').onclick = partial(formCheck, /^data\\[/);","")," \n";$bj="";$Wh=tables_list();foreach($Wh
-as$D=>$T){$lg=preg_replace('~_.*~','',$D);$db=($a==""||$a==(substr($a,-1)=="%"?"$lg%":$D));$pg="".checkbox("tables[]",$D,$db,$D,"","block");if($T!==null&&!preg_match('~table~i',$T))$bj.="$pg\n";else
-echo"$pg ".checkbox("data[]",$D,$db)." \n";$mg[$lg]++;}echo$bj;if($Wh)echo
-script("ajaxSetHtml('".js_escape(ME)."script=db');");}else{echo""," ".lang(37)." ",script("qs('#check-databases').onclick = partial(formCheck, /^databases\\[/);","")," \n";$k=$b->databases();if($k){foreach($k
-as$l){if(!information_schema($l)){$lg=preg_replace('~_.*~','',$l);echo"".checkbox("databases[]",$l,$a==""||$a=="$lg%",$l,"","block")."\n";$mg[$lg]++;}}}else
+',script("qsl('table').onclick = dumpClick;");$Ne=array();if(DB!=""){$Fa=($a!=""?"":" checked");echo""," ".'Tables'." ".script("qs('#check-tables').onclick = partial(formCheck, /^tables\\[/);",""),"".'Data'." ".script("qs('#check-data').onclick = partial(formCheck, /^data\\[/);","")," \n";$Zg="";$ag=tables_list();foreach($ag
+as$F=>$V){$Me=preg_replace('~_.*~','',$F);$Fa=($a==""||$a==(substr($a,-1)=="%"?"$Me%":$F));$Qe=" ".checkbox("tables[]",$F,$Fa,$F,"","block");if($V!==null&&!preg_match('~table~i',$V))$Zg.="$Qe\n";else
+echo"$Qe ".checkbox("data[]",$F,$Fa)." \n";$Ne[$Me]++;}echo$Zg;if($ag)echo
+script("ajaxSetHtml('".js_escape(ME)."script=db');");}else{echo""," ".'Database'." ",script("qs('#check-databases').onclick = partial(formCheck, /^databases\\[/);","")," \n";$i=$b->databases();if($i){foreach($i
+as$j){if(!information_schema($j)){$Me=preg_replace('~_.*~','',$j);echo"".checkbox("databases[]",$j,$a==""||$a=="$Me%",$j,"","block")."\n";$Ne[$Me]++;}}}else
echo" ";}echo'
-';$bd=true;foreach($mg
-as$z=>$X){if($z!=""&&$X>1){echo($bd?"":" ")."".h($z)." ";$bd=false;}}}elseif(isset($_GET["privileges"])){page_header(lang(71));echo'
'.lang(146)." ";$H=$g->query("SELECT User, Host FROM mysql.".(DB==""?"user":"db WHERE ".q(DB)." LIKE Db")." ORDER BY Host, User");$qd=$H;if(!$H)$H=$g->query("SELECT SUBSTRING_INDEX(CURRENT_USER, '@', 1) AS User, SUBSTRING_INDEX(CURRENT_USER, '@', -1) AS Host");echo"
\n";hidden_fields_get();echo" \n",($qd?"":" \n"),"
\n"," \n";}elseif(isset($_GET["sql"])){if(!$n&&$_POST["export"]){dump_headers("sql");$b->dumpTable("","");$b->dumpData("","table",$_POST["query"]);exit;}restart_session();$Dd=&get_session("queries");$Cd=&$Dd[DB];if(!$n&&$_POST["clear"]){$Cd=array();redirect(remove_from_uri("history"));}page_header((isset($_GET["import"])?lang(72):lang(64)),$n);if(!$n&&$_POST){$nd=false;if(!isset($_GET["import"]))$G=$_POST["query"];elseif($_POST["webfile"]){$Bh=$b->importServerPath();$nd=@fopen((file_exists($Bh)?$Bh:"compress.zlib://$Bh.gz"),"rb");$G=($nd?fread($nd,1e6):false);}else$G=get_file("sql_file",true);if(is_string($G)){if(function_exists('memory_get_usage'))@ini_set("memory_limit",max(ini_bytes("memory_limit"),2*strlen($G)+memory_get_usage()+8e6));if($G!=""&&strlen($G)<1e6){$xg=$G.(preg_match("~;[ \t\r\n]*\$~",$G)?"":";");if(!$Cd||reset(end($Cd))!=$xg){restart_session();$Cd[]=array($xg,time());set_session("queries",$Dd);stop_session();}}$zh="(?:\\s|/\\*[\s\S]*?\\*/|(?:#|-- )[^\n]*\n?|--\r?\n)";$cc=";";$kf=0;$zc=true;$h=connect();if(is_object($h)&&DB!=""){$h->select_db(DB);if($_GET["ns"]!="")set_schema($_GET["ns"],$h);}$sb=0;$Dc=array();$Sf='[\'"'.($y=="sql"?'`#':($y=="sqlite"?'`[':($y=="mssql"?'[':''))).']|/\*|-- |$'.($y=="pgsql"?'|\$[^$]*\$':'');$si=microtime(true);parse_str($_COOKIE["adminer_export"],$ya);$qc=$b->dumpFormat();unset($qc["sql"]);while($G!=""){if(!$kf&&preg_match("~^$zh*+DELIMITER\\s+(\\S+)~i",$G,$C)){$cc=$C[1];$G=substr($G,strlen($C[0]));}else{preg_match('('.preg_quote($cc)."\\s*|$Sf)",$G,$C,PREG_OFFSET_CAPTURE,$kf);list($ld,$hg)=$C[0];if(!$ld&&$nd&&!feof($nd))$G.=fread($nd,1e5);else{if(!$ld&&rtrim($G)=="")break;$kf=$hg+strlen($ld);if($ld&&rtrim($ld)!=$cc){while(preg_match('('.($ld=='/*'?'\*/':($ld=='['?']':(preg_match('~^-- |^#~',$ld)?"\n":preg_quote($ld)."|\\\\."))).'|$)s',$G,$C,PREG_OFFSET_CAPTURE,$kf)){$ah=$C[0][0];if(!$ah&&$nd&&!feof($nd))$G.=fread($nd,1e5);else{$kf=$C[0][1]+strlen($ah);if($ah[0]!="\\")break;}}}else{$zc=false;$xg=substr($G,0,$hg);$sb++;$pg="".$b->sqlCommandQuery($xg)." \n";if($y=="sqlite"&&preg_match("~^$zh*+ATTACH\\b~i",$xg,$C)){echo$pg,"".lang(147)."\n";$Dc[]=" $sb ";if($_POST["error_stops"])break;}else{if(!$_POST["only_errors"]){echo$pg;ob_flush();flush();}$Fh=microtime(true);if($g->multi_query($xg)&&is_object($h)&&preg_match("~^$zh*+USE\\b~i",$xg))$h->query($xg);do{$H=$g->store_result();if($g->error){echo($_POST["only_errors"]?$pg:""),"
".lang(148).($g->errno?" ($g->errno)":"").": ".error()."\n";$Dc[]=" $sb ";if($_POST["error_stops"])break
-2;}else{$gi=" (".format_time($Fh).") ".(strlen($xg)<1000?" ".lang(10)." ":"");$_a=$g->affected_rows;$ej=($_POST["only_errors"]?"":$m->warnings());$fj="warnings-$sb";if($ej)$gi.=", ".lang(46)." ".script("qsl('a').onclick = partial(toggle, '$fj');","");$Lc=null;$Mc="explain-$sb";if(is_object($H)){$_=$_POST["limit"];$Ef=select($H,$h,array(),$_);if(!$_POST["only_errors"]){echo"
\n";$gf=$H->num_rows;echo"".($gf?($_&&$gf>$_?lang(149,$_):"").lang(150,$gf):""),$gi;if($h&&preg_match("~^($zh|\\()*+SELECT\\b~i",$xg)&&($Lc=explain($h,$xg)))echo", Explain ".script("qsl('a').onclick = partial(toggle, '$Mc');","");$u="export-$sb";echo", ".lang(73)." ".script("qsl('a').onclick = partial(toggle, '$u');","").": ".html_select("output",$b->dumpOutput(),$ya["output"])." ".html_select("format",$qc,$ya["format"])." "." \n"."
\n";}}else{if(preg_match("~^$zh*+(CREATE|DROP|ALTER)$zh++(DATABASE|SCHEMA)\\b~i",$xg)){restart_session();set_session("dbs",null);stop_session();}if(!$_POST["only_errors"])echo"".lang(151,$_a)."$gi\n";}echo($ej?"
\n$ej
\n":"");if($Lc){echo"\n";select($Lc,$h,$Ef);echo"
\n";}}$Fh=microtime(true);}while($g->next_result());}$G=substr($G,$kf);$kf=0;}}}}if($zc)echo"".lang(152)."\n";elseif($_POST["only_errors"]){echo"
".lang(153,$sb-count($Dc))," (".format_time($si).") \n";}elseif($Dc&&$sb>1)echo"
".lang(148).": ".implode("",$Dc)."\n";}else
-echo"
".upload_error($G)."\n";}echo'
+';$lc=true;foreach($Ne
+as$z=>$X){if($z!=""&&$X>1){echo($lc?"
":" ")."".h($z)." ";$lc=false;}}}elseif(isset($_GET["sql"])){if(!$l&&$_POST["export"]){dump_headers("sql");$b->dumpTable("","");$b->dumpData("","table",$_POST["query"]);exit;}restart_session();$Gc=&get_session("queries");$Fc=&$Gc[DB];if(!$l&&$_POST["clear"]){$Fc=array();redirect(remove_from_uri("history"));}page_header((isset($_GET["import"])?'Import':'SQL command'),$l);if(!$l&&$_POST){$r=false;if(!isset($_GET["import"]))$I=$_POST["query"];elseif($_POST["webfile"]){$If=$b->importServerPath();$r=@fopen((file_exists($If)?$If:"compress.zlib://$If.gz"),"rb");$I=($r?fread($r,1e6):false);}else$I=get_file("sql_file",true);if(is_string($I)){if(function_exists('memory_get_usage'))@ini_set("memory_limit",max(ini_bytes("memory_limit"),2*strlen($I)+memory_get_usage()+8e6));if($I!=""&&strlen($I)<1e6){$H=$I.(preg_match("~;[ \t\r\n]*\$~",$I)?"":";");if(!$Fc||reset(end($Fc))!=$H){restart_session();$Fc[]=array($H,time());set_session("queries",$Gc);stop_session();}}$Gf="(?:\\s|/\\*[\s\S]*?\\*/|(?:#|-- )[^\n]*\n?|--\r?\n)";$rb=";";$Sd=0;$Nb=true;$g=connect();if(is_object($g)&&DB!=""){$g->select_db(DB);if($_GET["ns"]!="")set_schema($_GET["ns"],$g);}$Sa=0;$Sb=array();$ve='[\'"'.($y=="sql"?'`#':($y=="sqlite"?'`[':($y=="mssql"?'[':''))).']|/\*|-- |$'.($y=="pgsql"?'|\$[^$]*\$':'');$tg=microtime(true);parse_str($_COOKIE["adminer_export"],$ia);$Eb=$b->dumpFormat();unset($Eb["sql"]);while($I!=""){if(!$Sd&&preg_match("~^$Gf*+DELIMITER\\s+(\\S+)~i",$I,$C)){$rb=$C[1];$I=substr($I,strlen($C[0]));}else{preg_match('('.preg_quote($rb)."\\s*|$ve)",$I,$C,PREG_OFFSET_CAPTURE,$Sd);list($rc,$Ie)=$C[0];if(!$rc&&$r&&!feof($r))$I.=fread($r,1e5);else{if(!$rc&&rtrim($I)=="")break;$Sd=$Ie+strlen($rc);if($rc&&rtrim($rc)!=$rb){while(preg_match('('.($rc=='/*'?'\*/':($rc=='['?']':(preg_match('~^-- |^#~',$rc)?"\n":preg_quote($rc)."|\\\\."))).'|$)s',$I,$C,PREG_OFFSET_CAPTURE,$Sd)){$pf=$C[0][0];if(!$pf&&$r&&!feof($r))$I.=fread($r,1e5);else{$Sd=$C[0][1]+strlen($pf);if($pf[0]!="\\")break;}}}else{$Nb=false;$H=substr($I,0,$Ie);$Sa++;$Qe="
".$b->sqlCommandQuery($H)." \n";if($y=="sqlite"&&preg_match("~^$Gf*+ATTACH\\b~i",$H,$C)){echo$Qe,"".'ATTACH queries are not supported.'."\n";$Sb[]=" $Sa ";if($_POST["error_stops"])break;}else{if(!$_POST["only_errors"]){echo$Qe;ob_flush();flush();}$Lf=microtime(true);if($f->multi_query($H)&&is_object($g)&&preg_match("~^$Gf*+USE\\b~i",$H))$g->query($H);do{$J=$f->store_result();if($f->error){echo($_POST["only_errors"]?$Qe:""),"
".'Error in query'.($f->errno?" ($f->errno)":"").": ".error()."\n";$Sb[]=" $Sa ";if($_POST["error_stops"])break
+2;}else{$jg=" (".format_time($Lf).") ".(strlen($H)<1000?" ".'Edit'." ":"");$ka=$f->affected_rows;$ch=($_POST["only_errors"]?"":$k->warnings());$dh="warnings-$Sa";if($ch)$jg.=", ".'Warnings'." ".script("qsl('a').onclick = partial(toggle, '$dh');","");$Zb=null;$ac="explain-$Sa";if(is_object($J)){$_=$_POST["limit"];$ie=select($J,$g,array(),$_);if(!$_POST["only_errors"]){echo"
\n";$Pd=$J->num_rows;echo"".($Pd?($_&&$Pd>$_?sprintf('%d / ',$_):"").lang(array('%d row','%d rows'),$Pd):""),$jg;if($g&&preg_match("~^($Gf|\\()*+SELECT\\b~i",$H)&&($Zb=explain($g,$H)))echo", Explain ".script("qsl('a').onclick = partial(toggle, '$ac');","");$v="export-$Sa";echo", ".'Export'." ".script("qsl('a').onclick = partial(toggle, '$v');","").": ".html_select("output",$b->dumpOutput(),$ia["output"])." ".html_select("format",$Eb,$ia["format"])." "." \n"."
\n";}}else{if(preg_match("~^$Gf*+(CREATE|DROP|ALTER)$Gf++(DATABASE|SCHEMA)\\b~i",$H)){restart_session();set_session("dbs",null);stop_session();}if(!$_POST["only_errors"])echo"".lang(array('Query executed OK, %d row affected.','Query executed OK, %d rows affected.'),$ka)."$jg\n";}echo($ch?"
\n$ch
\n":"");if($Zb){echo"\n";select($Zb,$g,$ie);echo"
\n";}}$Lf=microtime(true);}while($f->next_result());}$I=substr($I,$Sd);$Sd=0;}}}}if($Nb)echo"".'No commands to execute.'."\n";elseif($_POST["only_errors"]){echo"
".lang(array('%d query executed OK.','%d queries executed OK.'),$Sa-count($Sb))," (".format_time($tg).") \n";}elseif($Sb&&$Sa>1)echo"
".'Error in query'.": ".implode("",$Sb)."\n";}else
+echo"
".upload_error($I)."\n";}echo'
-';$Jc=" ";if(!isset($_GET["import"])){$xg=$_GET["sql"];if($_POST)$xg=$_POST["query"];elseif($_GET["history"]=="all")$xg=$Cd;elseif($_GET["history"]!="")$xg=$Cd[$_GET["history"]][0];echo"";textarea("query",$xg,20);echo
-script(($_POST?"":"qs('textarea').focus();\n")."qs('#form').onsubmit = partial(sqlSubmit, qs('#form'), '".js_escape(remove_from_uri("sql|limit|error_stops|only_errors|history"))."');"),"
$Jc\n",lang(155).": \n";}else{echo"
".lang(156)." ";$wd=(extension_loaded("zlib")?"[.gz]":"");echo(ini_bool("file_uploads")?"SQL$wd (< ".ini_get("upload_max_filesize")."B): \n$Jc":lang(157)),"
\n";$Kd=$b->importServerPath();if($Kd){echo"".lang(158)." ",lang(159,"".h($Kd)."$wd"),' ',"
\n";}echo"";}echo
-checkbox("error_stops",1,($_POST?$_POST["error_stops"]:isset($_GET["import"])||$_GET["error_stops"]),lang(161))."\n",checkbox("only_errors",1,($_POST?$_POST["only_errors"]:isset($_GET["import"])||$_GET["only_errors"]),lang(162))."\n"," \n";if(!isset($_GET["import"])&&$Cd){print_fieldset("history",lang(163),$_GET["history"]!="");for($X=end($Cd);$X;$X=prev($Cd)){$z=key($Cd);list($xg,$gi,$uc)=$X;echo''.lang(10)." "." ".@date("H:i:s",$gi)." "." ".shorten_utf8(ltrim(str_replace("\n"," ",str_replace("\r","",preg_replace('~^(#|-- ).*~m','',$xg)))),80,"").($uc?" ($uc) ":"")." \n";}echo" \n","".lang(165)." \n","\n";}echo'
-';}elseif(isset($_GET["edit"])){$a=$_GET["edit"];$p=fields($a);$Z=(isset($_GET["select"])?($_POST["check"]&&count($_POST["check"])==1?where_check($_POST["check"][0],$p):""):where($_GET,$p));$Li=(isset($_GET["select"])?$_POST["edit"]:$Z);foreach($p
-as$D=>$o){if(!isset($o["privileges"][$Li?"update":"insert"])||$b->fieldName($o)==""||$o["generated"])unset($p[$D]);}if($_POST&&!$n&&!isset($_GET["select"])){$B=$_POST["referer"];if($_POST["insert"])$B=($Li?null:$_SERVER["REQUEST_URI"]);elseif(!preg_match('~^.+&select=.+$~',$B))$B=ME."select=".urlencode($a);$x=indexes($a);$Gi=unique_array($_GET["where"],$x);$_g="\nWHERE $Z";if(isset($_POST["delete"]))queries_redirect($B,lang(166),$m->delete($a,$_g,!$Gi));else{$N=array();foreach($p
-as$D=>$o){$X=process_input($o);if($X!==false&&$X!==null)$N[idf_escape($D)]=$X;}if($Li){if(!$N)redirect($B);queries_redirect($B,lang(167),$m->update($a,$N,$_g,!$Gi));if(is_ajax()){page_headers();page_messages($n);exit;}}else{$H=$m->insert($a,$N);$re=($H?last_id():0);queries_redirect($B,lang(168,($re?" $re":"")),$H);}}}$J=null;if($_POST["save"])$J=(array)$_POST["fields"];elseif($Z){$L=array();foreach($p
-as$D=>$o){if(isset($o["privileges"]["select"])){$Ga=convert_field($o);if($_POST["clone"]&&$o["auto_increment"])$Ga="''";if($y=="sql"&&preg_match("~enum|set~",$o["type"]))$Ga="1*".idf_escape($D);$L[]=($Ga?"$Ga AS ":"").idf_escape($D);}}$J=array();if(!support("table"))$L=array("*");if($L){$H=$m->select($a,$L,array($Z),$L,array(),(isset($_GET["select"])?2:1));if(!$H)$n=error();else{$J=$H->fetch_assoc();if(!$J)$J=false;}if(isset($_GET["select"])&&(!$J||$H->fetch_assoc()))$J=null;}}if(!support("table")&&!$p){if(!$Z){$H=$m->select($a,array("*"),$Z,array("*"));$J=($H?$H->fetch_assoc():false);if(!$J)$J=array($m->primary=>"");}if($J){foreach($J
-as$z=>$X){if(!$Z)$J[$z]=null;$p[$z]=array("field"=>$z,"null"=>($z!=$m->primary),"auto_increment"=>($z==$m->primary));}}}edit_form($a,$p,$J,$Li);}elseif(isset($_GET["create"])){$a=$_GET["create"];$Uf=array();foreach(array('HASH','LINEAR HASH','KEY','LINEAR KEY','RANGE','LIST')as$z)$Uf[$z]=$z;$Gg=referencable_primary($a);$jd=array();foreach($Gg
-as$Rh=>$o)$jd[str_replace("`","``",$Rh)."`".str_replace("`","``",$o["field"])]=$Rh;$Hf=array();$R=array();if($a!=""){$Hf=fields($a);$R=table_status($a);if(!$R)$n=lang(9);}$J=$_POST;$J["fields"]=(array)$J["fields"];if($J["auto_increment_col"])$J["fields"][$J["auto_increment_col"]]["auto_increment"]=true;if($_POST)set_adminer_settings(array("comments"=>$_POST["comments"],"defaults"=>$_POST["defaults"]));if($_POST&&!process_fields($J["fields"])&&!$n){if($_POST["drop"])queries_redirect(substr(ME,0,-1),lang(169),drop_tables(array($a)));else{$p=array();$Da=array();$Pi=false;$hd=array();$Gf=reset($Hf);$Ba=" FIRST";foreach($J["fields"]as$z=>$o){$r=$jd[$o["type"]];$Ci=($r!==null?$Gg[$r]:$o);if($o["field"]!=""){if(!$o["has_default"])$o["default"]=null;if($z==$J["auto_increment_col"])$o["auto_increment"]=true;$ug=process_field($o,$Ci);$Da[]=array($o["orig"],$ug,$Ba);if(!$Gf||$ug!=process_field($Gf,$Gf)){$p[]=array($o["orig"],$ug,$Ba);if($o["orig"]!=""||$Ba)$Pi=true;}if($r!==null)$hd[idf_escape($o["field"])]=($a!=""&&$y!="sqlite"?"ADD":" ").format_foreign_key(array('table'=>$jd[$o["type"]],'source'=>array($o["field"]),'target'=>array($Ci["field"]),'on_delete'=>$o["on_delete"],));$Ba=" AFTER ".idf_escape($o["field"]);}elseif($o["orig"]!=""){$Pi=true;$p[]=array($o["orig"]);}if($o["orig"]!=""){$Gf=next($Hf);if(!$Gf)$Ba="";}}$Wf="";if($Uf[$J["partition_by"]]){$Xf=array();if($J["partition_by"]=='RANGE'||$J["partition_by"]=='LIST'){foreach(array_filter($J["partition_names"])as$z=>$X){$Y=$J["partition_values"][$z];$Xf[]="\n PARTITION ".idf_escape($X)." VALUES ".($J["partition_by"]=='RANGE'?"LESS THAN":"IN").($Y!=""?" ($Y)":" MAXVALUE");}}$Wf.="\nPARTITION BY $J[partition_by]($J[partition])".($Xf?" (".implode(",",$Xf)."\n)":($J["partitions"]?" PARTITIONS ".(+$J["partitions"]):""));}elseif(support("partitioning")&&preg_match("~partitioned~",$R["Create_options"]))$Wf.="\nREMOVE PARTITIONING";$Ne=lang(170);if($a==""){cookie("adminer_engine",$J["Engine"]);$Ne=lang(171);}$D=trim($J["name"]);queries_redirect(ME.(support("table")?"table=":"select=").urlencode($D),$Ne,alter_table($a,$D,($y=="sqlite"&&($Pi||$hd)?$Da:$p),$hd,($J["Comment"]!=$R["Comment"]?$J["Comment"]:null),($J["Engine"]&&$J["Engine"]!=$R["Engine"]?$J["Engine"]:""),($J["Collation"]&&$J["Collation"]!=$R["Collation"]?$J["Collation"]:""),($J["Auto_increment"]!=""?number($J["Auto_increment"]):""),$Wf));}}page_header(($a!=""?lang(44):lang(74)),$n,array("table"=>$a),h($a));if(!$_POST){$J=array("Engine"=>$_COOKIE["adminer_engine"],"fields"=>array(array("field"=>"","type"=>(isset($U["int"])?"int":(isset($U["integer"])?"integer":"")),"on_update"=>"")),"partition_names"=>array(""),);if($a!=""){$J=$R;$J["name"]=$a;$J["fields"]=array();if(!$_GET["auto_increment"])$J["Auto_increment"]="";foreach($Hf
-as$o){$o["has_default"]=isset($o["default"]);$J["fields"][]=$o;}if(support("partitioning")){$od="FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA = ".q(DB)." AND TABLE_NAME = ".q($a);$H=$g->query("SELECT PARTITION_METHOD, PARTITION_ORDINAL_POSITION, PARTITION_EXPRESSION $od ORDER BY PARTITION_ORDINAL_POSITION DESC LIMIT 1");list($J["partition_by"],$J["partitions"],$J["partition"])=$H->fetch_row();$Xf=get_key_vals("SELECT PARTITION_NAME, PARTITION_DESCRIPTION $od AND PARTITION_NAME != '' ORDER BY PARTITION_ORDINAL_POSITION");$Xf[""]="";$J["partition_names"]=array_keys($Xf);$J["partition_values"]=array_values($Xf);}}}$nb=collations();$Ac=engines();foreach($Ac
-as$_c){if(!strcasecmp($_c,$J["Engine"])){$J["Engine"]=$_c;break;}}echo'
+';$Xb=" ";if(!isset($_GET["import"])){$H=$_GET["sql"];if($_POST)$H=$_POST["query"];elseif($_GET["history"]=="all")$H=$Fc;elseif($_GET["history"]!="")$H=$Fc[$_GET["history"]][0];echo"";textarea("query",$H,20);echo
+script(($_POST?"":"qs('textarea').focus();\n")."qs('#form').onsubmit = partial(sqlSubmit, qs('#form'), '".js_escape(remove_from_uri("sql|limit|error_stops|only_errors|history"))."');"),"
$Xb\n",'Limit rows'.": \n";}else{echo"
".'File upload'." ";$zc=(extension_loaded("zlib")?"[.gz]":"");echo(ini_bool("file_uploads")?"SQL$zc (< ".ini_get("upload_max_filesize")."B): \n$Xb":'File uploads are disabled.'),"
\n";$Mc=$b->importServerPath();if($Mc){echo"".'From server'." ",sprintf('Webserver file %s',"".h($Mc)."$zc"),' ',"
\n";}echo"";}echo
+checkbox("error_stops",1,($_POST?$_POST["error_stops"]:isset($_GET["import"])||$_GET["error_stops"]),'Stop on error')."\n",checkbox("only_errors",1,($_POST?$_POST["only_errors"]:isset($_GET["import"])||$_GET["only_errors"]),'Show only errors')."\n"," \n";if(!isset($_GET["import"])&&$Fc){print_fieldset("history",'History',$_GET["history"]!="");for($X=end($Fc);$X;$X=prev($Fc)){$z=key($Fc);list($H,$jg,$Ib)=$X;echo''.'Edit'." "." ".@date("H:i:s",$jg)." "." ".shorten_utf8(ltrim(str_replace("\n"," ",str_replace("\r","",preg_replace('~^(#|-- ).*~m','',$H)))),80,"").($Ib?" ($Ib) ":"")." \n";}echo" \n","".'Edit all'." \n","\n";}echo'
+';}elseif(isset($_GET["edit"])){$a=$_GET["edit"];$n=fields($a);$Z=(isset($_GET["select"])?($_POST["check"]&&count($_POST["check"])==1?where_check($_POST["check"][0],$n):""):where($_GET,$n));$Kg=(isset($_GET["select"])?$_POST["edit"]:$Z);foreach($n
+as$F=>$m){if(!isset($m["privileges"][$Kg?"update":"insert"])||$b->fieldName($m)==""||$m["generated"])unset($n[$F]);}if($_POST&&!$l&&!isset($_GET["select"])){$B=$_POST["referer"];if($_POST["insert"])$B=($Kg?null:$_SERVER["REQUEST_URI"]);elseif(!preg_match('~^.+&select=.+$~',$B))$B=ME."select=".urlencode($a);$x=indexes($a);$Fg=unique_array($_GET["where"],$x);$Ye="\nWHERE $Z";if(isset($_POST["delete"]))queries_redirect($B,'Item has been deleted.',$k->delete($a,$Ye,!$Fg));else{$P=array();foreach($n
+as$F=>$m){$X=process_input($m);if($X!==false&&$X!==null)$P[idf_escape($F)]=$X;}if($Kg){if(!$P)redirect($B);queries_redirect($B,'Item has been updated.',$k->update($a,$P,$Ye,!$Fg));if(is_ajax()){page_headers();page_messages($l);exit;}}else{$J=$k->insert($a,$P);$id=($J?last_id():0);queries_redirect($B,sprintf('Item%s has been inserted.',($id?" $id":"")),$J);}}}$L=null;if($_POST["save"])$L=(array)$_POST["fields"];elseif($Z){$N=array();foreach($n
+as$F=>$m){if(isset($m["privileges"]["select"])){$pa=convert_field($m);if($_POST["clone"]&&$m["auto_increment"])$pa="''";if($y=="sql"&&preg_match("~enum|set~",$m["type"]))$pa="1*".idf_escape($F);$N[]=($pa?"$pa AS ":"").idf_escape($F);}}$L=array();if(!support("table"))$N=array("*");if($N){$J=$k->select($a,$N,array($Z),$N,array(),(isset($_GET["select"])?2:1));if(!$J)$l=error();else{$L=$J->fetch_assoc();if(!$L)$L=false;}if(isset($_GET["select"])&&(!$L||$J->fetch_assoc()))$L=null;}}if(!support("table")&&!$n){if(!$Z){$J=$k->select($a,array("*"),$Z,array("*"));$L=($J?$J->fetch_assoc():false);if(!$L)$L=array($k->primary=>"");}if($L){foreach($L
+as$z=>$X){if(!$Z)$L[$z]=null;$n[$z]=array("field"=>$z,"null"=>($z!=$k->primary),"auto_increment"=>($z==$k->primary));}}}edit_form($a,$n,$L,$Kg);}elseif(isset($_GET["create"])){$a=$_GET["create"];$we=array();foreach(array('HASH','LINEAR HASH','KEY','LINEAR KEY','RANGE','LIST')as$z)$we[$z]=$z;$ef=referencable_primary($a);$q=array();foreach($ef
+as$Wf=>$m)$q[str_replace("`","``",$Wf)."`".str_replace("`","``",$m["field"])]=$Wf;$le=array();$S=array();if($a!=""){$le=fields($a);$S=table_status($a);if(!$S)$l='No tables.';}$L=$_POST;$L["fields"]=(array)$L["fields"];if($L["auto_increment_col"])$L["fields"][$L["auto_increment_col"]]["auto_increment"]=true;if($_POST)set_adminer_settings(array("comments"=>$_POST["comments"],"defaults"=>$_POST["defaults"]));if($_POST&&!process_fields($L["fields"])&&!$l){if($_POST["drop"])queries_redirect(substr(ME,0,-1),'Table has been dropped.',drop_tables(array($a)));else{$n=array();$na=array();$Og=false;$oc=array();$ke=reset($le);$ma=" FIRST";foreach($L["fields"]as$z=>$m){$p=$q[$m["type"]];$Bg=($p!==null?$ef[$p]:$m);if($m["field"]!=""){if(!$m["has_default"])$m["default"]=null;if($z==$L["auto_increment_col"])$m["auto_increment"]=true;$Ue=process_field($m,$Bg);$na[]=array($m["orig"],$Ue,$ma);if(!$ke||$Ue!=process_field($ke,$ke)){$n[]=array($m["orig"],$Ue,$ma);if($m["orig"]!=""||$ma)$Og=true;}if($p!==null)$oc[idf_escape($m["field"])]=($a!=""&&$y!="sqlite"?"ADD":" ").format_foreign_key(array('table'=>$q[$m["type"]],'source'=>array($m["field"]),'target'=>array($Bg["field"]),'on_delete'=>$m["on_delete"],));$ma=" AFTER ".idf_escape($m["field"]);}elseif($m["orig"]!=""){$Og=true;$n[]=array($m["orig"]);}if($m["orig"]!=""){$ke=next($le);if(!$ke)$ma="";}}$ye="";if($we[$L["partition_by"]]){$ze=array();if($L["partition_by"]=='RANGE'||$L["partition_by"]=='LIST'){foreach(array_filter($L["partition_names"])as$z=>$X){$Y=$L["partition_values"][$z];$ze[]="\n PARTITION ".idf_escape($X)." VALUES ".($L["partition_by"]=='RANGE'?"LESS THAN":"IN").($Y!=""?" ($Y)":" MAXVALUE");}}$ye.="\nPARTITION BY $L[partition_by]($L[partition])".($ze?" (".implode(",",$ze)."\n)":($L["partitions"]?" PARTITIONS ".(+$L["partitions"]):""));}elseif(support("partitioning")&&preg_match("~partitioned~",$S["Create_options"]))$ye.="\nREMOVE PARTITIONING";$D='Table has been altered.';if($a==""){cookie("adminer_engine",$L["Engine"]);$D='Table has been created.';}$F=trim($L["name"]);queries_redirect(ME.(support("table")?"table=":"select=").urlencode($F),$D,alter_table($a,$F,($y=="sqlite"&&($Og||$oc)?$na:$n),$oc,($L["Comment"]!=$S["Comment"]?$L["Comment"]:null),($L["Engine"]&&$L["Engine"]!=$S["Engine"]?$L["Engine"]:""),($L["Collation"]&&$L["Collation"]!=$S["Collation"]?$L["Collation"]:""),($L["Auto_increment"]!=""?number($L["Auto_increment"]):""),$ye));}}page_header(($a!=""?'Alter table':'Create table'),$l,array("table"=>$a),h($a));if(!$_POST){$L=array("Engine"=>$_COOKIE["adminer_engine"],"fields"=>array(array("field"=>"","type"=>(isset($Cg["int"])?"int":(isset($Cg["integer"])?"integer":"")),"on_update"=>"")),"partition_names"=>array(""),);if($a!=""){$L=$S;$L["name"]=$a;$L["fields"]=array();if(!$_GET["auto_increment"])$L["Auto_increment"]="";foreach($le
+as$m){$m["has_default"]=isset($m["default"]);$L["fields"][]=$m;}if(support("partitioning")){$tc="FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA = ".q(DB)." AND TABLE_NAME = ".q($a);$J=$f->query("SELECT PARTITION_METHOD, PARTITION_ORDINAL_POSITION, PARTITION_EXPRESSION $tc ORDER BY PARTITION_ORDINAL_POSITION DESC LIMIT 1");list($L["partition_by"],$L["partitions"],$L["partition"])=$J->fetch_row();$ze=get_key_vals("SELECT PARTITION_NAME, PARTITION_DESCRIPTION $tc AND PARTITION_NAME != '' ORDER BY PARTITION_ORDINAL_POSITION");$ze[""]="";$L["partition_names"]=array_keys($ze);$L["partition_values"]=array_values($ze);}}}$Pa=collations();$Pb=engines();foreach($Pb
+as$Ob){if(!strcasecmp($Ob,$L["Engine"])){$L["Engine"]=$Ob;break;}}echo'
-';if(support("columns")||$a==""){echo
-lang(172),':
+';if(support("columns")||$a==""){echo'Table name:
';if($a==""&&!$_POST)echo
-script("focus(qs('#form')['name']);");echo($Ac?"".optionlist(array(""=>"(".lang(173).")")+$Ac,$J["Engine"])." ".on_help("getTarget(event).value",1).script("qsl('select').onchange = helpClose;"):""),' ',($nb&&!preg_match("~sqlite|mssql~",$y)?html_select("Collation",array(""=>"(".lang(101).")")+$nb,$J["Collation"]):""),'
+script("focus(qs('#form')['name']);");echo($Pb?"".optionlist(array(""=>"(".'engine'.")")+$Pb,$L["Engine"])." ".on_help("getTarget(event).value",1).script("qsl('select').onchange = helpClose;"):""),' ',($Pa&&!preg_match("~sqlite|mssql~",$y)?html_select("Collation",array(""=>"(".'collation'.")")+$Pa,$L["Collation"]):""),'
';}echo'
';if(support("columns")){echo'
-',lang(51),':
-',checkbox("defaults",1,($_POST?$_POST["defaults"]:adminer_setting("defaults")),lang(174),"columnShow(this.checked, 5)","jsonly"),(support("comment")?checkbox("comments",1,($_POST?$_POST["comments"]:adminer_setting("comments")),lang(50),"editingCommentsClick(this, true);","jsonly").' ':''),'
-
+Auto Increment:
+',checkbox("defaults",1,($_POST?$_POST["defaults"]:adminer_setting("defaults")),'Default values',"columnShow(this.checked, 5)","jsonly"),(support("comment")?checkbox("comments",1,($_POST?$_POST["comments"]:adminer_setting("comments")),'Comment',"editingCommentsClick(this, true);","jsonly").' ':''),'
+
';}echo'
-';if($a!=""){echo' ',confirm(lang(175,$a));}if(support("partitioning")){$Vf=preg_match('~RANGE|LIST~',$J["partition_by"]);print_fieldset("partition",lang(176),$J["partition_by"]);echo'
-',"".optionlist(array(""=>"")+$Uf,$J["partition_by"])." ".on_help("getTarget(event).value.replace(/./, 'PARTITION BY \$&')",1).script("qsl('select').onchange = partitionByChange;"),'( )
-',lang(177),':
-
+';if($a!=""){echo' ',confirm(sprintf('Drop %s?',$a));}if(support("partitioning")){$xe=preg_match('~RANGE|LIST~',$L["partition_by"]);print_fieldset("partition",'Partition by',$L["partition_by"]);echo'
+',"".optionlist(array(""=>"")+$we,$L["partition_by"])." ".on_help("getTarget(event).value.replace(/./, 'PARTITION BY \$&')",1).script("qsl('select').onchange = partitionByChange;"),'( )
+Partitions:
+
-';}echo'
+';}echo'
-';}elseif(isset($_GET["indexes"])){$a=$_GET["indexes"];$Nd=array("PRIMARY","UNIQUE","INDEX");$R=table_status($a,true);if(preg_match('~MyISAM|M?aria'.(min_version(5.6,'10.0.5')?'|InnoDB':'').'~i',$R["Engine"]))$Nd[]="FULLTEXT";if(preg_match('~MyISAM|M?aria'.(min_version(5.7,'10.2.2')?'|InnoDB':'').'~i',$R["Engine"]))$Nd[]="SPATIAL";$x=indexes($a);$ng=array();if($y=="mongo"){$ng=$x["_id_"];unset($Nd[0]);unset($x["_id_"]);}$J=$_POST;if($_POST&&!$n&&!$_POST["add"]&&!$_POST["drop_col"]){$c=array();foreach($J["indexes"]as$w){$D=$w["name"];if(in_array($w["type"],$Nd)){$e=array();$xe=array();$ec=array();$N=array();ksort($w["columns"]);foreach($w["columns"]as$z=>$d){if($d!=""){$we=$w["lengths"][$z];$dc=$w["descs"][$z];$N[]=idf_escape($d).($we?"(".(+$we).")":"").($dc?" DESC":"");$e[]=$d;$xe[]=($we?$we:null);$ec[]=$dc;}}if($e){$Kc=$x[$D];if($Kc){ksort($Kc["columns"]);ksort($Kc["lengths"]);ksort($Kc["descs"]);if($w["type"]==$Kc["type"]&&array_values($Kc["columns"])===$e&&(!$Kc["lengths"]||array_values($Kc["lengths"])===$xe)&&array_values($Kc["descs"])===$ec){unset($x[$D]);continue;}}$c[]=array($w["type"],$D,$N);}}}foreach($x
-as$D=>$Kc)$c[]=array($Kc["type"],$D,"DROP");if(!$c)redirect(ME."table=".urlencode($a));queries_redirect(ME."table=".urlencode($a),lang(180),alter_indexes($a,$c));}page_header(lang(132),$n,array("table"=>$a),h($a));$p=array_keys(fields($a));if($_POST["add"]){foreach($J["indexes"]as$z=>$w){if($w["columns"][count($w["columns"])]!="")$J["indexes"][$z]["columns"][]="";}$w=end($J["indexes"]);if($w["type"]||array_filter($w["columns"],'strlen'))$J["indexes"][]=array("columns"=>array(1=>""));}if(!$J){foreach($x
-as$z=>$w){$x[$z]["name"]=$z;$x[$z]["columns"][]="";}$x[]=array("columns"=>array(1=>""));$J["indexes"]=$x;}echo'
+';}elseif(isset($_GET["indexes"])){$a=$_GET["indexes"];$Oc=array("PRIMARY","UNIQUE","INDEX");$S=table_status($a,true);if(preg_match('~MyISAM|M?aria'.(min_version(5.6,'10.0.5')?'|InnoDB':'').'~i',$S["Engine"]))$Oc[]="FULLTEXT";if(preg_match('~MyISAM|M?aria'.(min_version(5.7,'10.2.2')?'|InnoDB':'').'~i',$S["Engine"]))$Oc[]="SPATIAL";$x=indexes($a);$Oe=array();if($y=="mongo"){$Oe=$x["_id_"];unset($Oc[0]);unset($x["_id_"]);}$L=$_POST;if($_POST&&!$l&&!$_POST["add"]&&!$_POST["drop_col"]){$oa=array();foreach($L["indexes"]as$w){$F=$w["name"];if(in_array($w["type"],$Oc)){$e=array();$od=array();$tb=array();$P=array();ksort($w["columns"]);foreach($w["columns"]as$z=>$d){if($d!=""){$nd=$w["lengths"][$z];$sb=$w["descs"][$z];$P[]=idf_escape($d).($nd?"(".(+$nd).")":"").($sb?" DESC":"");$e[]=$d;$od[]=($nd?$nd:null);$tb[]=$sb;}}if($e){$Yb=$x[$F];if($Yb){ksort($Yb["columns"]);ksort($Yb["lengths"]);ksort($Yb["descs"]);if($w["type"]==$Yb["type"]&&array_values($Yb["columns"])===$e&&(!$Yb["lengths"]||array_values($Yb["lengths"])===$od)&&array_values($Yb["descs"])===$tb){unset($x[$F]);continue;}}$oa[]=array($w["type"],$F,$P);}}}foreach($x
+as$F=>$Yb)$oa[]=array($Yb["type"],$F,"DROP");if(!$oa)redirect(ME."table=".urlencode($a));queries_redirect(ME."table=".urlencode($a),'Indexes have been altered.',alter_indexes($a,$oa));}page_header('Indexes',$l,array("table"=>$a),h($a));$n=array_keys(fields($a));if($_POST["add"]){foreach($L["indexes"]as$z=>$w){if($w["columns"][count($w["columns"])]!="")$L["indexes"][$z]["columns"][]="";}$w=end($L["indexes"]);if($w["type"]||array_filter($w["columns"],'strlen'))$L["indexes"][]=array("columns"=>array(1=>""));}if(!$L){foreach($x
+as$z=>$w){$x[$z]["name"]=$z;$x[$z]["columns"][]="";}$x[]=array("columns"=>array(1=>""));$L["indexes"]=$x;}echo'
-',lang(181),' ',lang(182),'',lang(183),' '," ",'
+Index Type
+ Column (length)
+Name
+ '," ",'
-';if($ng){echo"PRIMARY ";foreach($ng["columns"]as$z=>$d){echo
-select_input(" disabled",$p,$d)," ".lang(59)." ";}echo" \n";}$ge=1;foreach($J["indexes"]as$w){if(!$_POST["drop_col"]||$ge!=key($_POST["drop_col"])){echo" ".html_select("indexes[$ge][type]",array(-1=>"")+$Nd,$w["type"],($ge==count($J["indexes"])?"indexesAddRow.call(this);":1),"label-type")," ";ksort($w["columns"]);$t=1;foreach($w["columns"]as$z=>$d){echo"".select_input(" name='indexes[$ge][columns][$t]' title='".lang(48)."'",($p?array_combine($p,$p):$p),$d,"partial(".($t==count($w["columns"])?"indexesAddColumn":"indexesChangeColumn").", '".js_escape($y=="sql"?"":$_GET["indexes"]."_")."')"),($y=="sql"||$y=="mssql"?" ":""),(support("descidx")?checkbox("indexes[$ge][descs][$t]",1,$w["descs"][$z],lang(59)):"")," ";$t++;}echo" \n"," ".script("qsl('input').onclick = partial(editingRemoveRow, 'indexes\$1[type]');");}$ge++;}echo'
+';if($Oe){echo"
PRIMARY ";foreach($Oe["columns"]as$z=>$d){echo
+select_input(" disabled",$n,$d)," ".'descending'." ";}echo" \n";}$Zc=1;foreach($L["indexes"]as$w){if(!$_POST["drop_col"]||$Zc!=key($_POST["drop_col"])){echo" ".html_select("indexes[$Zc][type]",array(-1=>"")+$Oc,$w["type"],($Zc==count($L["indexes"])?"indexesAddRow.call(this);":1),"label-type")," ";ksort($w["columns"]);$u=1;foreach($w["columns"]as$z=>$d){echo"".select_input(" name='indexes[$Zc][columns][$u]' title='".'Column'."'",($n?array_combine($n,$n):$n),$d,"partial(".($u==count($w["columns"])?"indexesAddColumn":"indexesChangeColumn").", '".js_escape($y=="sql"?"":$_GET["indexes"]."_")."')"),($y=="sql"||$y=="mssql"?" ":""),(support("descidx")?checkbox("indexes[$Zc][descs][$u]",1,$w["descs"][$z],'descending'):"")," ";$u++;}echo" \n"," ".script("qsl('input').onclick = partial(editingRemoveRow, 'indexes\$1[type]');");}$Zc++;}echo'
-
-
+
+
-';}elseif(isset($_GET["database"])){$J=$_POST;if($_POST&&!$n&&!isset($_POST["add_x"])){$D=trim($J["name"]);if($_POST["drop"]){$_GET["db"]="";queries_redirect(remove_from_uri("db|database"),lang(184),drop_databases(array(DB)));}elseif(DB!==$D){if(DB!=""){$_GET["db"]=$D;queries_redirect(preg_replace('~\bdb=[^&]*&~','',ME)."db=".urlencode($D),lang(185),rename_database($D,$J["collation"]));}else{$k=explode("\n",str_replace("\r","",$D));$Lh=true;$qe="";foreach($k
-as$l){if(count($k)==1||$l!=""){if(!create_database($l,$J["collation"]))$Lh=false;$qe=$l;}}restart_session();set_session("dbs",null);queries_redirect(ME."db=".urlencode($qe),lang(186),$Lh);}}else{if(!$J["collation"])redirect(substr(ME,0,-1));query_redirect("ALTER DATABASE ".idf_escape($D).(preg_match('~^[a-z0-9_]+$~i',$J["collation"])?" COLLATE $J[collation]":""),substr(ME,0,-1),lang(187));}}page_header(DB!=""?lang(67):lang(115),$n,array(),h(DB));$nb=collations();$D=DB;if($_POST)$D=$J["name"];elseif(DB!="")$J["collation"]=db_collation(DB,$nb);elseif($y=="sql"){foreach(get_vals("SHOW GRANTS")as$qd){if(preg_match('~ ON (`(([^\\\\`]|``|\\\\.)*)%`\.\*)?~',$qd,$C)&&$C[1]){$D=stripcslashes(idf_unescape("`$C[2]`"));break;}}}echo'
+';}elseif(isset($_GET["database"])){$L=$_POST;if($_POST&&!$l&&!isset($_POST["add_x"])){$F=trim($L["name"]);if($_POST["drop"]){$_GET["db"]="";queries_redirect(remove_from_uri("db|database"),'Database has been dropped.',drop_databases(array(DB)));}elseif(DB!==$F){if(DB!=""){$_GET["db"]=$F;queries_redirect(preg_replace('~\bdb=[^&]*&~','',ME)."db=".urlencode($F),'Database has been renamed.',rename_database($F,$L["collation"]));}else{$i=explode("\n",str_replace("\r","",$F));$Qf=true;$hd="";foreach($i
+as$j){if(count($i)==1||$j!=""){if(!create_database($j,$L["collation"]))$Qf=false;$hd=$j;}}restart_session();set_session("dbs",null);queries_redirect(ME."db=".urlencode($hd),'Database has been created.',$Qf);}}else{if(!$L["collation"])redirect(substr(ME,0,-1));query_redirect("ALTER DATABASE ".idf_escape($F).(preg_match('~^[a-z0-9_]+$~i',$L["collation"])?" COLLATE $L[collation]":""),substr(ME,0,-1),'Database has been altered.');}}page_header(DB!=""?'Alter database':'Create database',$l,array(),h(DB));$Pa=collations();$F=DB;if($_POST)$F=$L["name"];elseif(DB!="")$L["collation"]=db_collation(DB,$Pa);elseif($y=="sql"){foreach(get_vals("SHOW GRANTS")as$vc){if(preg_match('~ ON (`(([^\\\\`]|``|\\\\.)*)%`\.\*)?~',$vc,$C)&&$C[1]){$F=stripcslashes(idf_unescape("`$C[2]`"));break;}}}echo'
-',($_POST["add_x"]||strpos($D,"\n")?''.h($D).' ':' ')."\n".($nb?html_select("collation",array(""=>"(".lang(101).")")+$nb,$J["collation"]).doc_link(array('sql'=>"charset-charsets.html",'mariadb'=>"supported-character-sets-and-collations/",'mssql'=>"ms187963.aspx",)):""),script("focus(qs('#name'));"),'
-';if(DB!="")echo" ".confirm(lang(175,DB))."\n";elseif(!$_POST["add_x"]&&$_GET["db"]=="")echo" \n";echo'
+',($_POST["add_x"]||strpos($F,"\n")?''.h($F).' ':' ')."\n".($Pa?html_select("collation",array(""=>"(".'collation'.")")+$Pa,$L["collation"]).'':""),script("focus(qs('#name'));"),'
+';if(DB!="")echo" ".confirm(sprintf('Drop %s?',DB))."\n";elseif(!$_POST["add_x"]&&$_GET["db"]=="")echo" \n";echo'
-';}elseif(isset($_GET["scheme"])){$J=$_POST;if($_POST&&!$n){$A=preg_replace('~ns=[^&]*&~','',ME)."ns=";if($_POST["drop"])query_redirect("DROP SCHEMA ".idf_escape($_GET["ns"]),$A,lang(188));else{$D=trim($J["name"]);$A.=urlencode($D);if($_GET["ns"]=="")query_redirect("CREATE SCHEMA ".idf_escape($D),$A,lang(189));elseif($_GET["ns"]!=$D)query_redirect("ALTER SCHEMA ".idf_escape($_GET["ns"])." RENAME TO ".idf_escape($D),$A,lang(190));else
-redirect($A);}}page_header($_GET["ns"]!=""?lang(68):lang(69),$n);if(!$J)$J["name"]=$_GET["ns"];echo'
+';}elseif(isset($_GET["foreign"])){$a=$_GET["foreign"];$F=$_GET["name"];$L=$_POST;if($_POST&&!$l&&!$_POST["add"]&&!$_POST["change"]&&!$_POST["change-js"]){$D=($_POST["drop"]?'Foreign key has been dropped.':($F!=""?'Foreign key has been altered.':'Foreign key has been created.'));$B=ME."table=".urlencode($a);if(!$_POST["drop"]){$L["source"]=array_filter($L["source"],'strlen');ksort($L["source"]);$dg=array();foreach($L["source"]as$z=>$X)$dg[$z]=$L["target"][$z];$L["target"]=$dg;}if($y=="sqlite")queries_redirect($B,$D,recreate_table($a,$a,array(),array(),array(" $F"=>($_POST["drop"]?"":" ".format_foreign_key($L)))));else{$oa="ALTER TABLE ".table($a);$_b="\nDROP ".($y=="sql"?"FOREIGN KEY ":"CONSTRAINT ").idf_escape($F);if($_POST["drop"])query_redirect($oa.$_b,$B,$D);else{query_redirect($oa.($F!=""?"$_b,":"")."\nADD".format_foreign_key($L),$B,$D);$l='Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.'." $l";}}}page_header('Foreign key',$l,array("table"=>$a),h($a));if($_POST){ksort($L["source"]);if($_POST["add"])$L["source"][]="";elseif($_POST["change"]||$_POST["change-js"])$L["target"]=array();}elseif($F!=""){$q=foreign_keys($a);$L=$q[$F];$L["source"][]="";}else{$L["table"]=$a;$L["source"]=array("");}echo'
-
-',script("focus(qs('#name'));"),'
-';if($_GET["ns"]!="")echo" ".confirm(lang(175,$_GET["ns"]))."\n";echo'
-
-';}elseif(isset($_GET["call"])){$da=($_GET["name"]?$_GET["name"]:$_GET["call"]);page_header(lang(191).": ".h($da),$n);$Wg=routine($_GET["call"],(isset($_GET["callf"])?"FUNCTION":"PROCEDURE"));$Ld=array();$Lf=array();foreach($Wg["fields"]as$t=>$o){if(substr($o["inout"],-3)=="OUT")$Lf[$t]="@".idf_escape($o["field"])." AS ".idf_escape($o["field"]);if(!$o["inout"]||substr($o["inout"],0,2)=="IN")$Ld[]=$t;}if(!$n&&$_POST){$Ya=array();foreach($Wg["fields"]as$z=>$o){if(in_array($z,$Ld)){$X=process_input($o);if($X===false)$X="''";if(isset($Lf[$z]))$g->query("SET @".idf_escape($o["field"])." = $X");}$Ya[]=(isset($Lf[$z])?"@".idf_escape($o["field"]):$X);}$G=(isset($_GET["callf"])?"SELECT":"CALL")." ".table($da)."(".implode(", ",$Ya).")";$Fh=microtime(true);$H=$g->multi_query($G);$_a=$g->affected_rows;echo$b->selectQuery($G,$Fh,!$H);if(!$H)echo"".error()."\n";else{$h=connect();if(is_object($h))$h->select_db(DB);do{$H=$g->store_result();if(is_object($H))select($H,$h);else
-echo"
".lang(192,$_a)." ".@date("H:i:s")." \n";}while($g->next_result());if($Lf)select($g->query("SELECT ".implode(", ",$Lf)));}}echo'
-
-';if($Ld){echo"\n";foreach($Ld
-as$z){$o=$Wg["fields"][$z];$D=$o["field"];echo"".$b->fieldName($o);$Y=$_POST["fields"][$D];if($Y!=""){if($o["type"]=="enum")$Y=+$Y;if($o["type"]=="set")$Y=array_sum($Y);}input($o,$Y,(string)$_POST["function"][$D]);echo"\n";}echo"
\n";}echo'
-
-
-
-';}elseif(isset($_GET["foreign"])){$a=$_GET["foreign"];$D=$_GET["name"];$J=$_POST;if($_POST&&!$n&&!$_POST["add"]&&!$_POST["change"]&&!$_POST["change-js"]){$Ne=($_POST["drop"]?lang(193):($D!=""?lang(194):lang(195)));$B=ME."table=".urlencode($a);if(!$_POST["drop"]){$J["source"]=array_filter($J["source"],'strlen');ksort($J["source"]);$Zh=array();foreach($J["source"]as$z=>$X)$Zh[$z]=$J["target"][$z];$J["target"]=$Zh;}if($y=="sqlite")queries_redirect($B,$Ne,recreate_table($a,$a,array(),array(),array(" $D"=>($_POST["drop"]?"":" ".format_foreign_key($J)))));else{$c="ALTER TABLE ".table($a);$lc="\nDROP ".($y=="sql"?"FOREIGN KEY ":"CONSTRAINT ").idf_escape($D);if($_POST["drop"])query_redirect($c.$lc,$B,$Ne);else{query_redirect($c.($D!=""?"$lc,":"")."\nADD".format_foreign_key($J),$B,$Ne);$n=lang(196)." $n";}}}page_header(lang(197),$n,array("table"=>$a),h($a));if($_POST){ksort($J["source"]);if($_POST["add"])$J["source"][]="";elseif($_POST["change"]||$_POST["change-js"])$J["target"]=array();}elseif($D!=""){$jd=foreign_keys($a);$J=$jd[$D];$J["source"][]="";}else{$J["table"]=$a;$J["source"]=array("");}echo'
-
-';$yh=array_keys(fields($a));if($J["db"]!="")$g->select_db($J["db"]);if($J["ns"]!="")set_schema($J["ns"]);$Fg=array_keys(array_filter(table_status('',true),'fk_support'));$Zh=array_keys(fields(in_array($J["table"],$Fg)?$J["table"]:reset($Fg)));$tf="this.form['change-js'].value = '1'; this.form.submit();";echo"".lang(198).": ".html_select("table",$Fg,$J["table"],$tf)."\n";if($y=="pgsql")echo
-lang(77).": ".html_select("ns",$b->schemas(),$J["ns"]!=""?$J["ns"]:$_GET["ns"],$tf);elseif($y!="sqlite"){$Wb=array();foreach($b->databases()as$l){if(!information_schema($l))$Wb[]=$l;}echo
-lang(76).": ".html_select("db",$Wb,$J["db"]!=""?$J["db"]:$_GET["db"],$tf);}echo'
-
+';$Ff=array_keys(fields($a));if($L["db"]!="")$f->select_db($L["db"]);if($L["ns"]!="")set_schema($L["ns"]);$df=array_keys(array_filter(table_status('',true),'fk_support'));$dg=array_keys(fields(in_array($L["table"],$df)?$L["table"]:reset($df)));$Xd="this.form['change-js'].value = '1'; this.form.submit();";echo"
".'Target table'.": ".html_select("table",$df,$L["table"],$Xd)."\n";if($y=="pgsql")echo'Schema'.": ".html_select("ns",$b->schemas(),$L["ns"]!=""?$L["ns"]:$_GET["ns"],$Xd);elseif($y!="sqlite"){$mb=array();foreach($b->databases()as$j){if(!information_schema($j))$mb[]=$j;}echo'DB'.": ".html_select("db",$mb,$L["db"]!=""?$L["db"]:$_GET["db"],$Xd);}echo'
+
-',lang(134),' ',lang(135),'
-';$ge=0;foreach($J["source"]as$z=>$X){echo"","".html_select("source[".(+$z)."]",array(-1=>"")+$yh,$X,($ge==count($J["source"])-1?"foreignAddRow.call(this);":1),"label-source")," ".html_select("target[".(+$z)."]",$Zh,$J["target"][$z],1,"label-target");$ge++;}echo'
+Source Target
+';$Zc=0;foreach($L["source"]as$z=>$X){echo"","".html_select("source[".(+$z)."]",array(-1=>"")+$Ff,$X,($Zc==count($L["source"])-1?"foreignAddRow.call(this);":1),"label-source")," ".html_select("target[".(+$z)."]",$dg,$L["target"][$z],1,"label-target");$Zc++;}echo'
-',lang(103),': ',html_select("on_delete",array(-1=>"")+explode("|",$sf),$J["on_delete"]),' ',lang(102),': ',html_select("on_update",array(-1=>"")+explode("|",$sf),$J["on_update"]),doc_link(array('sql'=>"innodb-foreign-key-constraints.html",'mariadb'=>"foreign-keys/",'pgsql'=>"sql-createtable.html#SQL-CREATETABLE-REFERENCES",'mssql'=>"ms174979.aspx",'oracle'=>"https://docs.oracle.com/cd/B19306_01/server.102/b14200/clauses002.htm#sthref2903",)),'
-
-
-';if($D!=""){echo' ',confirm(lang(175,$D));}echo'
+ON DELETE: ',html_select("on_delete",array(-1=>"")+explode("|",$Wd),$L["on_delete"]),' ON UPDATE: ',html_select("on_update",array(-1=>"")+explode("|",$Wd),$L["on_update"]),'','
+
+
+';if($F!=""){echo' ',confirm(sprintf('Drop %s?',$F));}echo'
-';}elseif(isset($_GET["view"])){$a=$_GET["view"];$J=$_POST;$If="VIEW";if($y=="pgsql"&&$a!=""){$O=table_status($a);$If=strtoupper($O["Engine"]);}if($_POST&&!$n){$D=trim($J["name"]);$Ga=" AS\n$J[select]";$B=ME."table=".urlencode($D);$Ne=lang(201);$T=($_POST["materialized"]?"MATERIALIZED VIEW":"VIEW");if(!$_POST["drop"]&&$a==$D&&$y!="sqlite"&&$T=="VIEW"&&$If=="VIEW")query_redirect(($y=="mssql"?"ALTER":"CREATE OR REPLACE")." VIEW ".table($D).$Ga,$B,$Ne);else{$bi=$D."_adminer_".uniqid();drop_create("DROP $If ".table($a),"CREATE $T ".table($D).$Ga,"DROP $T ".table($D),"CREATE $T ".table($bi).$Ga,"DROP $T ".table($bi),($_POST["drop"]?substr(ME,0,-1):$B),lang(202),$Ne,lang(203),$a,$D);}}if(!$_POST&&$a!=""){$J=view($a);$J["name"]=$a;$J["materialized"]=($If!="VIEW");if(!$n)$n=error();}page_header(($a!=""?lang(43):lang(204)),$n,array("table"=>$a),h($a));echo'
+';}elseif(isset($_GET["view"])){$a=$_GET["view"];$L=$_POST;$me="VIEW";if($y=="pgsql"&&$a!=""){$Mf=table_status($a);$me=strtoupper($Mf["Engine"]);}if($_POST&&!$l){$F=trim($L["name"]);$pa=" AS\n$L[select]";$B=ME."table=".urlencode($F);$D='View has been altered.';$V=($_POST["materialized"]?"MATERIALIZED VIEW":"VIEW");if(!$_POST["drop"]&&$a==$F&&$y!="sqlite"&&$V=="VIEW"&&$me=="VIEW")query_redirect(($y=="mssql"?"ALTER":"CREATE OR REPLACE")." VIEW ".table($F).$pa,$B,$D);else{$fg=$F."_adminer_".uniqid();drop_create("DROP $me ".table($a),"CREATE $V ".table($F).$pa,"DROP $V ".table($F),"CREATE $V ".table($fg).$pa,"DROP $V ".table($fg),($_POST["drop"]?substr(ME,0,-1):$B),'View has been dropped.',$D,'View has been created.',$a,$F);}}if(!$_POST&&$a!=""){$L=view($a);$L["name"]=$a;$L["materialized"]=($me!="VIEW");if(!$l)$l=error();}page_header(($a!=""?'Alter view':'Create view'),$l,array("table"=>$a),h($a));echo'
-',lang(183),':
-',(support("materializedview")?" ".checkbox("materialized",1,$J["materialized"],lang(129)):""),'
';textarea("select",$J["select"]);echo'
-
-';if($a!=""){echo' ',confirm(lang(175,$a));}echo'
+
Name:
+',(support("materializedview")?" ".checkbox("materialized",1,$L["materialized"],'Materialized view'):""),'
';textarea("select",$L["select"]);echo'
+
+';if($a!=""){echo' ',confirm(sprintf('Drop %s?',$a));}echo'
-';}elseif(isset($_GET["event"])){$aa=$_GET["event"];$Yd=array("YEAR","QUARTER","MONTH","DAY","HOUR","MINUTE","WEEK","SECOND","YEAR_MONTH","DAY_HOUR","DAY_MINUTE","DAY_SECOND","HOUR_MINUTE","HOUR_SECOND","MINUTE_SECOND");$Hh=array("ENABLED"=>"ENABLE","DISABLED"=>"DISABLE","SLAVESIDE_DISABLED"=>"DISABLE ON SLAVE");$J=$_POST;if($_POST&&!$n){if($_POST["drop"])query_redirect("DROP EVENT ".idf_escape($aa),substr(ME,0,-1),lang(205));elseif(in_array($J["INTERVAL_FIELD"],$Yd)&&isset($Hh[$J["STATUS"]])){$bh="\nON SCHEDULE ".($J["INTERVAL_VALUE"]?"EVERY ".q($J["INTERVAL_VALUE"])." $J[INTERVAL_FIELD]".($J["STARTS"]?" STARTS ".q($J["STARTS"]):"").($J["ENDS"]?" ENDS ".q($J["ENDS"]):""):"AT ".q($J["STARTS"]))." ON COMPLETION".($J["ON_COMPLETION"]?"":" NOT")." PRESERVE";queries_redirect(substr(ME,0,-1),($aa!=""?lang(206):lang(207)),queries(($aa!=""?"ALTER EVENT ".idf_escape($aa).$bh.($aa!=$J["EVENT_NAME"]?"\nRENAME TO ".idf_escape($J["EVENT_NAME"]):""):"CREATE EVENT ".idf_escape($J["EVENT_NAME"]).$bh)."\n".$Hh[$J["STATUS"]]." COMMENT ".q($J["EVENT_COMMENT"]).rtrim(" DO\n$J[EVENT_DEFINITION]",";").";"));}}page_header(($aa!=""?lang(208).": ".h($aa):lang(209)),$n);if(!$J&&$aa!=""){$K=get_rows("SELECT * FROM information_schema.EVENTS WHERE EVENT_SCHEMA = ".q(DB)." AND EVENT_NAME = ".q($aa));$J=reset($K);}echo'
-
-
-',lang(183),'
-',lang(210),'
-',lang(211),'
-',lang(212),' ',html_select("INTERVAL_FIELD",$Yd,$J["INTERVAL_FIELD"]),'',lang(118),' ',html_select("STATUS",$Hh,$J["STATUS"]),' ',lang(50),'
-',checkbox("ON_COMPLETION","PRESERVE",$J["ON_COMPLETION"]=="PRESERVE",lang(213)),'
-';textarea("EVENT_DEFINITION",$J["EVENT_DEFINITION"]);echo'
-
-';if($aa!=""){echo' ',confirm(lang(175,$aa));}echo'
-
-';}elseif(isset($_GET["procedure"])){$da=($_GET["name"]?$_GET["name"]:$_GET["procedure"]);$Wg=(isset($_GET["function"])?"FUNCTION":"PROCEDURE");$J=$_POST;$J["fields"]=(array)$J["fields"];if($_POST&&!process_fields($J["fields"])&&!$n){$Ff=routine($_GET["procedure"],$Wg);$bi="$J[name]_adminer_".uniqid();drop_create("DROP $Wg ".routine_id($da,$Ff),create_routine($Wg,$J),"DROP $Wg ".routine_id($J["name"],$J),create_routine($Wg,array("name"=>$bi)+$J),"DROP $Wg ".routine_id($bi,$J),substr(ME,0,-1),lang(214),lang(215),lang(216),$da,$J["name"]);}page_header(($da!=""?(isset($_GET["function"])?lang(217):lang(218)).": ".h($da):(isset($_GET["function"])?lang(219):lang(220))),$n);if(!$_POST&&$da!=""){$J=routine($_GET["procedure"],$Wg);$J["name"]=$da;}$nb=get_vals("SHOW CHARACTER SET");sort($nb);$Xg=routine_languages();echo'
-
-',lang(183),':
-',($Xg?lang(19).": ".html_select("language",$Xg,$J["language"])."\n":""),'
-
-';textarea("definition",$J["definition"]);echo'
-
-';if($da!=""){echo' ',confirm(lang(175,$da));}echo'
-
-';}elseif(isset($_GET["sequence"])){$fa=$_GET["sequence"];$J=$_POST;if($_POST&&!$n){$A=substr(ME,0,-1);$D=trim($J["name"]);if($_POST["drop"])query_redirect("DROP SEQUENCE ".idf_escape($fa),$A,lang(222));elseif($fa=="")query_redirect("CREATE SEQUENCE ".idf_escape($D),$A,lang(223));elseif($fa!=$D)query_redirect("ALTER SEQUENCE ".idf_escape($fa)." RENAME TO ".idf_escape($D),$A,lang(224));else
-redirect($A);}page_header($fa!=""?lang(225).": ".h($fa):lang(226),$n);if(!$J)$J["name"]=$fa;echo'
-
-
-
-';if($fa!="")echo" ".confirm(lang(175,$fa))."\n";echo'
-
-';}elseif(isset($_GET["type"])){$ga=$_GET["type"];$J=$_POST;if($_POST&&!$n){$A=substr(ME,0,-1);if($_POST["drop"])query_redirect("DROP TYPE ".idf_escape($ga),$A,lang(227));else
-query_redirect("CREATE TYPE ".idf_escape(trim($J["name"]))." $J[as]",$A,lang(228));}page_header($ga!=""?lang(229).": ".h($ga):lang(230),$n);if(!$J)$J["as"]="AS ";echo'
-
-
-';if($ga!="")echo" ".confirm(lang(175,$ga))."\n";else{echo" \n";textarea("as",$J["as"]);echo"
\n";}echo'
-
-';}elseif(isset($_GET["trigger"])){$a=$_GET["trigger"];$D=$_GET["name"];$Ai=trigger_options();$J=(array)trigger($D,$a)+array("Trigger"=>$a."_bi");if($_POST){if(!$n&&in_array($_POST["Timing"],$Ai["Timing"])&&in_array($_POST["Event"],$Ai["Event"])&&in_array($_POST["Type"],$Ai["Type"])){$rf=" ON ".table($a);$lc="DROP TRIGGER ".idf_escape($D).($y=="pgsql"?$rf:"");$B=ME."table=".urlencode($a);if($_POST["drop"])query_redirect($lc,$B,lang(231));else{if($D!="")queries($lc);queries_redirect($B,($D!=""?lang(232):lang(233)),queries(create_trigger($rf,$_POST)));if($D!="")queries(create_trigger($rf,$J+array("Type"=>reset($Ai["Type"]))));}}$J=$_POST;}page_header(($D!=""?lang(234).": ".h($D):lang(235)),$n,array("table"=>$a));echo'
+';}elseif(isset($_GET["trigger"])){$a=$_GET["trigger"];$F=$_GET["name"];$_g=trigger_options();$L=(array)trigger($F,$a)+array("Trigger"=>$a."_bi");if($_POST){if(!$l&&in_array($_POST["Timing"],$_g["Timing"])&&in_array($_POST["Event"],$_g["Event"])&&in_array($_POST["Type"],$_g["Type"])){$Vd=" ON ".table($a);$_b="DROP TRIGGER ".idf_escape($F).($y=="pgsql"?$Vd:"");$B=ME."table=".urlencode($a);if($_POST["drop"])query_redirect($_b,$B,'Trigger has been dropped.');else{if($F!="")queries($_b);queries_redirect($B,($F!=""?'Trigger has been altered.':'Trigger has been created.'),queries(create_trigger($Vd,$_POST)));if($F!="")queries(create_trigger($Vd,$L+array("Type"=>reset($_g["Type"]))));}}$L=$_POST;}page_header(($F!=""?'Alter trigger'.": ".h($F):'Create trigger'),$l,array("table"=>$a));echo'
-',lang(236),' ',html_select("Timing",$Ai["Timing"],$J["Timing"],"triggerChange(/^".preg_quote($a,"/")."_[ba][iud]$/, '".js_escape($a)."', this.form);"),' ',lang(237),' ',html_select("Event",$Ai["Event"],$J["Event"],"this.form['Timing'].onchange();"),(in_array("UPDATE OF",$Ai["Event"])?" ":""),' ',lang(49),' ',html_select("Type",$Ai["Type"],$J["Type"]),'
-',lang(183),':
-',script("qs('#form')['Timing'].onchange();"),'
';textarea("Statement",$J["Statement"]);echo'
-
-';if($D!=""){echo' ',confirm(lang(175,$D));}echo'
+
Time ',html_select("Timing",$_g["Timing"],$L["Timing"],"triggerChange(/^".preg_quote($a,"/")."_[ba][iud]$/, '".js_escape($a)."', this.form);"),' Event ',html_select("Event",$_g["Event"],$L["Event"],"this.form['Timing'].onchange();"),(in_array("UPDATE OF",$_g["Event"])?" ":""),' Type ',html_select("Type",$_g["Type"],$L["Type"]),'
+Name:
+',script("qs('#form')['Timing'].onchange();"),'
';textarea("Statement",$L["Statement"]);echo'
+
+';if($F!=""){echo' ',confirm(sprintf('Drop %s?',$F));}echo'
-';}elseif(isset($_GET["user"])){$ha=$_GET["user"];$sg=array(""=>array("All privileges"=>""));foreach(get_rows("SHOW PRIVILEGES")as$J){foreach(explode(",",($J["Privilege"]=="Grant option"?"":$J["Context"]))as$Fb)$sg[$Fb][$J["Privilege"]]=$J["Comment"];}$sg["Server Admin"]+=$sg["File access on server"];$sg["Databases"]["Create routine"]=$sg["Procedures"]["Create routine"];unset($sg["Procedures"]["Create routine"]);$sg["Columns"]=array();foreach(array("Select","Insert","Update","References")as$X)$sg["Columns"][$X]=$sg["Tables"][$X];unset($sg["Server Admin"]["Usage"]);foreach($sg["Tables"]as$z=>$X)unset($sg["Databases"][$z]);$af=array();if($_POST){foreach($_POST["objects"]as$z=>$X)$af[$X]=(array)$af[$X]+(array)$_POST["grants"][$z];}$rd=array();$pf="";if(isset($_GET["host"])&&($H=$g->query("SHOW GRANTS FOR ".q($ha)."@".q($_GET["host"])))){while($J=$H->fetch_row()){if(preg_match('~GRANT (.*) ON (.*) TO ~',$J[0],$C)&&preg_match_all('~ *([^(,]*[^ ,(])( *\([^)]+\))?~',$C[1],$Fe,PREG_SET_ORDER)){foreach($Fe
-as$X){if($X[1]!="USAGE")$rd["$C[2]$X[2]"][$X[1]]=true;if(preg_match('~ WITH GRANT OPTION~',$J[0]))$rd["$C[2]$X[2]"]["GRANT OPTION"]=true;}}if(preg_match("~ IDENTIFIED BY PASSWORD '([^']+)~",$J[0],$C))$pf=$C[1];}}if($_POST&&!$n){$qf=(isset($_GET["host"])?q($ha)."@".q($_GET["host"]):"''");if($_POST["drop"])query_redirect("DROP USER $qf",ME."privileges=",lang(238));else{$cf=q($_POST["user"])."@".q($_POST["host"]);$Zf=$_POST["pass"];if($Zf!=''&&!$_POST["hashed"]&&!min_version(8)){$Zf=$g->result("SELECT PASSWORD(".q($Zf).")");$n=!$Zf;}$Lb=false;if(!$n){if($qf!=$cf){$Lb=queries((min_version(5)?"CREATE USER":"GRANT USAGE ON *.* TO")." $cf IDENTIFIED BY ".(min_version(8)?"":"PASSWORD ").q($Zf));$n=!$Lb;}elseif($Zf!=$pf)queries("SET PASSWORD FOR $cf = ".q($Zf));}if(!$n){$Tg=array();foreach($af
-as$if=>$qd){if(isset($_GET["grant"]))$qd=array_filter($qd);$qd=array_keys($qd);if(isset($_GET["grant"]))$Tg=array_diff(array_keys(array_filter($af[$if],'strlen')),$qd);elseif($qf==$cf){$nf=array_keys((array)$rd[$if]);$Tg=array_diff($nf,$qd);$qd=array_diff($qd,$nf);unset($rd[$if]);}if(preg_match('~^(.+)\s*(\(.*\))?$~U',$if,$C)&&(!grant("REVOKE",$Tg,$C[2]," ON $C[1] FROM $cf")||!grant("GRANT",$qd,$C[2]," ON $C[1] TO $cf"))){$n=true;break;}}}if(!$n&&isset($_GET["host"])){if($qf!=$cf)queries("DROP USER $qf");elseif(!isset($_GET["grant"])){foreach($rd
-as$if=>$Tg){if(preg_match('~^(.+)(\(.*\))?$~U',$if,$C))grant("REVOKE",array_keys($Tg),$C[2]," ON $C[1] FROM $cf");}}}queries_redirect(ME."privileges=",(isset($_GET["host"])?lang(239):lang(240)),!$n);if($Lb)$g->query("DROP USER $cf");}}page_header((isset($_GET["host"])?lang(35).": ".h("$ha@$_GET[host]"):lang(146)),$n,array("privileges"=>array('',lang(71))));if($_POST){$J=$_POST;$rd=$af;}else{$J=$_GET+array("host"=>$g->result("SELECT SUBSTRING_INDEX(CURRENT_USER, '@', -1)"));$J["pass"]=$pf;if($pf!="")$J["hashed"]=true;$rd[(DB==""||$rd?"":idf_escape(addcslashes(DB,"%_\\"))).".*"]=array();}echo'
-
-',lang(34),'
-',lang(35),'
-',lang(36),'
-';if(!$J["hashed"])echo
-script("typePassword(qs('#pass'));");echo(min_version(8)?"":checkbox("hashed",1,$J["hashed"],lang(241),"typePassword(this.form['pass'], this.checked);")),'
-
-';echo"\n",'
-
-';if(isset($_GET["host"])){echo' ',confirm(lang(175,"$ha@$_GET[host]"));}echo'
-
-';}elseif(isset($_GET["processlist"])){if(support("kill")){if($_POST&&!$n){$le=0;foreach((array)$_POST["kill"]as$X){if(kill_process($X))$le++;}queries_redirect(ME."processlist=",lang(245,$le),$le||!$_POST["kill"]);}}page_header(lang(116),$n);echo'
-
-
-
-';if(support("kill")){echo($t+1)."/".lang(247,max_connections()),"
\n";}echo'
-
-',script("tableCheck();");}elseif(isset($_GET["select"])){$a=$_GET["select"];$R=table_status1($a);$x=indexes($a);$p=fields($a);$jd=column_foreign_keys($a);$lf=$R["Oid"];parse_str($_COOKIE["adminer_import"],$za);$Ug=array();$e=array();$fi=null;foreach($p
-as$z=>$o){$D=$b->fieldName($o);if(isset($o["privileges"]["select"])&&$D!=""){$e[$z]=html_entity_decode(strip_tags($D),ENT_QUOTES);if(is_shortable($o))$fi=$b->selectLengthProcess();}$Ug+=$o["privileges"];}list($L,$sd)=$b->selectColumnsProcess($e,$x);$ce=count($sd)selectSearchProcess($p,$x);$Bf=$b->selectOrderProcess($p,$x);$_=$b->selectLimitProcess();if($_GET["val"]&&is_ajax()){header("Content-Type: text/plain; charset=utf-8");foreach($_GET["val"]as$Hi=>$J){$Ga=convert_field($p[key($J)]);$L=array($Ga?$Ga:idf_escape(key($J)));$Z[]=where_check($Hi,$p);$I=$m->select($a,$L,$Z,$L);if($I)echo
-reset($I->fetch_row());}exit;}$ng=$Ji=null;foreach($x
-as$w){if($w["type"]=="PRIMARY"){$ng=array_flip($w["columns"]);$Ji=($L?$ng:array());foreach($Ji
-as$z=>$X){if(in_array(idf_escape($z),$L))unset($Ji[$z]);}break;}}if($lf&&!$ng){$ng=$Ji=array($lf=>0);$x[]=array("type"=>"PRIMARY","columns"=>array($lf));}if($_POST&&!$n){$kj=$Z;if(!$_POST["all"]&&is_array($_POST["check"])){$eb=array();foreach($_POST["check"]as$bb)$eb[]=where_check($bb,$p);$kj[]="((".implode(") OR (",$eb)."))";}$kj=($kj?"\nWHERE ".implode(" AND ",$kj):"");if($_POST["export"]){cookie("adminer_import","output=".urlencode($_POST["output"])."&format=".urlencode($_POST["format"]));dump_headers($a);$b->dumpTable($a,"");$od=($L?implode(", ",$L):"*").convert_fields($e,$p,$L)."\nFROM ".table($a);$ud=($sd&&$ce?"\nGROUP BY ".implode(", ",$sd):"").($Bf?"\nORDER BY ".implode(", ",$Bf):"");if(!is_array($_POST["check"])||$ng)$G="SELECT $od$kj$ud";else{$Fi=array();foreach($_POST["check"]as$X)$Fi[]="(SELECT".limit($od,"\nWHERE ".($Z?implode(" AND ",$Z)." AND ":"").where_check($X,$p).$ud,1).")";$G=implode(" UNION ALL ",$Fi);}$b->dumpData($a,"table",$G);exit;}if(!$b->selectEmailProcess($Z,$jd)){if($_POST["save"]||$_POST["delete"]){$H=true;$_a=0;$N=array();if(!$_POST["delete"]){foreach($e
-as$D=>$X){$X=process_input($p[$D]);if($X!==null&&($_POST["clone"]||$X!==false))$N[idf_escape($D)]=($X!==false?$X:idf_escape($D));}}if($_POST["delete"]||$N){if($_POST["clone"])$G="INTO ".table($a)." (".implode(", ",array_keys($N)).")\nSELECT ".implode(", ",$N)."\nFROM ".table($a);if($_POST["all"]||($ng&&is_array($_POST["check"]))||$ce){$H=($_POST["delete"]?$m->delete($a,$kj):($_POST["clone"]?queries("INSERT $G$kj"):$m->update($a,$N,$kj)));$_a=$g->affected_rows;}else{foreach((array)$_POST["check"]as$X){$gj="\nWHERE ".($Z?implode(" AND ",$Z)." AND ":"").where_check($X,$p);$H=($_POST["delete"]?$m->delete($a,$gj,1):($_POST["clone"]?queries("INSERT".limit1($a,$G,$gj)):$m->update($a,$N,$gj,1)));if(!$H)break;$_a+=$g->affected_rows;}}}$Ne=lang(249,$_a);if($_POST["clone"]&&$H&&$_a==1){$re=last_id();if($re)$Ne=lang(168," $re");}queries_redirect(remove_from_uri($_POST["all"]&&$_POST["delete"]?"page":""),$Ne,$H);if(!$_POST["delete"]){edit_form($a,$p,(array)$_POST["fields"],!$_POST["clone"]);page_footer();exit;}}elseif(!$_POST["import"]){if(!$_POST["val"])$n=lang(250);else{$H=true;$_a=0;foreach($_POST["val"]as$Hi=>$J){$N=array();foreach($J
-as$z=>$X){$z=bracket_escape($z,1);$N[idf_escape($z)]=(preg_match('~char|text~',$p[$z]["type"])||$X!=""?$b->processInput($p[$z],$X):"NULL");}$H=$m->update($a,$N," WHERE ".($Z?implode(" AND ",$Z)." AND ":"").where_check($Hi,$p),!$ce&&!$ng," ");if(!$H)break;$_a+=$g->affected_rows;}queries_redirect(remove_from_uri(),lang(249,$_a),$H);}}elseif(!is_string($Zc=get_file("csv_file",true)))$n=upload_error($Zc);elseif(!preg_match('~~u',$Zc))$n=lang(251);else{cookie("adminer_import","output=".urlencode($za["output"])."&format=".urlencode($_POST["separator"]));$H=true;$pb=array_keys($p);preg_match_all('~(?>"[^"]*"|[^"\r\n]+)+~',$Zc,$Fe);$_a=count($Fe[0]);$m->begin();$kh=($_POST["separator"]=="csv"?",":($_POST["separator"]=="tsv"?"\t":";"));$K=array();foreach($Fe[0]as$z=>$X){preg_match_all("~((?>\"[^\"]*\")+|[^$kh]*)$kh~",$X.$kh,$Ge);if(!$z&&!array_diff($Ge[1],$pb)){$pb=$Ge[1];$_a--;}else{$N=array();foreach($Ge[1]as$t=>$kb)$N[idf_escape($pb[$t])]=($kb==""&&$p[$pb[$t]]["null"]?"NULL":q(str_replace('""','"',preg_replace('~^"|"$~','',$kb))));$K[]=$N;}}$H=(!$K||$m->insertUpdate($a,$K,$ng));if($H)$H=$m->commit();queries_redirect(remove_from_uri("page"),lang(252,$_a),$H);$m->rollback();}}}$Rh=$b->tableName($R);if(is_ajax()){page_headers();ob_start();}else
-page_header(lang(53).": $Rh",$n);$N=null;if(isset($Ug["insert"])||!support("table")){$N="";foreach((array)$_GET["where"]as$X){if($jd[$X["col"]]&&count($jd[$X["col"]])==1&&($X["op"]=="="||(!$X["op"]&&!preg_match('~[_%]~',$X["val"]))))$N.="&set".urlencode("[".bracket_escape($X["col"])."]")."=".urlencode($X["val"]);}}$b->selectLinks($R,$N);if(!$e&&support("table"))echo"".lang(253).($p?".":": ".error())."\n";else{echo"
\n","";hidden_fields_get();echo(DB!=""?' '.(isset($_GET["ns"])?' ':""):"");echo' ',"
\n";$b->selectColumnsPrint($L,$e);$b->selectSearchPrint($Z,$e,$x);$b->selectOrderPrint($Bf,$e,$x);$b->selectLimitPrint($_);$b->selectLengthPrint($fi);$b->selectActionPrint($x);echo" \n";$E=$_GET["page"];if($E=="last"){$md=$g->result(count_rows($a,$Z,$ce,$sd));$E=floor(max(0,$md-1)/$_);}$fh=$L;$td=$sd;if(!$fh){$fh[]="*";$Gb=convert_fields($e,$p,$L);if($Gb)$fh[]=substr($Gb,2);}foreach($L
-as$z=>$X){$o=$p[idf_unescape($X)];if($o&&($Ga=convert_field($o)))$fh[$z]="$Ga AS $X";}if(!$ce&&$Ji){foreach($Ji
-as$z=>$X){$fh[]=idf_escape($z);if($td)$td[]=idf_escape($z);}}$H=$m->select($a,$fh,$Z,$td,$Bf,$_,$E,true);if(!$H)echo"".error()."\n";else{if($y=="mssql"&&$E)$H->seek($_*$E);$yc=array();echo"
\n";$K=array();while($J=$H->fetch_assoc()){if($E&&$y=="oracle")unset($J["RNUM"]);$K[]=$J;}if($_GET["page"]!="last"&&$_!=""&&$sd&&$ce&&$y=="sql")$md=$g->result(" SELECT FOUND_ROWS()");if(!$K)echo"".lang(12)."\n";else{$Pa=$b->backwardKeys($a,$Rh);echo"
\n";}if(!is_ajax()){if($K||$E){$Ic=true;if($_GET["page"]!="last"){if($_==""||(count($K)<$_&&($K||!$E)))$md=($E?$E*$_:0)+count($K);elseif($y!="sql"||!$ce){$md=($ce?false:found_rows($R,$Z));if($md$_||$E));if($Pf){echo(($md===false?count($K)+1:$md-$E*$_)>$_?''.lang(258).' '.script("qsl('a').onclick = partial(selectLoadMore, ".(+$_).", '".lang(259)."β¦');",""):''),"\n";}}echo"
\n";if($b->selectImportPrint()){echo"","
".'Import'." ",script("qsl('a').onclick = partial(toggle, 'import');",""),"
: "," ",html_select("separator",array("csv"=>"CSV,","csv;"=>"CSV;","tsv"=>"TSV"),$ja["format"],1);echo" "," ","
";}echo" \n"," \n",(!$t&&$N?"":script("tableCheck();"));}}}if(is_ajax()){ob_end_clean();exit;}}elseif(isset($_GET["variables"])){$Mf=isset($_GET["status"]);page_header($Mf?'Status':'Variables');$Vg=($Mf?show_status():show_variables());if(!$Vg)echo"".'No rows.'."\n";else{echo"
\n";foreach($Vg
+as$z=>$X){echo"","".h($z)."","".h($X);}echo"
\n";}}elseif(isset($_GET["script"])){header("Content-Type: text/javascript; charset=utf-8");if($_GET["script"]=="db"){$Tf=array("Data_length"=>0,"Index_length"=>0,"Data_free"=>0);foreach(table_status()as$F=>$S){json_row("Comment-$F",h($S["Comment"]));if(!is_view($S)){foreach(array("Engine","Collation")as$z)json_row("$z-$F",h($S[$z]));foreach($Tf+array("Auto_increment"=>0,"Rows"=>0)as$z=>$X){if($S[$z]!=""){$X=format_number($S[$z]);json_row("$z-$F",($z=="Rows"&&$X&&$S["Engine"]==($Hf=="pgsql"?"table":"InnoDB")?"~ $X":$X));if(isset($Tf[$z]))$Tf[$z]+=($S["Engine"]!="InnoDB"||$z!="Data_free"?$S[$z]:0);}elseif(array_key_exists($z,$S))json_row("$z-$F");}}}foreach($Tf
+as$z=>$X)json_row("sum-$z",format_number($X));json_row("");}elseif($_GET["script"]=="kill")$f->query("KILL ".number($_POST["kill"]));else{foreach(count_tables($b->databases())as$j=>$X){json_row("tables-$j",$X);json_row("size-$j",db_size($j));}json_row("");}exit;}else{$bg=array_merge((array)$_POST["tables"],(array)$_POST["views"]);if($bg&&!$l&&!$_POST["search"]){$J=true;$D="";if($y=="sql"&&$_POST["tables"]&&count($_POST["tables"])>1&&($_POST["drop"]||$_POST["truncate"]||$_POST["copy"]))queries("SET foreign_key_checks = 0");if($_POST["truncate"]){if($_POST["tables"])$J=truncate_tables($_POST["tables"]);$D='Tables have been truncated.';}elseif($_POST["move"]){$J=move_tables((array)$_POST["tables"],(array)$_POST["views"],$_POST["target"]);$D='Tables have been moved.';}elseif($_POST["copy"]){$J=copy_tables((array)$_POST["tables"],(array)$_POST["views"],$_POST["target"]);$D='Tables have been copied.';}elseif($_POST["drop"]){if($_POST["views"])$J=drop_views($_POST["views"]);if($J&&$_POST["tables"])$J=drop_tables($_POST["tables"]);$D='Tables have been dropped.';}elseif($y!="sql"){$J=($y=="sqlite"?queries("VACUUM"):apply_queries("VACUUM".($_POST["optimize"]?"":" ANALYZE"),$_POST["tables"]));$D='Tables have been optimized.';}elseif(!$_POST["tables"])$D='No tables.';elseif($J=queries(($_POST["optimize"]?"OPTIMIZE":($_POST["check"]?"CHECK":($_POST["repair"]?"REPAIR":"ANALYZE")))." TABLE ".implode(", ",array_map('idf_escape',$_POST["tables"])))){while($L=$J->fetch_assoc())$D.="".h($L["Table"])." : ".h($L["Msg_text"])." ";}queries_redirect(substr(ME,0,-1),$D,$J);}page_header(($_GET["ns"]==""?'Database'.": ".h(DB):'Schema'.": ".h($_GET["ns"])),$l,true);if($b->homepage()){if($_GET["ns"]!==""){echo"".'Tables and views'." \n";$ag=tables_list();if(!$ag)echo"".'No tables.'."\n";else{echo"
\n";if(support("table")){echo"".'Search data in tables'." "," ",script("qsl('input').onkeydown = partialArg(bodyKeydown, 'search');","")," \n","
\n";if($_POST["search"]&&$_POST["query"]!=""){$_GET["where"][0]["op"]="LIKE %%";search_tables();}}echo"\n";if(!information_schema(DB)){echo"\n";}echo" \n",script("tableCheck();");}echo''.'Create table'." \n",(support("view")?''.'Create view'." \n":"");if($ag)echo
+script("ajaxSetHtml('".js_escape(ME)."script=db');");}}}page_footer();
diff --git a/scripts/advanced.php b/scripts/advanced.php
index e67c5bc..d6c0b3c 100644
--- a/scripts/advanced.php
+++ b/scripts/advanced.php
@@ -7,6 +7,23 @@ if (file_exists('/home/pi/BirdNET-Pi/thisrun.txt')) {
} elseif (file_exists('/home/pi/BirdNET-Pi/firstrun.ini')) {
$config = parse_ini_file('/home/pi/BirdNET-Pi/firstrun.ini');
}
+$caddypwd = $config['CADDY_PWD'];
+if (!isset($_SERVER['PHP_AUTH_USER'])) {
+ header('WWW-Authenticate: Basic realm="My Realm"');
+ header('HTTP/1.0 401 Unauthorized');
+ echo 'You cannot edit the settings for this installation';
+ exit;
+} else {
+ $submittedpwd = $_SERVER['PHP_AUTH_PW'];
+ $submitteduser = $_SERVER['PHP_AUTH_USER'];
+ if($submittedpwd !== $caddypwd || $submitteduser !== 'birdnet'){
+ header('WWW-Authenticate: Basic realm="My Realm"');
+ header('HTTP/1.0 401 Unauthorized');
+ echo 'You cannot edit the settings for this installation';
+ exit;
+ }
+}
+
if(isset($_POST['submit'])) {
$contents = file_get_contents("/home/pi/BirdNET-Pi/birdnet.conf");
@@ -25,15 +42,6 @@ if(isset($_POST['submit'])) {
}
}
- if(isset($_POST["db_pwd"])) {
- $db_pwd = $_POST["db_pwd"];
- if(strcmp($db_pwd,$config['DB_PWD']) !== 0) {
- shell_exec('sudo /usr/local/bin/update_db_pwd_bullseye.sh');
- $contents = preg_replace("/DB_PWD=.*/", "DB_PWD=$db_pwd", $contents);
- $contents2 = preg_replace("/DB_PWD=.*/", "DB_PWD=$db_pwd", $contents2);
- }
- }
-
if(isset($_POST["ice_pwd"])) {
$ice_pwd = $_POST["ice_pwd"];
if(strcmp($ice_pwd,$config['ICE_PWD']) !== 0) {
@@ -42,30 +50,6 @@ if(isset($_POST['submit'])) {
}
}
- if(isset($_POST["webterminal_url"])) {
- $webterminal_url = $_POST["webterminal_url"];
- if(strcmp($webterminal_url,$config['WEBTERMINAL_URL']) !== 0) {
- $contents = preg_replace("/WEBTERMINAL_URL=.*/", "WEBTERMINAL_URL=$webterminal_url", $contents);
- $contents2 = preg_replace("/WEBTERMINAL_URL=.*/", "WEBTERMINAL_URL=$webterminal_url", $contents2);
- $fh = fopen("/home/pi/BirdNET-Pi/birdnet.conf", "w");
- $fh2 = fopen("/home/pi/BirdNET-Pi/thisrun.txt", "w");
- fwrite($fh, $contents);
- fwrite($fh2, $contents2);
- }
- }
-
- if(isset($_POST["birdnetlog_url"])) {
- $birdnetlog_url = $_POST["birdnetlog_url"];
- if(strcmp($birdnetlog_url,$config['BIRDNETLOG_URL']) !== 0) {
- $contents = preg_replace("/BIRDNETLOG_URL=.*/", "BIRDNETLOG_URL=$birdnetlog_url", $contents);
- $contents2 = preg_replace("/BIRDNETLOG_URL=.*/", "BIRDNETLOG_URL=$birdnetlog_url", $contents2);
- $fh = fopen("/home/pi/BirdNET-Pi/birdnet.conf", "w");
- $fh2 = fopen("/home/pi/BirdNET-Pi/thisrun.txt", "w");
- fwrite($fh, $contents);
- fwrite($fh2, $contents2);
- }
- }
-
if(isset($_POST["birdnetpi_url"])) {
$birdnetpi_url = $_POST["birdnetpi_url"];
if(strcmp($birdnetpi_url,$config['BIRDNETPI_URL']) !== 0) {
@@ -155,104 +139,13 @@ if(isset($_POST['submit'])) {
$fh2 = fopen("/home/pi/BirdNET-Pi/thisrun.txt", "w");
fwrite($fh, $contents);
fwrite($fh2, $contents2);
- @session_start();
- if(true){
- $_SESSION['success'] = 1;
- }
}
?>
-
+
Advanced Settings
-
-
-
-
+
Defaults
Full Disk Behavior:
-
-
+ >Purge
-
-
+ Set Channels to the number of channels supported by your sound card. 32 max.
Recording Length:
- Set Recording Length in seconds between 6 and 60. Multiples of 3 are recommended, as BirdNET analyzes in 3-second chunks.
+ Set Recording Length in seconds between 6 and 60. Multiples of 3 are recommended, as BirdNET analyzes in 3-second chunks.
Extraction Length:
Set Extraction Length to something less than your Recording Length. Min=3 Max=Recording Length
@@ -302,28 +192,14 @@ foreach($formats as $format){
}
?>
- Passwords
+ BirdNET-Pi Password
Webpage:
- This password protects the Live Audio Stream, the Processed extractions, phpSysInfo, your Tools, and WebTerminal. When you update this value, the web server will reload, so wait about 30 seconds and then reload the page.
- Database:
-
- This password protects the database. When you update this value, it will be updated automatically.
- Live Audio Stream:
-
-
-
-
Custom URLs
-
When you update any of the URL settings below, the web server will reload, so be sure to wait at least 30 seconds and then reload the page.
+
Custom URL
+
When you update the URL below, the web server will reload, so be sure to wait at least 30 seconds and then go to your new URL.
BirdNET-Pi URL:
This URL is how the main page will be reached. If you want your installation to respond to an IP address, place that here, but be sure to indicate `http://`. Example for IP:http://192.168.0.109 Example if you own your own domain:https://birdnetpi.pmcgui.xyz
-
BirdNET-Lite Log URL:
-
-
This URL is how the log will be reached. Only use this variable if you own your own domain.
-
Web Terminal URL:
-
-
This URL is how the Web browser terminal will be reached. Only use this variable if you own your own domain.
BirdNET-Lite Settings
Overlap:
@@ -335,24 +211,19 @@ foreach($formats as $format){
Min=0.5, Max=1.5
-
+
+
+?>
+
-
-
- Basic Settings
-
-
-
- Tools
-
+
+
+ Basic Settings
+
-
-
diff --git a/scripts/analyze.py b/scripts/analyze.py
old mode 100644
new mode 100755
index 4f36e80..dada0ae
--- a/scripts/analyze.py
+++ b/scripts/analyze.py
@@ -1,3 +1,4 @@
+#!/home/pi/BirdNET-Pi/birdnet/bin/python3
import argparse
import socket
diff --git a/scripts/backup_inprogress.html b/scripts/backup_inprogress.html
deleted file mode 100644
index f671163..0000000
--- a/scripts/backup_inprogress.html
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
- A backup is being made that includes all of
- your extractions and the BirdDB.txt
-
- The backup is in /home/pi/BirdNET-Pi
-
-
diff --git a/scripts/birdnet-pi-config b/scripts/birdnet-pi-config
deleted file mode 100755
index f037783..0000000
--- a/scripts/birdnet-pi-config
+++ /dev/null
@@ -1,997 +0,0 @@
-#!/usr/bin/env -S sudo -E sh
-# Altered from raspi-config tool below
-# https://github.com/RPi-Distro/birdnet-pi-config
-#
-# See LICENSE file for copyright and license details
-# Copyright (c) 2012 Alex Bradbury
-set -x
-birdnetpi_dir=/home/pi/BirdNET-Pi
-birders_config=${birdnetpi_dir}/Birders_Guide_Installer_Configuration.txt
-branch=forms
-INTERACTIVE=True
-ASK_TO_REBOOT=0
-BLACKLIST=/etc/modprobe.d/raspi-blacklist.conf
-CONFIG=/boot/config.txt
-
-USER=${SUDO_USER:-$(who -m | awk '{ print $1 }')}
-
-is_pi () {
- ARCH=$(dpkg --print-architecture)
- if [ "$ARCH" = "armhf" ] || [ "$ARCH" = "arm64" ] ; then
- return 0
- else
- return 1
- fi
-}
-
-if is_pi ; then
- CMDLINE=/boot/cmdline.txt
-else
- CMDLINE=/proc/cmdline
-fi
-
-is_pione() {
- if grep -q "^Revision\s*:\s*00[0-9a-fA-F][0-9a-fA-F]$" /proc/cpuinfo; then
- return 0
- elif grep -q "^Revision\s*:\s*[ 123][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]0[0-36][0-9a-fA-F]$" /proc/cpuinfo ; then
- return 0
- else
- return 1
- fi
-}
-
-is_pitwo() {
- grep -q "^Revision\s*:\s*[ 123][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]04[0-9a-fA-F]$" /proc/cpuinfo
- return $?
-}
-
-is_pizero() {
- grep -q "^Revision\s*:\s*[ 123][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]0[9cC][0-9a-fA-F]$" /proc/cpuinfo
- return $?
-}
-
-is_pifour() {
- grep -q "^Revision\s*:\s*[ 123][0-9a-fA-F][0-9a-fA-F]3[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]$" /proc/cpuinfo
- return $?
-}
-
-get_pi_type() {
- if is_pione; then
- echo 1
- elif is_pitwo; then
- echo 2
- else
- echo 0
- fi
-}
-
-is_live() {
- grep -q "boot=live" $CMDLINE
- return $?
-}
-
-is_ssh() {
- if pstree -p | egrep --quiet --extended-regexp ".*sshd.*\($$\)"; then
- return 0
- else
- return 1
- fi
-}
-
-is_fkms() {
- if grep -s -q okay /proc/device-tree/soc/v3d@7ec00000/status \
- /proc/device-tree/soc/firmwarekms@7e600000/status \
- /proc/device-tree/v3dbus/v3d@7ec04000/status; then
- return 0
- else
- return 1
- fi
-}
-
-is_pulseaudio() {
- PS=$(ps ax)
- echo "$PS" | grep -q pulseaudio
- return $?
-}
-
-has_analog() {
- if [ $(get_leds) -eq -1 ] ; then
- return 0
- else
- return 1
- fi
-}
-
-is_installed() {
- if [ "$(dpkg -l "$1" 2> /dev/null | tail -n 1 | cut -d ' ' -f 1)" != "ii" ]; then
- return 1
- else
- return 0
- fi
-}
-
-deb_ver () {
- ver=`cat /etc/debian_version | cut -d . -f 1`
- echo $ver
-}
-
-calc_wt_size() {
- # NOTE: it's tempting to redirect stderr to /dev/null, so supress error
- # output from tput. However in this case, tput detects neither stdout or
- # stderr is a tty and so only gives default 80, 24 values
- WT_HEIGHT=18
- WT_WIDTH=$(tput cols)
-
- if [ -z "$WT_WIDTH" ] || [ "$WT_WIDTH" -lt 60 ]; then
- WT_WIDTH=80
- fi
- if [ "$WT_WIDTH" -gt 178 ]; then
- WT_WIDTH=120
- fi
- WT_MENU_HEIGHT=$(($WT_HEIGHT-7))
-}
-
-do_change_pass() {
- whiptail --msgbox "You will now be asked to enter a new password for the $USER user" 20 60 1
- passwd $USER &&
- whiptail --msgbox "Password changed successfully" 20 60 1
-}
-
-do_configure_keyboard() {
- printf "Reloading keymap. This may take a short while\n"
- if [ "$INTERACTIVE" = True ]; then
- dpkg-reconfigure keyboard-configuration
- else
- local KEYMAP="$1"
- sed -i /etc/default/keyboard -e "s/^XKBLAYOUT.*/XKBLAYOUT=\"$KEYMAP\"/"
- dpkg-reconfigure -f noninteractive keyboard-configuration
- fi
- invoke-rc.d keyboard-setup start
- setsid sh -c 'exec setupcon -k --force <> /dev/tty1 >&0 2>&1'
- udevadm trigger --subsystem-match=input --action=change
- return 0
-}
-
-do_change_locale() {
- dpkg-reconfigure locales && \
- ASK_TO_REBOOT=2 && return 0
-}
-
-do_change_timezone() {
- dpkg-reconfigure tzdata && \
- return 0
-}
-
-get_wifi_country() {
- CODE=${1:-0}
- IFACE="$(list_wlan_interfaces | head -n 1)"
- if [ -z "$IFACE" ]; then
- whiptail --msgbox "No wireless interface found" 20 60
- return 1
- fi
- if ! wpa_cli -i "$IFACE" status > /dev/null 2>&1; then
- whiptail --msgbox "Could not communicate with wpa_supplicant" 20 60
- return 1
- fi
- wpa_cli -i "$IFACE" save_config > /dev/null 2>&1
- COUNTRY="$(wpa_cli -i "$IFACE" get country)"
- if [ "$COUNTRY" = "FAIL" ]; then
- return 1
- fi
- if [ $CODE = 0 ]; then
- echo "$COUNTRY"
- fi
- return 0
-}
-
-do_wifi_country() {
- IFACE="$(list_wlan_interfaces | head -n 1)"
- if [ -z "$IFACE" ]; then
- whiptail --msgbox "No wireless interface found" 20 60
- return 1
- fi
-
- if ! wpa_cli -i "$IFACE" status > /dev/null 2>&1; then
- whiptail --msgbox "Could not communicate with wpa_supplicant" 20 60
- return 1
- fi
-
- oIFS="$IFS"
- value=$(cat /usr/share/zoneinfo/iso3166.tab | tail -n +26 | tr '\t' '/' | tr '\n' '/')
- IFS="/"
- COUNTRY=$(whiptail --menu "Select the country in which the Pi is to be used" 20 60 10 ${value} 3>&1 1>&2 2>&3)
- if [ $? -eq 0 ];then
- wpa_cli -i "$IFACE" set country "$COUNTRY"
- wpa_cli -i "$IFACE" save_config > /dev/null 2>&1
- if iw reg set "$COUNTRY" 2> /dev/null; then
- ASK_TO_REBOOT=1
- fi
- if hash rfkill 2> /dev/null; then
- rfkill unblock wifi
- if is_pi ; then
- for filename in /var/lib/systemd/rfkill/*:wlan ; do
- echo 0 > $filename
- done
- fi
- fi
- whiptail --msgbox "Wireless LAN country set to $COUNTRY" 20 60 1
- fi
- IFS=$oIFS
-}
-
-get_labels_lang() {
- oIFS="$IFS"
- value=$(cat ${birdnetpi_dir}/model/labels_lang.txt | tr ',' ' ' | tr '\n' ' ')
- IFS=" "
- get_lang=$(whiptail --menu "Select the file that corresponds to your language" 20 60 10 ${value} 3>&1 1>&2 2>&3)
- labels_lang=$(awk -F, "/$get_lang/{print \$2}" ${birdnetpi_dir}/model/labels_lang.txt)
- if [ $? -eq 0 ];then
- whiptail --msgbox "Your installation will now use $labels_lang" 20 60 1
- mv ${birdnetpi_dir}/model/labels.txt ${birdnetpi_dir}/model/labels.txt.old
- unzip ${birdnetpi_dir}/model/labels_l18n.zip ${labels_lang} -d ${birdnetpi_dir}/model
- mv ${birdnetpi_dir}/model/${labels_lang} ${birdnetpi_dir}/model/labels.txt
- fi
- IFS=$oIFS
-}
-
-get_ssh() {
- if service ssh status | grep -q inactive; then
- echo 1
- else
- echo 0
- fi
-}
-
-do_ssh() {
- if [ -e /var/log/regen_ssh_keys.log ] && ! grep -q "^finished" /var/log/regen_ssh_keys.log; then
- whiptail --msgbox "Initial ssh key generation still running. Please wait and try again." 20 60 2
- return 1
- fi
- DEFAULT=--defaultno
- if [ $(get_ssh) -eq 0 ]; then
- DEFAULT=
- fi
- whiptail --yesno \
- "Would you like the SSH server to be enabled?\n\nCaution: Default and weak passwords are a security risk when SSH is enabled!" $DEFAULT 20 60 2
- RET=$?
- if [ $RET -eq 0 ]; then
- ssh-keygen -A &&
- update-rc.d ssh enable &&
- invoke-rc.d ssh start &&
- STATUS=enabled
- elif [ $RET -eq 1 ]; then
- update-rc.d ssh disable &&
- invoke-rc.d ssh stop &&
- STATUS=disabled
- else
- return $RET
- fi
- whiptail --msgbox "The SSH server is $STATUS" 20 60 1
-}
-
-get_vnc() {
- if systemctl status vncserver-x11-serviced.service | grep -q -w active; then
- echo 0
- else
- echo 1
- fi
-}
-
-do_config_zram() {
- if [ -e /etc/udev/rules.d/99-zram.rules ]; then
- ## get current swap allocation from /etc/udev/rules.d/99-zram.rules
- size="$(awk -F\" '{print $4}' /etc/udev/rules.d/99-zram.rules)"
- else
- size="4G"
- fi
- new_size=$(whiptail --inputbox "How much memory (G) should the zRAM swap partition have? Choose 1G, 2G, or 4G - 4G recommended" \
- 19 70 -- "$size" 3>&1 1>&2 2>&3)
- if [ $? -eq 0 ];then
- return 0
- ASK_TO_REBOOT=2
- else
- return 1
- fi
-}
-
-do_install_zram() {
- echo "Configuring zram.service"
- touch /etc/modules-load.d/zram.conf
- echo 'zram' > /etc/modules-load.d/zram.conf
- touch /etc/modprobe.d/zram.conf
- echo 'options zram num_devices=1' > /etc/modprobe.d/zram.conf
- touch /etc/udev/rules.d/99-zram.rules
- echo "KERNEL==\"zram0\", ATTR{disksize}=\"${new_size}\",TAG+=\"systemd\"" \
- > /etc/udev/rules.d/99-zram.rules
- touch /etc/systemd/system/zram.service
- echo "Installing zram.service"
- cat << EOF > /etc/systemd/system/zram.service
-[Unit]
-Description=Swap with zram
-After=multi-user.target
-
-[Service]
-Type=oneshot
-RemainAfterExit=true
-ExecStartPre=/sbin/mkswap /dev/zram0
-ExecStart=/sbin/swapon /dev/zram0
-ExecStop=/sbin/swapoff /dev/zram0
-
-[Install]
-WantedBy=multi-user.target
-EOF
- systemctl enable zram
- if [ $? -eq 0 ];then
- return 0
- ASK_TO_REBOOT=2
- else
- return 1
- fi
-}
-
-do_zram_menu() {
- whiptail --yesno "Would like to enable the zram swapping kernel module?" --defaultno 20 60 2
- RET=$?
- if [ $RET -eq 0 ]; then
- do_config_zram
- do_install_zram
- STATUS=enabled
- elif [ $RET -eq 1 ]; then
- if [ -e /etc/udev/rules.d/99-zram.rules ];then
- systemctl disable --now zram
- fi
- STATUS=disabled
- fi
- whiptail --msgbox "ZRAM swapping is $STATUS" 20 60 1
- return $RET
-}
-
-do_vnc() {
- DEFAULT=--defaultno
- if [ $(get_vnc) -eq 0 ]; then
- DEFAULT=
- fi
- whiptail --yesno "Would you like the VNC Server to be enabled?" $DEFAULT 20 60 2
- RET=$?
- if [ $RET -eq 0 ]; then
- if is_installed realvnc-vnc-server || apt-get install realvnc-vnc-server; then
- systemctl enable vncserver-x11-serviced.service &&
- systemctl start vncserver-x11-serviced.service &&
- STATUS=enabled
- else
- return 1
- fi
- elif [ $RET -eq 1 ]; then
- if is_installed realvnc-vnc-server; then
- systemctl disable vncserver-x11-serviced.service
- systemctl stop vncserver-x11-serviced.service
- fi
- STATUS=disabled
- else
- return $RET
- fi
- whiptail --msgbox "The VNC Server is $STATUS" 20 60 1
-}
-
-do_audio() {
- if is_pulseaudio ; then
- oIFS="$IFS"
- list=$(sudo -u $SUDO_USER XDG_RUNTIME_DIR=/run/user/$SUDO_UID pacmd list-sources | grep -B1 -e 'alsa.card_name' -e 'name.*input' | grep -A4 index | sed -e s/*//g | sed s/^[' '\\t]*//g | grep -e index -e card_name | sed s/'index: '//g | sed s/'alsa.card_name = '//g | sed s/\"//g | tr '\n' '\/')
- if ! [ -z "$list" ] ; then
- IFS="/"
- AUDIO_IN=$(whiptail --menu "Choose the audio input" 20 60 10 ${list} 3>&1 1>&2 2>&3)
- return 0
- else
- whiptail --msgbox "No internal audio devices found" 20 60 1
- return 1
- fi
- if [ $? -eq 0 ]; then
- sudo -u $SUDO_USER XDG_RUNTIME_DIR=/run/user/$SUDO_UID pactl set-default-source "$AUDIO_IN"
- fi
- IFS=$oIFS
- fi
- sudo -u $SUDO_USER pulseaudio -k
-}
-
-list_wlan_interfaces() {
- for dir in /sys/class/net/*/wireless; do
- if [ -d "$dir" ]; then
- basename "$(dirname "$dir")"
- fi
- done
-}
-
-do_wifi_ssid_passphrase() {
- RET=0
- IFACE_LIST="$(list_wlan_interfaces)"
- IFACE="$(echo "$IFACE_LIST" | head -n 1)"
-
- if [ -z "$IFACE" ]; then
- whiptail --msgbox "No wireless interface found" 20 60
- return 1
- fi
-
- if ! wpa_cli -i "$IFACE" status > /dev/null 2>&1; then
- whiptail --msgbox "Could not communicate with wpa_supplicant" 20 60
- return 1
- fi
-
- if [ -z "$(get_wifi_country)" ]; then
- do_wifi_country
- fi
-
- SSID="$1"
- while [ -z "$SSID" ] ; do
- SSID=$(whiptail --inputbox "Please enter SSID" 20 60 3>&1 1>&2 2>&3)
- if [ $? -ne 0 ]; then
- return 0
- elif [ -z "$SSID" ]; then
- whiptail --msgbox "SSID cannot be empty. Please try again." 20 60
- fi
- done
-
- PASSPHRASE="$2"
- PASSPHRASE=$(whiptail --passwordbox "Please enter passphrase. Leave it empty if none." 20 60 3>&1 1>&2 2>&3)
- if [ $? -ne 0 ]; then
- return 0
- else
- return 1
- fi
-
- # Escape special characters for embedding in regex below
- local ssid="$(echo "$SSID" \
- | sed 's;\\;\\\\;g' \
- | sed -e 's;\.;\\\.;g' \
- -e 's;\*;\\\*;g' \
- -e 's;\+;\\\+;g' \
- -e 's;\?;\\\?;g' \
- -e 's;\^;\\\^;g' \
- -e 's;\$;\\\$;g' \
- -e 's;\/;\\\/;g' \
- -e 's;\[;\\\[;g' \
- -e 's;\];\\\];g' \
- -e 's;{;\\{;g' \
- -e 's;};\\};g' \
- -e 's;(;\\(;g' \
- -e 's;);\\);g' \
- -e 's;";\\\\\";g')"
-
- wpa_cli -i "$IFACE" list_networks \
- | tail -n +2 | cut -f -2 | grep -P "\t$ssid$" | cut -f1 \
- | while read ID; do
- wpa_cli -i "$IFACE" remove_network "$ID" > /dev/null 2>&1
- done
-
- ID="$(wpa_cli -i "$IFACE" add_network)"
- wpa_cli -i "$IFACE" set_network "$ID" ssid "\"$SSID\"" 2>&1 | grep -q "OK"
- RET=$((RET + $?))
-
- if [ -z "$PASSPHRASE" ]; then
- wpa_cli -i "$IFACE" set_network "$ID" key_mgmt NONE 2>&1 | grep -q "OK"
- RET=$((RET + $?))
- else
- wpa_cli -i "$IFACE" set_network "$ID" psk "\"$PASSPHRASE\"" 2>&1 | grep -q "OK"
- RET=$((RET + $?))
- fi
-
- if [ $RET -eq 0 ]; then
- wpa_cli -i "$IFACE" enable_network "$ID" > /dev/null 2>&1
- else
- wpa_cli -i "$IFACE" remove_network "$ID" > /dev/null 2>&1
- whiptail --msgbox "Failed to set SSID or passphrase" 20 60
- fi
- wpa_cli -i "$IFACE" save_config > /dev/null 2>&1
-
- echo "$IFACE_LIST" | while read IFACE; do
- wpa_cli -i "$IFACE" reconfigure > /dev/null 2>&1
- done
-
- return $RET
-}
-
-do_reget_birdnetpi_urls() {
- birdnetpi_url=$(whiptail --inputbox "Put your domain here. Example: \"https://birdnetpi.pmcgui.xyz\"." \
- 19 70 -- "https://" 3>&1 1>&2 2>&3) extractionlog_url=$(whiptail --inputbox "Put your domain here. Example: \"https://extractionlog.pmcgui.xyz\"." 19 70 -- "https://" 3>&1 1>&2 2>&3) birdnetlog_url=$(whiptail --inputbox "Put your domain here. Example: \"https://birdnetlog.pmcgui.xyz\"." 19 70 -- "https://" 3>&1 1>&2 2>&3) ${birdnetpi_dir}/scripts/rewrite_config.sh
- if [ $? -eq 0 ];then
- return 0
- else
- return 1
- fi
-}
-
-do_reget_db_pwd() {
- db_pwd=$(whiptail --inputbox "Please set the password the 'birder' user will use to access the database." \
- 19 70 3>&1 1>&2 2>&3) ${birdnetpi_dir}/scripts/rewrite_config.sh
- if [ $? -eq 0 ];then
- return 0
- ASK_TO_REBOOT=2
- else
- return 1
- fi
-}
-
-do_reget_birdweather_id() {
- birdweather_id=$(whiptail --inputbox "Input your BirdWeather ID" \
- 19 70 3>&1 1>&2 2>&3) ${birdnetpi_dir}/scripts/rewrite_config.sh
- if [ $? -eq 0 ];then
- return 0
- ASK_TO_REBOOT=2
- else
- return 1
- fi
-}
-
-
-do_reget_caddy_pwd() {
- caddy_pwd=$(whiptail --inputbox "Please set the password for the web interface." \
- 19 70 3>&1 1>&2 2>&3) ${birdnetpi_dir}/scripts/rewrite_config.sh
- if [ $? -eq 0 ];then
- return 0
- ASK_TO_REBOOT=2
- else
- return 1
- fi
-}
-
-
-do_reget_lon() {
- lon="$(curl -s4 ifconfig.co/json | awk '/lon/ {print $2}' | tr -d ',')"
- new_lon=$(whiptail --inputbox "Please set the longitude where recordings will take place." \
- 19 70 -- "$lon" 3>&1 1>&2 2>&3) ${birdnetpi_dir}/scripts/rewrite_config.sh
- if [ $? -eq 0 ];then
- return 0
- ASK_TO_REBOOT=2
- else
- return 1
- fi
-}
-
-do_reget_lat() {
- lat="$(curl -s4 ifconfig.co/json | awk '/lat/ {print $2}' | tr -d ',')"
- new_lat=$(whiptail --inputbox "Please set the latitude where recordings will take place." \
- 19 70 -- "$lat" 3>&1 1>&2 2>&3) ${birdnetpi_dir}/scripts/rewrite_config.sh
- if [ $? -eq 0 ];then
- return 0
- ASK_TO_REBOOT=2
- else
- return 1
- fi
-}
-
-do_get_confidence() {
- confidence="$(awk -F= '/CONFIDENCE=/ {print $2}' ${birdnetpi_dir}/birdnet.conf)"
- new_confidence=$(whiptail --inputbox "Please set the minimum confidence score BirdNET-Lite should use." \
- 19 70 -- "$confidence" 3>&1 1>&2 2>&3) ${birdnetpi_dir}/scripts/rewrite_config.sh
- if [ $? -eq 0 ];then
- return 0
- ASK_TO_REBOOT=2
- else
- return 1
- fi
-}
-
-
-do_get_overlap() {
- overlap="$(awk -F= '/OVERLAP=/ {print $2}' ${birdnetpi_dir}/birdnet.conf)"
- new_overlap=$(whiptail --inputbox "Please set the overlap BirdNET-Lite should use." \
- 19 70 -- "$overlap" 3>&1 1>&2 2>&3) ${birdnetpi_dir}/scripts/rewrite_config.sh
- if [ $? -eq 0 ];then
- return 0
- ASK_TO_REBOOT=2
- else
- return 1
- fi
-}
-
-
-do_get_sensitivity() {
- sensitivity="$(awk -F= '/SENSITIVITY=/ {print $2}' ${birdnetpi_dir}/birdnet.conf)"
- new_sensitivity=$(whiptail --inputbox "Please set the simoid sensitivty BirdNET-Lite should use." \
- 19 70 -- "$sensitivity" 3>&1 1>&2 2>&3) ${birdnetpi_dir}/scripts/rewrite_config.sh
- if [ $? -eq 0 ];then
- return 0
- ASK_TO_REBOOT=2
- else
- return 1
- fi
-}
-
-do_get_birdnetlog_url() {
- birdnetlog_url=$(whiptail --inputbox "Put your domain here. Example: \"https://birdnetlog.pmcgui.xyz\"." \
- 19 70 -- "https://" 3>&1 1>&2 2>&3) ${birdnetpi_dir}/scripts/write_config.sh
- if [ $? -eq 0 ];then
- return 0
- ASK_TO_REBOOT=2
- else
- return 1
- fi
-}
-
-do_get_extractionlog_url() {
- extractionlog_url=$(whiptail --inputbox "Put your domain here. Example: \"https://extractionlog.pmcgui.xyz\"." \
- 19 70 -- "https://" 3>&1 1>&2 2>&3) ${birdnetpi_dir}/scripts/write_config.sh
- if [ $? -eq 0 ];then
- return 0
- ASK_TO_REBOOT=2
- else
- return 1
- fi
-}
-
-do_get_birdnetpi_url() {
- birdnetpi_url=$(whiptail --inputbox "Put your domain here. Example: \"https://birdnetpi.pmcgui.xyz\"." \
- 19 70 -- "https://" 3>&1 1>&2 2>&3) ${birdnetpi_dir}/scripts/write_config.sh
- if [ $? -eq 0 ];then
- return 0
- ASK_TO_REBOOT=2
- else
- return 1
- fi
-}
-
-do_get_birdweather_id() {
- birdweather_id=$(whiptail --inputbox "Input your BirdWeather ID" \
- 19 70 3>&1 1>&2 2>&3) ${birdnetpi_dir}/scripts/write_config.sh
- if [ $? -eq 0 ];then
- return 0
- ASK_TO_REBOOT=2
- else
- return 1
- fi
-}
-
-do_get_db_pwd() {
- db_pwd=$(whiptail --inputbox "Please set the password the 'birder' user will use to access the database." \
- 19 70 3>&1 1>&2 2>&3) ${birdnetpi_dir}/scripts/write_config.sh
- if [ $? -eq 0 ];then
- return 0
- ASK_TO_REBOOT=2
- else
- return 1
- fi
-}
-
-do_get_ice_pwd() {
- ice_pwd=$(whiptail --inputbox "Please set the password for the live stream." \
- 19 70 3>&1 1>&2 2>&3) ${birdnetpi_dir}/scripts/write_config.sh
- if [ $? -eq 0 ];then
- return 0
- ASK_TO_REBOOT=2
- else
- return 1
- fi
-}
-
-do_get_caddy_pwd() {
- caddy_pwd=$(whiptail --inputbox "Please set the password for the web interface." \
- 19 70 3>&1 1>&2 2>&3) ${birdnetpi_dir}/scripts/write_config.sh
- if [ $? -eq 0 ];then
- return 0
- ASK_TO_REBOOT=2
- else
- return 1
- fi
-}
-
-
-do_get_lon() {
- lon="$(curl -s4 ifconfig.co/json | awk '/lon/ {print $2}' | tr -d ',')"
- new_lon=$(whiptail --inputbox "Please set the longitude where recordings will take place." \
- 19 70 -- "$lon" 3>&1 1>&2 2>&3) ${birdnetpi_dir}/scripts/write_config.sh
- if [ $? -eq 0 ];then
- return 0
- ASK_TO_REBOOT=2
- else
- return 1
- fi
-}
-
-do_get_lat() {
- lat="$(curl -s4 ifconfig.co/json | awk '/lat/ {print $2}' | tr -d ',')"
- new_lat=$(whiptail --inputbox "Please set the latitude where recordings will take place." \
- 19 70 -- "$lat" 3>&1 1>&2 2>&3) ${birdnetpi_dir}/scripts/write_config.sh
- if [ $? -eq 0 ];then
- return 0
- ASK_TO_REBOOT=2
- else
- return 1
- fi
-}
-
-do_update_os() {
- apt update && apt -y full-upgrade && \
- ASK_TO_REBOOT=1
-}
-
-do_update_birdnet() {
- sudo -E -upi ${birdnetpi_dir}/scripts/update_birdnet.sh
-}
-
-do_install_birdnet() {
- sudo -E -upi ${birdnetpi_dir}/Birders_Guide_Installer.sh && \
- ASK_TO_REBOOT=1
-}
-
-insist_on_reboot() {
- if [ $ASK_TO_REBOOT -eq 2 ]; then
- whiptail --yesno "You really should reboot. Do that now?" 20 60 2
- if [ $? -eq 0 ]; then # yes
- sync
- reboot
- fi
- fi
-}
-
-do_finish() {
- if [ $ASK_TO_REBOOT -eq 1 ]; then
- whiptail --yesno "Would you like to reboot now?" 20 60 2
- if [ $? -eq 0 ]; then # yes
- sync
- reboot
- fi
- elif [ $ASK_TO_REBOOT -eq 2 ]; then
- whiptail --yesno "You really should reboot. Do that now?" 20 60 2
- if [ $? -eq 0 ]; then # yes
- sync
- reboot
- fi
- fi
- exit 0
-}
-
-# Everything else needs to be run as root
-if [ $(id -u) -ne 0 ]; then
- printf "Script must be run as root. Try 'sudo birdnet-pi-config'\n"
- exit 1
-fi
-
-do_advanced_reconfig_menu() {
- MENU=9
- while [ $MENU -eq 9 ];do
- if is_pi ; then
- FUN=$(whiptail --title "BirdNET-Pi Software Configuration Tool (birdnet-pi-config)" --menu "BirdNET-Pi Configuration Options" $WT_HEIGHT $WT_WIDTH $WT_MENU_HEIGHT --cancel-button Back --ok-button Select \
- "Sensitivity" "Set the sigmoid sensitivity" \
- "Confidence" "Set the minimum confidence score required for a detection" \
- "Overlap" "Set the analysis overlap in seconds" \
- "BirdNET-Pi URLs" "Set the URLs your installation should use" \
- 3>&1 1>&2 2>&3)
- else
- exit
- fi
- RET=$?
- if [ $RET -eq 1 ]; then
- return 0
- MENU=0
- elif [ $RET -eq 0 ]; then
- case "$FUN" in
- Sens*) do_get_sensitivity;;
- Confi*) do_get_confidence;;
- Overlap*) do_get_overlap;;
- Bird*) do_reget_birdnetpi_urls;;
- *) whiptail --msgbox "Programmer error: unrecognized option" 20 60 1 ;;
- esac || whiptail --msgbox "There was an error running option $FUN" 20 60 1
- fi
- done
-}
-
-do_interface_menu() {
- MENU=6
- while [ $MENU -eq 6 ];do
- if is_pi ; then
- FUN=$(whiptail --title "BirdNET-Pi Software Configuration Tool (birdnet-pi-config)" --menu "Interfacing Options" $WT_HEIGHT $WT_WIDTH $WT_MENU_HEIGHT --cancel-button Back --ok-button Select \
- "SSH" "Enable/disable remote command line access using SSH" \
- "VNC" "Enable/disable graphical remote access using RealVNC" \
- 3>&1 1>&2 2>&3)
- else
- exit
- fi
- RET=$?
- if [ $RET -eq 1 ]; then
- return 0
- MENU=0
- elif [ $RET -eq 0 ]; then
- case "$FUN" in
- SSH*) do_ssh ;;
- VNC*) do_vnc ;;
- *) whiptail --msgbox "Programmer error: unrecognized option" 20 60 1 ;;
- esac || whiptail --msgbox "There was an error running option $FUN" 20 60 1
- fi
- done
-}
-
-do_advanced_config_menu() {
- MENU=5
- while [ $MENU -eq 5 ];do
- if is_pi ; then
- FUN=$(whiptail --title "BirdNET-Pi Software Configuration Tool (birdnet-pi-config)" --menu "BirdNET-Pi Configuration Options" $WT_HEIGHT $WT_WIDTH $WT_MENU_HEIGHT --cancel-button Back --ok-button Select \
- "Sensitivity" "Set the sigmoid sensitivity" \
- "Confidence" "Set the minimum confidence score required for a detection" \
- "Overlap" "Set the analysis overlap in seconds" \
- "BirdNET-Pi URLs" "Set the URLs your installation should use" \
- 3>&1 1>&2 2>&3)
- else
- exit
- fi
- RET=$?
- if [ $RET -eq 1 ]; then
- return 0
- MENU=0
- elif [ $RET -eq 0 ]; then
- case "$FUN" in
- Sens*) do_get_sensitivity;;
- Confi*) do_get_confidence;;
- Overlap*) do_get_overlap;;
- Bird*) do_get_birdnetpi_url; do_get_birdnetlog_url; do_get_extractionlog_url;;
- *) whiptail --msgbox "Programmer error: unrecognized option" 20 60 1 ;;
- esac || whiptail --msgbox "There was an error running option $FUN" 20 60 1
- fi
- done
-}
-
-do_system_menu() {
- MENU=4
- while [ $MENU -eq 4 ];do
- if is_pi ; then
- FUN=$(whiptail --title "BirdNET-Pi Software Configuration Tool (birdnet-pi-config)" --menu "System Options" $WT_HEIGHT $WT_WIDTH $WT_MENU_HEIGHT --cancel-button Back --ok-button Select \
- "Password" "Change password for the '$USER' user" \
- "Audio" "Select audio device you'd like BirdNET-Pi to use" \
- "Wireless LAN" "Enter SSID and passphrase" \
- "Update the OS" "Update the underlying operating system" \
- "Interface Options" "Enable/Disable SSH and VNC" \
- "Configure zRAM" "Enable/Disable zRAM" \
- "Timezone" "Configure time zone" \
- "Keyboard" "Set keyboard layout to match your keyboard" \
- "WLAN Country" "Set legal wireless channels for your country" \
- 3>&1 1>&2 2>&3)
- else
- exit
- fi
- RET=$?
- if [ $RET -eq 1 ]; then
- return 0
- MENU=0
- elif [ $RET -eq 0 ]; then
- case "$FUN" in
- Password*) do_change_pass ;;
- Audio*) do_audio ;;
- Wireless*) do_wifi_ssid_passphrase ;;
- Update*) do_update_os ;;
- Interface*) do_interface_menu ;;
- Configure*) do_zram_menu ;;
- Time*) do_change_timezone; insist_on_reboot ;;
- Key*) do_configure_keyboard ;;
- WLAN*) do_wifi_country ;;
- *) whiptail --msgbox "Programmer error: unrecognized option" 20 60 1 ;;
- esac || whiptail --msgbox "There was an error running option $FUN" 20 60 1
- fi
- done
-}
-
-
-do_reconfig_birdnet_menu() {
- MENU=3
- while [ $MENU -eq 3 ];do
- if is_pi ; then
- FUN=$(whiptail --title "BirdNET-Pi Software Configuration Tool (birdnet-pi-config)" --menu "BirdNET-Pi Re-configuration Options" $WT_HEIGHT $WT_WIDTH $WT_MENU_HEIGHT --cancel-button Back --ok-button Select \
- "Latitude " "Set the latitude your system should use" \
- "Longitude" "Set the longitude your system should use" \
- "Caddy Password" "Set the web interface password" \
- "Database Password" "Set the password BirdNET-Pi will use to access the DB" \
- "BirdWeather ID" "Input your BirdWeather ID if you have one" \
- "Advanced Settings" "Sensitivity, Overlap, Confidence, URLs" \
- 3>&1 1>&2 2>&3)
- else
- exit
- fi
- RET=$?
- if [ $RET -eq 1 ]; then
- return 0
- MENU=0
- elif [ $RET -eq 0 ]; then
- case "$FUN" in
- Lat*) do_reget_lat;;
- Lon*) do_reget_lon;;
- Cad*) do_reget_caddy_pwd;;
- Data*) do_reget_db_pwd;;
- Bird*) do_reget_birdweather_id;;
- Advanced*) do_advanced_reconfig_menu;;
- *) whiptail --msgbox "Programmer error: unrecognized option" 20 60 1 ;;
- esac || whiptail --msgbox "There was an error running option $FUN" 20 60 1
- fi
- done
-}
-
-do_config_birdnet_menu() {
- MENU=2
- while [ $MENU -eq 2 ];do
- if is_pi ; then
- FUN=$(whiptail --title "BirdNET-Pi Software Configuration Tool (birdnet-pi-config)" --menu "BirdNET-Pi Configuration Options" $WT_HEIGHT $WT_WIDTH $WT_MENU_HEIGHT --cancel-button Back --ok-button Select \
- "Latitude " "Set the latitude your system should use" \
- "Longitude" "Set the longitude your system should use" \
- "Caddy Password" "Set the web interface password" \
- "IceCast2 Password" "Set the IceCast2 password" \
- "Database Password" "Set the password BirdNET-Pi will use to access the DB" \
- "BirdWeather ID" "Input your BirdWeather ID if you have one" \
- "Set Custom URLS" "Designate custom URLs for the web services if you've set that up" \
- 3>&1 1>&2 2>&3)
- else
- exit
- fi
- RET=$?
- if [ $RET -eq 1 ]; then
- return 0
- MENU=0
- elif [ $RET -eq 0 ]; then
- case "$FUN" in
- Lat*) do_get_lat;;
- Lon*) do_get_lon;;
- Cad*) do_get_caddy_pwd;;
- Ice*) do_get_ice_pwd;;
- Data*) do_get_db_pwd;;
- Bird*) do_get_birdweather_id;;
- Set*) do_get_birdnetpi_url; do_get_birdnetlog_url; do_get_extractionlog_url;;
- *) whiptail --msgbox "Programmer error: unrecognized option" 20 60 1 ;;
- esac || whiptail --msgbox "There was an error running option $FUN" 20 60 1
- fi
- done
-}
-
-do_internationalisation_menu() {
- MENU=1
- while [ $MENU -eq 1 ];do
- FUN=$(whiptail --title "BirdNET-Pi Software Configuration Tool (birdnet-pi-config)" --menu "Localisation Options" $WT_HEIGHT $WT_WIDTH $WT_MENU_HEIGHT --cancel-button Back --ok-button Select \
- "System Locale" "Configure the system language and regional settings" \
- "labels.txt" "Set the language to use for species detection" \
- "Time Zone" "Set the Time Zone" \
- 3>&1 1>&2 2>&3)
- RET=$?
- if [ $RET -eq 1 ]; then
- return 0
- MENU=0
- elif [ $RET -eq 0 ]; then
- case "$FUN" in
- System*) do_change_locale;;
- label*) get_labels_lang;;
- Time*) do_change_timezone;;
- *) whiptail --msgbox "Programmer error: unrecognized option" 20 60 1 ;;
- esac || whiptail --msgbox "There was an error running option $FUN" 20 60 1
- fi
- done
-}
-
-
-
-#
-# Interactive use loop
-#
-[ -e $CONFIG ] || touch $CONFIG
-calc_wt_size
-while [ "$USER" = "root" ] || [ -z "$USER" ]; do
- if ! USER=$(whiptail --inputbox "birdnet-pi-config could not determine the default user.\\n\\nWhat user should these settings apply to?" 20 60 pi 3>&1 1>&2 2>&3); then
- return 0
- fi
-done
-while true; do
- FUN=$(whiptail --title "BirdNET-Pi Software Configuration Tool (birdnet-pi-config)" --backtitle "$(cat /proc/device-tree/model)" --menu "Setup Options" $WT_HEIGHT $WT_WIDTH $WT_MENU_HEIGHT --cancel-button Finish --ok-button Select \
- "Step 1" "Configure language and timezone" \
- "Step 2" "Configure BirdNET-Pi before installation" \
- "Step 3" "Install BirdNET-Pi" \
- "Step 4" "Reconfigure BirdNET-Pi AFTER installation" \
- "Step 5" "Update BirdNET-Pi (run this if you changed URLs)" \
- "System Options" "Configure system settings" \
- 3>&1 1>&2 2>&3)
- RET=$?
- if [ $RET -eq 1 ]; then
- do_finish
- elif [ $RET -eq 0 ]; then
- case "$FUN" in
- *1) do_internationalisation_menu ;;
- *2) do_config_birdnet_menu ;;
- *3) do_install_birdnet;;
- *4) do_reconfig_birdnet_menu ;;
- *5) do_update_birdnet;;
- Sys*) do_system_menu ;;
- *) whiptail --msgbox "Programmer error: unrecognized option" 20 60 1 ;;
- esac || whiptail --msgbox "There was an error running option $FUN" 20 60 1
- fi
-done
diff --git a/scripts/birdnet_analysis.sh b/scripts/birdnet_analysis.sh
index e58a808..acc0a47 100755
--- a/scripts/birdnet_analysis.sh
+++ b/scripts/birdnet_analysis.sh
@@ -95,9 +95,8 @@ run_analysis() {
WEEK="$(echo "${WEEK_OF_YEAR} + 4" |bc -l)"
fi
- cd ${HOME}/BirdNET-Pi/scripts || exit 1
for i in "${files[@]}";do
- echo "${1}/${i}" > ../analyzing_now.txt
+ echo "${1}/${i}" > /home/pi/BirdNET-Pi/analyzing_now.txt
[ -z ${RECORDING_LENGTH} ] && RECORDING_LENGTH=15
[ ${RECORDING_LENGTH} == "60" ] && RECORDING_LENGTH=01:00
FILE_LENGTH="$(ffmpeg -i ${1}/${i} 2>&1 | awk -F. '/Duration/ {print $1}' | cut -d':' -f3-4)"
@@ -131,7 +130,7 @@ run_analysis() {
done
fi
if [ -f ${1}/${i} ] && [ ! -f ${INCLUDE_LIST} ] && [ ! -f ${EXCLUDE_LIST} ] && [ -z $BIRDWEATHER_ID ];then
- echo "python3 analyze.py \
+ echo "analyze.py \
--i "${1}/${i}" \
--o "${1}/${i}.csv" \
--lat "${LATITUDE}" \
@@ -140,7 +139,7 @@ run_analysis() {
--overlap "${OVERLAP}" \
--sensitivity "${SENSITIVITY}" \
--min_conf "${CONFIDENCE}""
- "${VENV}"/bin/python analyze.py \
+ analyze.py \
--i "${1}/${i}" \
--o "${1}/${i}.csv" \
--lat "${LATITUDE}" \
@@ -150,7 +149,7 @@ run_analysis() {
--sensitivity "${SENSITIVITY}" \
--min_conf "${CONFIDENCE}"
elif [ -f ${1}/${i} ] && [ -f ${INCLUDELIST} ] && [ ! -f ${EXCLUDE_LIST} ] && [ -z $BIRDWEATHER_ID ];then
- echo "python3 analyze.py \
+ echo "analyze.py \
--i "${1}/${i}" \
--o "${1}/${i}.csv" \
--lat "${LATITUDE}" \
@@ -160,18 +159,18 @@ run_analysis() {
--sensitivity "${SENSITIVITY}" \
--min_conf "${CONFIDENCE}" \
--include_list "${INCLUDE_LIST}""
- "${VENV}"/bin/python analyze.py \
+ analyze.py \
--i "${1}/${i}" \
--o "${1}/${i}.csv" \
--lat "${LATITUDE}" \
--lon "${LONGITUDE}" \
--week "${WEEK}" \
--overlap "${OVERLAP}" \
- --sensitivity "${SENSITIVITY}" \
+ --sensitivity "${SENSITIVITY}" \
--min_conf "${CONFIDENCE}" \
- --include_list "${INCLUDE_LIST}"
+ --include_list "${INCLUDE_LIST}"
elif [ -f ${1}/${i} ] && [ ! -f ${INCLUDE_LIST} ] && [ -f ${EXCLUDE_LIST} ] && [ -z $BIRDWEATHER_ID ];then
- echo "python3 analyze.py \
+ echo "analyze.py \
--i "${1}/${i}" \
--o "${1}/${i}.csv" \
--lat "${LATITUDE}" \
@@ -181,18 +180,18 @@ run_analysis() {
--sensitivity "${SENSITIVITY}" \
--min_conf "${CONFIDENCE}" \
--exclude_list "${EXCLUDE_LIST}""
- "${VENV}"/bin/python analyze.py \
+ analyze.py \
--i "${1}/${i}" \
--o "${1}/${i}.csv" \
--lat "${LATITUDE}" \
--lon "${LONGITUDE}" \
--week "${WEEK}" \
--overlap "${OVERLAP}" \
- --sensitivity "${SENSITIVITY}" \
+ --sensitivity "${SENSITIVITY}" \
--min_conf "${CONFIDENCE}" \
- --exclude_list "${EXCLUDE_LIST}"
+ --exclude_list "${EXCLUDE_LIST}"
elif [ -f ${1}/${i} ] && [ -f ${INCLUDE_LIST} ] && [ -f ${EXCLUDE_LIST} ] && [ -z $BIRDWEATHER_ID ];then
- echo "python3 analyze.py \
+ echo "analyze.py \
--i "${1}/${i}" \
--o "${1}/${i}.csv" \
--lat "${LATITUDE}" \
@@ -203,19 +202,19 @@ run_analysis() {
--min_conf "${CONFIDENCE}" \
--include_list "${INCLUDE_LIST}" \
--exclude_list "${EXCLUDE_LIST}""
- "${VENV}"/bin/python analyze.py \
+ analyze.py \
--i "${1}/${i}" \
--o "${1}/${i}.csv" \
--lat "${LATITUDE}" \
--lon "${LONGITUDE}" \
--week "${WEEK}" \
--overlap "${OVERLAP}" \
- --sensitivity "${SENSITIVITY}" \
+ --sensitivity "${SENSITIVITY}" \
--min_conf "${CONFIDENCE}" \
--include_list "${INCLUDE_LIST}" \
--exclude_list "${EXCLUDE_LIST}"
elif [ -f ${1}/${i} ] && [ ! -f ${INCLUDE_LIST} ] && [ ! -f ${EXCLUDE_LIST} ] && [ ! -z $BIRDWEATHER_ID ];then
- echo "python3 analyze.py \
+ echo "analyze.py \
--i "${1}/${i}" \
--o "${1}/${i}.csv" \
--lat "${LATITUDE}" \
@@ -225,18 +224,18 @@ run_analysis() {
--sensitivity "${SENSITIVITY}" \
--min_conf "${CONFIDENCE}" \
--birdweather_id "IN_USE""
- "${VENV}"/bin/python analyze.py \
+ analyze.py \
--i "${1}/${i}" \
--o "${1}/${i}.csv" \
--lat "${LATITUDE}" \
--lon "${LONGITUDE}" \
--week "${WEEK}" \
--overlap "${OVERLAP}" \
- --sensitivity "${SENSITIVITY}" \
+ --sensitivity "${SENSITIVITY}" \
--min_conf "${CONFIDENCE}" \
--birdweather_id "${BIRDWEATHER_ID}"
elif [ -f ${1}/${i} ] && [ -f ${INCLUDE_LIST} ] && [ ! -f ${EXCLUDE_LIST} ] && [ ! -z $BIRDWEATHER_ID ];then
- echo "python3 analyze.py \
+ echo "analyze.py \
--i "${1}/${i}" \
--o "${1}/${i}.csv" \
--lat "${LATITUDE}" \
@@ -247,19 +246,19 @@ run_analysis() {
--min_conf "${CONFIDENCE}" \
--include_list "${INCLUDE_LIST}" \
--birdweather_id "IN_USE""
- "${VENV}"/bin/python analyze.py \
+ analyze.py \
--i "${1}/${i}" \
--o "${1}/${i}.csv" \
--lat "${LATITUDE}" \
--lon "${LONGITUDE}" \
--week "${WEEK}" \
--overlap "${OVERLAP}" \
- --sensitivity "${SENSITIVITY}" \
+ --sensitivity "${SENSITIVITY}" \
--min_conf "${CONFIDENCE}" \
--include_list "${INCLUDE_LIST}" \
--birdweather_id "${BIRDWEATHER_ID}"
elif [ -f ${1}/${i} ] && [ ! -f ${INCLUDE_LIST} ] && [ -f ${EXCLUDE_LIST} ] && [ ! -z $BIRDWEATHER_ID ];then
- echo "python3 analyze.py \
+ echo "analyze.py \
--i "${1}/${i}" \
--o "${1}/${i}.csv" \
--lat "${LATITUDE}" \
@@ -270,19 +269,19 @@ run_analysis() {
--min_conf "${CONFIDENCE}" \
--exclude_list "${EXCLUDE_LIST}" \
--birdweather_id "IN_USE""
- "${VENV}"/bin/python analyze.py \
+ analyze.py \
--i "${1}/${i}" \
--o "${1}/${i}.csv" \
--lat "${LATITUDE}" \
--lon "${LONGITUDE}" \
--week "${WEEK}" \
--overlap "${OVERLAP}" \
- --sensitivity "${SENSITIVITY}" \
+ --sensitivity "${SENSITIVITY}" \
--min_conf "${CONFIDENCE}" \
--exclude_list "${EXCLUDE_LIST}" \
--birdweather_id "${BIRDWEATHER_ID}"
elif [ -f ${1}/${i} ] && [ -f ${INCLUDE_LIST} ] && [ -f ${EXCLUDE_LIST} ] && [ ! -z $BIRDWEATHER_ID ];then
- echo "python3 analyze.py \
+ echo "analyze.py \
--i "${1}/${i}" \
--o "${1}/${i}.csv" \
--lat "${LATITUDE}" \
@@ -294,14 +293,14 @@ run_analysis() {
--include_list "${INCLUDE_LIST}" \
--exclude_list "${EXCLUDE_LIST}" \
--birdweather_id "IN_USE""
- "${VENV}"/bin/python analyze.py \
+ analyze.py \
--i "${1}/${i}" \
--o "${1}/${i}.csv" \
--lat "${LATITUDE}" \
--lon "${LONGITUDE}" \
--week "${WEEK}" \
--overlap "${OVERLAP}" \
- --sensitivity "${SENSITIVITY}" \
+ --sensitivity "${SENSITIVITY}" \
--min_conf "${CONFIDENCE}" \
--include_list "${INCLUDE_LIST}" \
--exclude_list "${EXCLUDE_LIST}" \
diff --git a/scripts/birdnet_recording.sh b/scripts/birdnet_recording.sh
index 92cc6f0..0798511 100755
--- a/scripts/birdnet_recording.sh
+++ b/scripts/birdnet_recording.sh
@@ -10,6 +10,8 @@ fi
[ -z $RECORDING_LENGTH ] && RECORDING_LENGTH=15
+if ! pulseaudio --check;then pulseaudio --start;fi
+
if pgrep arecord &> /dev/null ;then
echo "Recording"
else
diff --git a/scripts/birdweather_request.php b/scripts/birdweather_request.php
index 9795e9e..7b99ec2 100644
--- a/scripts/birdweather_request.php
+++ b/scripts/birdweather_request.php
@@ -4,7 +4,7 @@ if (file_exists('/home/pi/BirdNET-Pi/thisrun.txt')) {
} elseif (file_exists('/home/pi/BirdNET-Pi/firstrun.ini')) {
$config = parse_ini_file('/home/pi/BirdNET-Pi/firstrun.ini');
}
-$template = file_get_contents("email_template");
+$template = file_get_contents("scripts/email_template");
foreach($config as $key => $value)
{
diff --git a/scripts/clear_all_data.sh b/scripts/clear_all_data.sh
index d4f72c6..cab0dac 100755
--- a/scripts/clear_all_data.sh
+++ b/scripts/clear_all_data.sh
@@ -9,82 +9,42 @@ USER=pi
my_dir=${HOME}/BirdNET-Pi/scripts
echo "Stopping services"
sudo systemctl stop birdnet_recording.service
+sudo systemctl stop birdnet_analysis.service
+sudo systemctl stop birdnet_server.service
echo "Removing all data . . . "
sudo rm -drf "${RECS_DIR}"
sudo rm -f "${IDFILE}"
sudo rm -f $(dirname ${my_dir})/BirdDB.txt
+
echo "Creating necessary directories"
-[ -d ${EXTRACTED} ] || sudo -u ${USER} mkdir -p ${EXTRACTED}
-[ -d ${EXTRACTED}/By_Date ] || sudo -u ${USER} mkdir -p ${EXTRACTED}/By_Date
-[ -d ${EXTRACTED}/By_Common_Name ] || sudo -u ${USER} mkdir -p ${EXTRACTED}/By_Common_Name
-[ -d ${EXTRACTED}/By_Scientific_Name ] || sudo -u ${USER} mkdir -p ${EXTRACTED}/By_Scientific_Name
-[ -d ${EXTRACTED}/Charts ] || sudo -u ${USER} mkdir -p ${EXTRACTED}/Charts
-[ -d ${PROCESSED} ] || sudo -u ${USER} mkdir -p ${PROCESSED}
-
-sudo -u ${USER} ln -fs $(dirname ${my_dir})/homepage/* ${EXTRACTED}
-if [ ! -z ${BIRDNETLOG_URL} ];then
- BIRDNETLOG_URL="$(echo ${BIRDNETLOG_URL} | sed 's/\/\//\\\/\\\//g')"
- sudo -u${USER} sed -i "s/http:\/\/$(hostname).local:8080/"${BIRDNETLOG_URL}"/g" $(dirname ${my_dir})/homepage/*.html
- phpfiles="$(grep -l "$(hostname).local:8080" ${my_dir}/*.php)"
- for i in "${phpfiles[@]}";do
- sudo -u${USER} sed -i "s/http:\/\/$(hostname).local:8080/"${BIRDNETLOG_URL}"/g" ${i}
- done
-fi
-if [ ! -z ${WEBTERMINAL_URL} ];then
- WEBTERMINAL_URL="$(echo ${WEBTERMINAL_URL} | sed 's/\/\//\\\/\\\//g')"
- sudo -u${USER} sed -i "s/http:\/\/$(hostname).local:8888/"${WEBTERMINAL_URL}"/g" $(dirname ${my_dir})/homepage/*.html
- phpfiles="$(grep -l "$(hostname).local:8888" ${my_dir}/*.php)"
- for i in "${phpfiles[@]}";do
- sudo -u${USER} sed -i "s/http:\/\/$(hostname).local:8888/"${WEBTERMINAL_URL}"/g" ${i}
- done
-fi
-
-sudo -u ${USER} ln -fs $(dirname ${my_dir})/model/labels.txt ${my_dir}/
-sudo -u ${USER} ln -fs $(dirname ${my_dir})/scripts ${EXTRACTED}
-if [ -z ${BIRDNETPI_URL} ];then
- sudo -u${USER} sed -i "s/birdnetpi.local/$(hostname).local/g" $(dirname ${my_dir})/homepage/*.html
- sudo -u${USER} sed -i "s/birdnetpi.local/$(hostname).local/g" $(dirname ${my_dir})/scripts/*.html
- sudo -u${USER} sed -i "s/birdnetpi.local/$(hostname).local/g" $(dirname ${my_dir})/scripts/*.html
- sudo -u${USER} sed -i "s/birdnetpi.local/$(hostname).local/g" $(dirname ${my_dir})/scripts/*.php
- sudo -u${USER} sed -i "s/birdnetpi.local/$(hostname).local/g" $(dirname ${my_dir})/scripts/*/*.php
-else
- BIRDNETPI_URL="$(echo ${BIRDNETPI_URL} | sed 's/\/\//\\\/\\\//g')"
- sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local/${BIRDNETPI_URL}/g" $(dirname ${my_dir})/homepage/*.html
- sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local/${BIRDNETPI_URL}/g" $(dirname ${my_dir})/scripts/*.html
- sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local/${BIRDNETPI_URL}/g" $(dirname ${my_dir})/scripts/*.html
- sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local/${BIRDNETPI_URL}/g" $(dirname ${my_dir})/scripts/*.php
- sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local/${BIRDNETPI_URL}/g" $(dirname ${my_dir})/scripts/*/*.php
-fi
-
-sudo -u ${USER} ln -fs $(dirname ${my_dir})/scripts/spectrogram.php ${EXTRACTED}
-sudo -u ${USER} ln -fs $(dirname ${my_dir})/scripts/viewday.php ${EXTRACTED}
-sudo -u ${USER} ln -fs $(dirname ${my_dir})/scripts/overview.php ${EXTRACTED}
-sudo -u ${USER} ln -fs $(dirname ${my_dir})/scripts/stats.php ${EXTRACTED}
-sudo -u ${USER} ln -fs $(dirname ${my_dir})/scripts/viewdb.php ${EXTRACTED}
-sudo -u ${USER} ln -fs $(dirname ${my_dir})/scripts/history.php ${EXTRACTED}
-sudo -u ${USER} ln -fs $(dirname ${my_dir})/homepage/images/favicon.ico ${EXTRACTED}
-sudo -u ${USER} ln -fs ${HOME}/phpsysinfo ${EXTRACTED}
-sudo -u ${USER} cp -f $(dirname ${my_dir})/templates/phpsysinfo.ini ${HOME}/phpsysinfo/
-sudo -u ${USER} cp -f $(dirname ${my_dir})/templates/green_bootstrap.css ${HOME}/phpsysinfo/templates/
-sudo -u ${USER} cp -f $(dirname ${my_dir})/templates/index_bootstrap.html ${HOME}/phpsysinfo/templates/html
-
-echo "Setting Wttr.in URL to "${LATITUDE}", "${LONGITUDE}""
-sudo -u${USER} sed -i "s/https:\/\/v2.wttr.in\//https:\/\/v2.wttr.in\/"${LATITUDE},${LONGITUDE}"/g" $(dirname ${my_dir})/homepage/menu.html
-chmod -R g+rw $(dirname ${my_dir})
-chmod -R g+rw ${RECS_DIR}
-
-echo "Generating BirdDB.txt"
-if ! [ -f $(dirname ${my_dir})/BirdDB.txt ];then
- sudo -u ${USER} touch $(dirname ${my_dir})/BirdDB.txt
- echo "Date;Time;Sci_Name;Com_Name;Confidence;Lat;Lon;Cutoff;Week;Sens;Overlap" | sudo -u ${USER} tee -a $(dirname ${my_dir})/BirdDB.txt
-elif ! grep Date $(dirname ${my_dir})/BirdDB.txt;then
- sudo -u ${USER} sed -i '1 i\Date;Time;Sci_Name;Com_Name;Confidence;Lat;Lon;Cutoff;Week;Sens;Overlap' $(dirname ${my_dir})/BirdDB.txt
-fi
-ln -sf $(dirname ${my_dir})/BirdDB.txt ${my_dir}/BirdDB.txt &&
- chown pi:pi ${my_dir}/BirdDB.txt && chmod g+rw ${my_dir}/BirdDB.txt
+[ -d ${EXTRACTED} ] || mkdir -p ${EXTRACTED}
+[ -d ${EXTRACTED}/By_Date ] || mkdir -p ${EXTRACTED}/By_Date
+[ -d ${EXTRACTED}/Charts ] || mkdir -p ${EXTRACTED}/Charts
+[ -d ${PROCESSED} ] || mkdir -p ${PROCESSED}
+ln -fs $(dirname ${my_dir})/homepage/* ${EXTRACTED}
+ln -fs $(dirname ${my_dir})/model/labels.txt ${my_dir}/
+ln -fs $(dirname ${my_dir})/scripts ${EXTRACTED}
+ln -fs $(dirname ${my_dir})/scripts/play.php ${EXTRACTED}
+ln -fs $(dirname ${my_dir})/scripts/spectrogram.php ${EXTRACTED}
+ln -fs $(dirname ${my_dir})/scripts/overview.php ${EXTRACTED}
+ln -fs $(dirname ${my_dir})/scripts/stats.php ${EXTRACTED}
+ln -fs $(dirname ${my_dir})/scripts/viewdb.php ${EXTRACTED}
+ln -fs $(dirname ${my_dir})/scripts/history.php ${EXTRACTED}
+ln -fs $(dirname ${my_dir})/homepage/images/favicon.ico ${EXTRACTED}
+ln -fs ${HOME}/phpsysinfo ${EXTRACTED}
+ln -fs $(dirname ${my_dir})/templates/phpsysinfo.ini ${HOME}/phpsysinfo/
+ln -fs $(dirname ${my_dir})/templates/green_bootstrap.css ${HOME}/phpsysinfo/templates/
+ln -fs $(dirname ${my_dir})/templates/index_bootstrap.html ${HOME}/phpsysinfo/templates/html
+sudo chmod -R g+rw $(dirname ${my_dir})
+sudo chmod -R g+rw ${EXTRACTED}
echo "Dropping and re-creating database"
-sudo /home/pi/BirdNET-Pi/scripts/createdb_bullseye.sh
+createdb.sh
+echo "Generating BirdDB.txt"
+touch $(dirname ${my_dir})/BirdDB.txt
+echo "Date;Time;Sci_Name;Com_Name;Confidence;Lat;Lon;Cutoff;Week;Sens;Overlap" > $(dirname ${my_dir})/BirdDB.txt
+ln -sf $(dirname ${my_dir})/BirdDB.txt ${my_dir}/BirdDB.txt
+chown pi:pi ${my_dir}/BirdDB.txt && chmod g+rw ${my_dir}/BirdDB.txt
echo "Restarting services"
-sudo systemctl start birdnet_recording.service
+restart_services.sh
diff --git a/scripts/config.php b/scripts/config.php
index 421b5c9..24decd9 100644
--- a/scripts/config.php
+++ b/scripts/config.php
@@ -1,125 +1,72 @@
+
Basic Settings
-
-
-
-
+
+}
+$caddypwd = $config['CADDY_PWD'];
+if (!isset($_SERVER['PHP_AUTH_USER'])) {
+ header('WWW-Authenticate: Basic realm="My Realm"');
+ header('HTTP/1.0 401 Unauthorized');
+ echo 'You cannot edit the settings for this installation';
+ exit;
+} else {
+ $submittedpwd = $_SERVER['PHP_AUTH_PW'];
+ $submitteduser = $_SERVER['PHP_AUTH_USER'];
+ if($submittedpwd !== $caddypwd || $submitteduser !== 'birdnet'){
+ header('WWW-Authenticate: Basic realm="My Realm"');
+ header('HTTP/1.0 401 Unauthorized');
+ echo 'You cannot edit the settings for this installation';
+ exit;
+ }
+}
+?>
Latitude:
Longitude:
@@ -167,22 +114,19 @@ if (file_exists('/home/pi/BirdNET-Pi/thisrun.txt')) {
Ukrainian
-
+
+
+
-
-
- Advanced Settings
-
-
- Tools
-
-
-
-
-
+?>
+
+
+
+ Advanced Settings
+
+
diff --git a/scripts/createdb.sh b/scripts/createdb.sh
new file mode 100755
index 0000000..72f1dce
--- /dev/null
+++ b/scripts/createdb.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+source /etc/birdnet/birdnet.conf
+sqlite3 /home/pi/BirdNET-Pi/scripts/birds.db << EOF
+DROP TABLE IF EXISTS detections;
+CREATE TABLE IF NOT EXISTS detections (
+ Date DATE,
+ Time TIME,
+ Sci_Name VARCHAR(100) NOT NULL,
+ Com_Name VARCHAR(100) NOT NULL,
+ Confidence FLOAT,
+ Lat FLOAT,
+ Lon FLOAT,
+ Cutoff FLOAT,
+ Week INT,
+ Sens FLOAT,
+ Overlap FLOAT,
+ File_Name VARCHAR(100) NOT NULL);
+EOF
+sudo chown pi:pi /home/pi/BirdNET-Pi/scripts/birds.db
+sudo chmod g+w /home/pi/BirdNET-Pi/scripts/birds.db
diff --git a/scripts/createdb_bullseye.sh b/scripts/createdb_bullseye.sh
deleted file mode 100755
index 8453358..0000000
--- a/scripts/createdb_bullseye.sh
+++ /dev/null
@@ -1,46 +0,0 @@
-#!/usr/bin/env bash
-# This script performs the mysql_secure_installation
-# Creates the birds database
-# Creates the detections table
-# Creates the birder user and grants them appropriate
-# permissions
-# If using this script to re-initialize (DROP then CREATE)
-# the DB, be sure to run this as root or with sudo
-source /etc/birdnet/birdnet.conf
-mysql_secure_installation << EOF
-
-y
-n
-y
-y
-y
-y
-EOF
-
-mysql << EOF
-DROP DATABASE IF EXISTS birds;
-CREATE DATABASE IF NOT EXISTS birds;
-
-USE birds;
-
-CREATE TABLE IF NOT EXISTS detections (
- Date DATE,
- Time TIME,
- Sci_Name VARCHAR(100) NOT NULL,
- Com_Name VARCHAR(100) NOT NULL,
- Confidence FLOAT,
- Lat FLOAT,
- Lon FLOAT,
- Cutoff FLOAT,
- Week INT,
- Sens FLOAT,
- Overlap FLOAT);
-GRANT ALL ON birds.* TO 'birder'@'localhost' IDENTIFIED BY '${DB_PWD}' WITH GRANT OPTION;
-FLUSH PRIVILEGES;
-exit
-EOF
-sudo -u${USER} sed -i "s/databasepassword/${DB_PWD}/g" /home/pi/BirdNET-Pi/scripts/server.py
-sed -i "s/mysqli.default_host =.*/mysqli.default_host = localhost/g" /etc/php/7.4/fpm/php.ini
-sed -i "s/mysqli.default_user =.*/mysqli.default_user = birder/g" /etc/php/7.4/fpm/php.ini
-sed -i "s/mysqli.default_pw =.*/mysqli.default_pw = ${DB_PWD}/g" /etc/php/7.4/fpm/php.ini
-
diff --git a/scripts/custom_recording.sh b/scripts/custom_recording.sh
new file mode 100755
index 0000000..ccf4303
--- /dev/null
+++ b/scripts/custom_recording.sh
@@ -0,0 +1,75 @@
+#!/usr/bin/env bash
+set -x
+source /etc/birdnet/birdnet.conf
+
+STAMP="%H:%M:%S"
+
+[ -z $RECORDING_LENGTH ] && RECORDING_LENGTH=15
+
+if ! pulseaudio --check;then pulseaudio --start;fi
+
+CUSTOM_WINDOW_START=(0 3 15 22)
+CUSTOM_WINDOW_END=(0 7 19 23)
+RECORDING_DURATION=60
+PAUSE_DURATION=240
+
+now=$(date +%H)
+
+while [ $now -ge ${CUSTOM_WINDOW_START[0]} ] && [ $now -le ${CUSTOM_WINDOW_END[0]} ];do
+ echo $now
+ # If you prefer no directory structure under "Raw", comment out the
+ # lines below and uncommend the commands at the bottom.
+ arecord -f S16_LE -c${CHANNELS} -r48000 -t wav -d $RECORDING_DURATION \
+ --use-strftime ${EXTRACTED}/Raw/%B-%Y/%d-%A/%F-birdnet-${STAMP}.wav
+
+ # Uncomment the lines below if you'd prefer having no directory scructure
+ # under the "Raw" directory. Be sure to comment out the command above.
+ #arecord -f S16_LE -c${CHANNELS} -r48000 -t wav -d $RECORDING_DURATION \
+ # --use-strftime ${EXTRACTED}/Raw/%F-birdnet-${STAMP}.wav
+ sleep $PAUSE_DURATION
+ now=$(date +%H)
+done
+while [ $now -ge ${CUSTOM_WINDOW_START[1]} ] && [ $now -le ${CUSTOM_WINDOW_END[1]} ];do
+ echo $now
+ # If you prefer no directory structure under "Raw", comment out the
+ # lines below and uncommend the commands at the bottom.
+ arecord -f S16_LE -c${CHANNELS} -r48000 -t wav -d $RECORDING_DURATION \
+ --use-strftime ${EXTRACTED}/Raw/%B-%Y/%d-%A/%F-birdnet-${STAMP}.wav
+
+ # Uncomment the lines below if you'd prefer having no directory scructure
+ # under the "Raw" directory. Be sure to comment out the command above.
+ #arecord -f S16_LE -c${CHANNELS} -r48000 -t wav -d $RECORDING_DURATION \
+ # --use-strftime ${EXTRACTED}/Raw/%F-birdnet-${STAMP}.wav
+ sleep $PAUSE_DURATION
+ now=$(date +%H)
+done
+while [ $now -ge ${CUSTOM_WINDOW_START[2]} ] && [ $now -le ${CUSTOM_WINDOW_END[2]} ];do
+ echo $now
+ # If you prefer no directory structure under "Raw", comment out the
+ # lines below and uncommend the commands at the bottom.
+ arecord -f S16_LE -c${CHANNELS} -r48000 -t wav -d $RECORDING_DURATION \
+ --use-strftime ${EXTRACTED}/Raw/%B-%Y/%d-%A/%F-birdnet-${STAMP}.wav
+
+ # Uncomment the lines below if you'd prefer having no directory scructure
+ # under the "Raw" directory. Be sure to comment out the command above.
+ #arecord -f S16_LE -c${CHANNELS} -r48000 -t wav -d $RECORDING_DURATION \
+ # --use-strftime ${EXTRACTED}/Raw/%F-birdnet-${STAMP}.wav
+ sleep $PAUSE_DURATION
+ now=$(date +%H)
+done
+while [ $now -ge ${CUSTOM_WINDOW_START[3]} ] && [ $now -le ${CUSTOM_WINDOW_END[3]} ];do
+ echo $now
+ # If you prefer no directory structure under "Raw", comment out the
+ # lines below and uncommend the commands at the bottom.
+ arecord -f S16_LE -c${CHANNELS} -r48000 -t wav -d $RECORDING_DURATION \
+ --use-strftime ${EXTRACTED}/Raw/%B-%Y/%d-%A/%F-birdnet-${STAMP}.wav
+
+ # Uncomment the lines below if you'd prefer having no directory scructure
+ # under the "Raw" directory. Be sure to comment out the command above.
+ #arecord -f S16_LE -c${CHANNELS} -r48000 -t wav -d $RECORDING_DURATION \
+ # --use-strftime ${EXTRACTED}/Raw/%F-birdnet-${STAMP}.wav
+ sleep $PAUSE_DURATION
+ now=$(date +%H)
+done
+
+
diff --git a/scripts/daily_plot.py b/scripts/daily_plot.py
index 90b517c..750fe73 100755
--- a/scripts/daily_plot.py
+++ b/scripts/daily_plot.py
@@ -1,9 +1,8 @@
#!/home/pi/BirdNET-Pi/birdnet/bin/python3
-import mysql.connector as sql
+import sqlite3
import os
import configparser
-
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
@@ -11,25 +10,14 @@ from matplotlib.colors import LogNorm
from datetime import datetime
import textwrap
-#Extract DB_PWD from thisrun.txt
-with open('/home/pi/BirdNET-Pi/thisrun.txt', 'r') as f:
- this_run = f.readlines()
- db_pwd = str(str(str([i for i in this_run if i.startswith('DB_PWD')]).split('=')[1]).split('\\')[0])
+conn = sqlite3.connect('/home/pi/BirdNET-Pi/scripts/birds.db')
+df = pd.read_sql_query("SELECT * from detections", conn)
+cursor = conn.cursor()
+cursor.execute('SELECT * FROM detections')
+table_rows = cursor.fetchall()
-db_connection = sql.connect(host='localhost',
- database='birds',
- user='birder',
- password=db_pwd)
-
-
-db_cursor=db_connection.cursor(dictionary=True)
-
-db_cursor.execute('SELECT * FROM detections')
-
-table_rows = db_cursor.fetchall()
-
-df=pd.DataFrame(table_rows)
+#df=pd.DataFrame(table_rows)
#Convert Date and Time Fields to Panda's format
df['Date']=pd.to_datetime(df['Date'])
@@ -97,7 +85,7 @@ heat_frame = pd.DataFrame(data=0, index=heat.index, columns = hours_in_day)
heat=(heat+heat_frame).fillna(0)
#Generatie heatmap plot
-plot = sns.heatmap(heat, norm=LogNorm(), annot=True, annot_kws={"fontsize":7}, cmap = pal , square = False, cbar=False, linewidths = 0.5, linecolor = "Grey", ax=axs[1], yticklabels = False)
+plot = sns.heatmap(heat, norm=LogNorm(), annot=True, annot_kws={"fontsize":7}, fmt="g", cmap = pal , square = False, cbar=False, linewidths = 0.5, linecolor = "Grey", ax=axs[1], yticklabels = False)
plot.set_xticklabels(plot.get_xticklabels(), rotation = 0, size = 7)
# Set heatmap border
@@ -165,7 +153,7 @@ heat_frame = pd.DataFrame(data=0, index=heat.index, columns = hours_in_day)
heat=(heat+heat_frame).fillna(0)
#Generatie heatmap plot
-plot = sns.heatmap(heat, norm=LogNorm(), annot=True, annot_kws={"fontsize":7}, cmap = pal , square = False, cbar=False, linewidths = 0.5, linecolor = "Grey", ax=axs[1], yticklabels = False)
+plot = sns.heatmap(heat, norm=LogNorm(), annot=True, fmt="g", annot_kws={"fontsize":7}, cmap = pal , square = False, cbar=False, linewidths = 0.5, linecolor = "Grey", ax=axs[1], yticklabels = False)
plot.set_xticklabels(plot.get_xticklabels(), rotation = 0, size = 7)
# Set heatmap border
diff --git a/scripts/del_from_exclude.php b/scripts/del_from_exclude.php
deleted file mode 100644
index 5fa7a48..0000000
--- a/scripts/del_from_exclude.php
+++ /dev/null
@@ -1,22 +0,0 @@
-
diff --git a/scripts/del_from_include.php b/scripts/del_from_include.php
deleted file mode 100644
index 219d88f..0000000
--- a/scripts/del_from_include.php
+++ /dev/null
@@ -1,22 +0,0 @@
-
diff --git a/scripts/exclude_list.php b/scripts/exclude_list.php
index 99e20fc..f49e27c 100644
--- a/scripts/exclude_list.php
+++ b/scripts/exclude_list.php
@@ -1,121 +1,57 @@
+
+
+
+ All Species Labels
+
+ Choose a species below to add to the Excluded Species List
+ $lines";}
+ ?>
+
+
+
+
+ >>ADD>>
+
+
+
+
+
+
+
+ Excluded Species List
+
and add php start and close tag
-//comment these two lines when code started working fine
-error_reporting(E_ALL);
-ini_set('display_errors',1);
-
-$filename = 'labels.txt';
-$eachlines = file($filename, FILE_IGNORE_NEW_LINES);
-
-?>
-
-
-
-
-
All Species Labels
-
-
- Please Select
-$lines";
+ $filename = '/home/pi/BirdNET-Pi/exclude_species_list.txt';
+ $eachline = file($filename, FILE_IGNORE_NEW_LINES);
+ foreach($eachline as $lines){
+ echo
+ "$lines ";
}?>
-
-
-
+
+
+
+
+ REMOVE
+
+
-
- Add to list
- Remove from list
-
-
-
Excluded Species List
-
-
- Please Select
-$lines";
-}?>
-
-
-
diff --git a/scripts/extra_info.sh b/scripts/extra_info.sh
index dce9466..129a226 100755
--- a/scripts/extra_info.sh
+++ b/scripts/extra_info.sh
@@ -12,29 +12,45 @@ echo "Binary: $binary";
revbinary=$(echo $binary|rev)
if echo $binary | grep 1 ;then
echo "ISSUES DETECTED"
- if [ ${revbinary:0:1} -eq 1 ];then
- echo "Under-voltage detected"
+ if [ ${revbinary:0:1} -eq 1 &> /dev/null ];then
+ message="Under-voltage detected"
+ echo "$message"
+ dmesg -H | grep -i voltage
fi
- if [ ${revbinary:1:1} -eq 1 ];then
- echo "Arm frequency capped"
+ if [ ${revbinary:1:1} -eq 1 &> /dev/null ];then
+ message="Arm frequency capped"
+ echo "$message"
+ dmesg -H | grep -i frequen
fi
- if [ ${revbinary:2:1} -eq 1 ];then
- echo "Currently Throttled"
+ if [ ${revbinary:2:1} -eq 1 &> /dev/null ];then
+ message="Currently Throttled"
+ echo "$message"
+ dmesg -H | grep -i throttl
fi
- if [ ${revbinary:3:1} -eq 1 ];then
- echo "Soft temperatue limit active"
+ if [ ${revbinary:3:1} -eq 1 &> /dev/null ];then
+ message="Soft temperatue limit active"
+ echo "$message"
+ dmesg -H | grep -i temperature
fi
- if [ ${revbinary:16:1} -eq 1 ];then
- echo "Under-voltage has occurred"
+ if [ ${revbinary:16:1} -eq 1 &> /dev/null ];then
+ message="Under-voltage has occurred"
+ echo "$message"
+ dmesg -H | grep -i voltage
fi
- if [ ${revbinary:17:1} -eq 1 ];then
- echo "Arm frequency capping has occurred"
+ if [ ${revbinary:17:1} -eq 1 &> /dev/null ];then
+ message="Arm frequency capping has occurred"
+ echo "$message"
+ dmesg -H | grep -i frequen
fi
- if [ ${revbinary:18:1} -eq 1 ];then
- echo "Throttling has occurred"
+ if [ ${revbinary:18:1} -eq 1 &> /dev/null ];then
+ message="Throttling has occurred"
+ echo "$message"
+ dmesg -H | grep -i throttl
fi
- if [ ${revbinary:19:1} -eq 1 ];then
- echo "Soft temperature limit has occurred"
+ if [ ${revbinary:19:1} -eq 1 &> /dev/null ];then
+ message="Soft temperature limit has occurred"
+ echo "$message"
+ dmesg -H | grep -i temperature
fi
fi
echo "....................................Clock Speeds................................"
diff --git a/scripts/extract_new_birdsounds.sh b/scripts/extract_new_birdsounds.sh
index 029edc6..ca91a8a 100755
--- a/scripts/extract_new_birdsounds.sh
+++ b/scripts/extract_new_birdsounds.sh
@@ -61,14 +61,18 @@ for h in "${SCAN_DIRS[@]}";do
SCIENTIFIC_NAME=""$(echo ${line} \
| awk -F\; '!/birdnet/{print $3}')""
CONFIDENCE=""$(echo ${line} \
- | awk -F\; '{print $5}' \
- | cut -d'.' -f2)""
- CONFIDENCE_SCORE="${CONFIDENCE:0:2}%"
+ | awk -F\; '{print $5}')""
+
+ #CONFIDENCE_SCORE="${CONFIDENCE:0:2}%"
+ locale_decimal=$(locale decimal_point)
+ if [[ $locale_decimal == "." ]]; then
+ CONFIDENCE_SCORE="$(printf %.0f "$(echo "scale=2; ${CONFIDENCE} * 100" | bc)")"
+ else
+ CONFIDENCE_SCORE="$(printf %.0f "$(echo "scale=2; "${CONFIDENCE}" * 100" | bc | tr '.' ',')")"
+ fi
NEWFILE="${COMMON_NAME// /_}-${CONFIDENCE_SCORE}-${OLDFILE//.wav/.${AUDIOFMT}}"
echo "NEWFILE=$NEWFILE"
NEWSPECIES_BYDATE="${EXTRACTED}/By_Date/${DATE}/${COMMON_NAME// /_}"
- NEWSPECIES_BY_COMMON="${EXTRACTED}/By_Common_Name/${COMMON_NAME// /_}"
- NEWSPECIES_BY_SCIENCE="${EXTRACTED}/By_Scientific_Name/${SCIENTIFIC_NAME// /_}"
# If the extracted file already exists, move on
if [[ -f "${NEWSPECIES_BYDATE}/${NEWFILE}" ]];then
@@ -85,16 +89,6 @@ for h in "${SCAN_DIRS[@]}";do
# it is created
[[ -d "${NEWSPECIES_BYDATE}" ]] || mkdir -p "${NEWSPECIES_BYDATE}"
-
- # If a directory does not already exist for the species (by-species),
- # it is created.
- [[ -d "${NEWSPECIES_BY_COMMON}" ]] || mkdir -p "${NEWSPECIES_BY_COMMON}"
-
- # If a directory does not already exist for the species (by-species),
- # it is created.
- [[ -d "${NEWSPECIES_BY_SCIENCE}" ]] || mkdir -p "${NEWSPECIES_BY_SCIENCE}"
-
-
# If there are already 20 extracted entries for a given species
# for today, remove the oldest file and create the new one.
# if [[ "$(find ${NEWSPECIES_BYDATE} | wc -l)" -ge 20 ]];then
@@ -131,9 +125,6 @@ for h in "${SCAN_DIRS[@]}";do
sox "${h}/${OLDFILE}" "${NEWSPECIES_BYDATE}/${NEWFILE}" \
trim "${START}" "${END}"
- #ffmpeg -hide_banner -loglevel error -nostdin -i "${h}/${OLDFILE}" \
- # -acodec copy -ss "${START}" -to "${END}"\
- # "${NEWSPECIES_BYDATE}/${NEWFILE}"
# Create spectrogram for extraction
sox "${NEWSPECIES_BYDATE}/${NEWFILE}" -n remix 1 rate 24k spectrogram \
@@ -141,48 +132,6 @@ for h in "${SCAN_DIRS[@]}";do
-c "${NEWSPECIES_BYDATE}/${NEWFILE}" \
-o "${NEWSPECIES_BYDATE}/${NEWFILE}.png"
- # Remove the oldest symbolic links that would make the directory have more
- # than 20 entries.
- if [[ "$(find ${NEWSPECIES_BY_COMMON} | wc -l)" -ge 40 ]];then
- echo "20 ${SPECIES}s, already! Removing the oldest by-species and making a new one"
- cd ${NEWSPECIES_BY_COMMON} || exit 1
- ls -1t . | tail -n +40 | xargs -r rm -vv
- ln -fs "${NEWSPECIES_BYDATE}/${NEWFILE}"\
- "${NEWSPECIES_BY_COMMON}/${NEWFILE}"
- ln -fs "${NEWSPECIES_BYDATE}/${NEWFILE}.png"\
- "${NEWSPECIES_BY_COMMON}/${NEWFILE}.png"
- echo "Success! New extraction for ${COMMON_NAME}"
- else
- # Make symbolic link of the extraction to add to By_Common_Name
- ln -fs "${NEWSPECIES_BYDATE}/${NEWFILE}"\
- "${NEWSPECIES_BY_COMMON}/${NEWFILE}"
- ln -fs "${NEWSPECIES_BYDATE}/${NEWFILE}.png"\
- "${NEWSPECIES_BY_COMMON}/${NEWFILE}.png"
- fi
-
- # Remove the oldest symbolic links that would made the directory have more
- # than 20 entries.
- if [[ "$(find ${NEWSPECIES_BY_SCIENCE} | wc -l)" -ge 40 ]];then
- echo "20 ${SPECIES}s, already! Removing the oldest by-species and making a new one"
- cd ${NEWSPECIES_BY_SCIENCE} || exit 1
- ls -1t . | tail -n +40 | xargs -r rm -vv
- ln -fs "${NEWSPECIES_BYDATE}/${NEWFILE}"\
- "${NEWSPECIES_BY_SCIENCE}/${NEWFILE}"
- ln -fs "${NEWSPECIES_BYDATE}/${NEWFILE}.png"\
- "${NEWSPECIES_BY_SCIENCE}/${NEWFILE}.png"
- echo "Success! New extraction for ${COMMON_NAME}"
- else
- ln -fs "${NEWSPECIES_BYDATE}/${NEWFILE}"\
- "${NEWSPECIES_BY_SCIENCE}/${NEWFILE}"
- ln -fs "${NEWSPECIES_BYDATE}/${NEWFILE}.png"\
- "${NEWSPECIES_BY_SCIENCE}/${NEWFILE}.png"
- fi
-
-
- # Finally, 'a' is incremented by one to allow multiple extractions per
- # species per minute.
- #a=$((a + 1))
-
done < "${TMPFILE}"
# Once each line of the TMPFILE has been processed, the TMPFILE is emptied
@@ -192,11 +141,11 @@ for h in "${SCAN_DIRS[@]}";do
# Rename files that have been processed so that they are not processed on the
# next extraction.
[[ -d "${PROCESSED}" ]] || mkdir "${PROCESSED}"
- echo "Moving processed files to ${PROCESSED}"
+ #echo "Moving processed files to ${PROCESSED}"
mv ${h}/* ${PROCESSED} &> /dev/null || continue
done
-echo "Linking Processed files to "${EXTRACTED}/Processed" web directory"
+#echo "Linking Processed files to "${EXTRACTED}/Processed" web directory"
# After all audio extractions have taken place, a directory is created to house
# the original WAVE and .txt files used for this extraction processs.
if [[ ! -L ${EXTRACTED}/Processed ]] || [[ ! -e ${EXTRACTED}/Processed ]];then
diff --git a/scripts/filemanager/filemanager.php b/scripts/filemanager/filemanager.php
index 1db4bb8..ec0e573 100644
--- a/scripts/filemanager/filemanager.php
+++ b/scripts/filemanager/filemanager.php
@@ -1,6 +1,6 @@
-
- BirdNET-Pi Homepage
-
-
+
+ BirdNET-Pi Homepage
+
diff --git a/scripts/first_boot.php b/scripts/first_boot.php
deleted file mode 100644
index eccc19e..0000000
--- a/scripts/first_boot.php
+++ /dev/null
@@ -1,153 +0,0 @@
-
-
-
-
-
-Welcome!
-
-
- Thank you for installing BirdNET-Pi!
- to get started, fill out the Required sections below.
- Required
- Latitude:
-
- Longitude:
-
- Optional Services
- The services below are not required, but they are pretty cool.
- BirdWeather ID:
-
- app.BirdWeather.com is a weather map for bird sounds. Stations around the world supply audio and video streams to BirdWeather where they are then analyzed by BirdNET and compared to eBird Grid data. BirdWeather catalogues the detections and visualizations so that you can listen to, view, and read about the birds in various regions across the globe! Pretty cool! Email Tim to request a BirdWeather ID
-
- Pushed App Key:
-
- Pushed App Secret:
-
- Pushed.co is used to offer New Species notifications. Sorry Android users, but the Pushed.co Application is only for iOS.
- Database Language:
-
- English
- Afrikaans
- Catalan
- Czech
- Chinese
- Croatian
- Danish
- Dutch
- Estonian
- Finnish
- French
- German
- Hungarian
- Icelandic
- Indonesia
- Italian
- Japanese
- Latvian
- Lithuania
- Norwegian
- Polish
- Portugues
- Russian
- Slovak
- Slovenian
- Spanish
- Swedish
- Thai
- Ukrainian
-
-
-
-
-
diff --git a/scripts/get_citation.sh b/scripts/get_citation.sh
deleted file mode 100755
index 0641df6..0000000
--- a/scripts/get_citation.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/usr/bin/env bash
-# testing getting images dynamically
-first_call=$(lynx -nonumbers -dump -listonly "https://commons.wikimedia.org/w/index.php?search=${1//_/+}&title=Special:MediaSearch&go=Go&type=image" | sed '11q;d')
-
-lynx -dump -nonumbers "$(lynx -dump $first_call \
- | awk '/CiteThisPage/ {print $2}')" \
- | grep -A10 'Chicago style' \
- | grep -A10 -e '^$' \
- | grep -B10 'CBE' \
- | grep -B10 -e '^$'
diff --git a/scripts/get_image.sh b/scripts/get_image.sh
deleted file mode 100755
index 132df45..0000000
--- a/scripts/get_image.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/usr/bin/env bash
-# testing getting images dynamically
-first_call=$(lynx -dump -listonly "https://commons.wikimedia.org/w/index.php?search=${1//_/+}&title=Special:MediaSearch&go=Go&type=image")
-lynx -dump -listonly \
- $(echo "$first_call" \
- | sed '11q;d' \
- | awk '{print $2}' ) \
- | awk '/thumb/ {print $2}' \
- | head -1 \
- | xargs echo -n
diff --git a/scripts/gotty b/scripts/gotty
new file mode 100755
index 0000000..e28e8c3
Binary files /dev/null and b/scripts/gotty differ
diff --git a/scripts/history.php b/scripts/history.php
index 015798e..1063509 100644
--- a/scripts/history.php
+++ b/scripts/history.php
@@ -10,85 +10,44 @@ $theDate = date('Y-m-d');
}
$chart = "Combo-$theDate.png";
$chart2 = "Combo2-$theDate.png";
-$mysqli = mysqli_connect();
-$mysqli->select_db('birds');
-if ($mysqli->connect_error) {
- die('Connect Error (' .
- $mysqli->connect_errno . ') '.
- $mysqli->connect_error);
-}
+$db = new SQLite3('/home/pi/BirdNET-Pi/scripts/birds.db', SQLITE3_OPEN_CREATE | SQLITE3_OPEN_READWRITE);
-// SQL query to select data from database
+$statement1 = $db->prepare("SELECT COUNT(*) FROM detections
+ WHERE Date == \"$theDate\"");
+$result1 = $statement1->execute();
+$totalcount = $result1->fetchArray(SQLITE3_ASSOC);
-$sql1 = "SELECT COUNT(*)
- FROM detections
- WHERE DATE = \"$theDate\"";
-$dayscount = $mysqli->query($sql1);
-
-$mysqli->close();
?>
-
-
+
+
- Submit Date
+ Submit Date
-
Total Detections For The Day
-fetch_assoc()){
-?>
-
-
+
-
-
";
+ echo "
";
} else {
- echo "
No Charts for $theDate
";
+ echo "
No Charts for $theDate
";
}
echo "
";
if (file_exists('/home/pi/BirdSongs/Extracted/Charts/'.$chart2)) {
- echo "
";
+ echo "
";
} else {
- echo "
No Charts For $theDate
";
+ echo "
No Charts For $theDate
";
}?>
+
diff --git a/scripts/include_list.php b/scripts/include_list.php
index 9cfe118..012066c 100644
--- a/scripts/include_list.php
+++ b/scripts/include_list.php
@@ -1,121 +1,62 @@
and add php start and close tag
-//comment these two lines when code started working fine
error_reporting(E_ALL);
ini_set('display_errors',1);
-$filename = 'labels.txt';
+$filename = 'scripts/labels.txt';
$eachlines = file($filename, FILE_IGNORE_NEW_LINES);
?>
-
-
-
-
All Species Labels
-
-
- Please Select
-$lines";
-}?>
-
-
-
+
+
+
+
+
Warning! If this list contains ANY species, the system will ONLY recognize those species. Keep this list EMPTY unless you are ONLY interested in detecting specific species.
+
+
+ All Species Labels
+
+ Please Select
+ $lines";}
+ ?>
+
+
+
+
+ >>ADD>>
+
+
-
- Add to list
- Remove from list
-
+
-
-
Included Species List
-
-
- Please Select
-$lines";
-}?>
-
-
-
+
+
+ Custom Species List
+
+ Please Select
+ $lines";}
+ ?>
+
+
+
+
+ REMOVE
+
+
diff --git a/scripts/index.html b/scripts/index.html
deleted file mode 100644
index 66389bc..0000000
--- a/scripts/index.html
+++ /dev/null
@@ -1,90 +0,0 @@
-
-
-
-
-
-
- File Manager
-
-
- Database Maintenance
-
-
- Settings
-
-
- System Controls
-
-
-
-
- Web Terminal
-
-
- Manage Services
-
-
- Included Species List
-
-
- Excluded Species List
-
-
-
-
diff --git a/scripts/install_birdnet.sh b/scripts/install_birdnet.sh
index 16a821e..f5d1f15 100755
--- a/scripts/install_birdnet.sh
+++ b/scripts/install_birdnet.sh
@@ -1,6 +1,7 @@
#!/usr/bin/env bash
# Install BirdNET script
-set -x # debugging
+set -x
+exec > >(tee -i installation-$(date +%F).txt) 2>&1
set -e # exit installation if anything fails
my_dir=$(realpath $(dirname $0))
trap '${my_dir}/dump_logs.sh && echo -e "\n\nExiting the installation. Goodbye!" && exit 1' SIGINT
@@ -20,80 +21,15 @@ fi
sudo ./install_services.sh || exit 1
source /etc/birdnet/birdnet.conf
-APT_DEPS=(swig ffmpeg wget unzip curl cmake make bc)
-LIBS_MODULES=(libjpeg-dev zlib1g-dev python3-dev python3-pip python3-venv)
-
-install_deps() {
- echo " Checking dependencies"
- sudo apt update &> /dev/null
- for i in "${LIBS_MODULES[@]}";do
- if [ $(apt list --installed 2>/dev/null | grep "$i" | wc -l) -le 0 ];then
- echo " Installing $i"
- sudo apt -y install ${i} &> /dev/null
- else
- echo " $i is installed!"
- fi
- done
-
- for i in "${APT_DEPS[@]}";do
- if ! which $i &>/dev/null ;then
- echo " Installing $i"
- sudo apt -y install ${i} &> /dev/null
- else
- echo " $i is installed!"
- fi
- done
-}
-
install_birdnet() {
cd ~/BirdNET-Pi || exit 1
echo "Establishing a python virtual environment"
python3 -m venv birdnet
source ./birdnet/bin/activate
- echo "Upgrading pip, wheel, and setuptools"
- pip3 install --upgrade pip~=21.0.0 wheel setuptools
- python_version="$(awk -F. '{print $2}' <(ls -l $(which /usr/bin/python3)))"
- echo "python_version=${python_version}"
- # TFLite Pre-built binaires from https://github.com/PINTO0309/TensorflowLite-bin
- # Python 3.7
- if [[ "$python_version" == 7 ]];then
- echo "Installing the TFLite bin wheel"
- pip3 install --upgrade tflite_runtime-2.6.0-cp37-none-linux_aarch64.whl
- fi
-
- # Python 3.9
- if [[ "$python_version" == 9 ]];then
- echo "Installing the TFLite bin wheel"
- pip3 install --upgrade tflite_runtime-2.6.0-cp39-none-linux_aarch64.whl
- fi
- echo "Making sure everything else is installed"
pip3 install -U -r /home/pi/BirdNET-Pi/requirements.txt
}
[ -d ${RECS_DIR} ] || mkdir -p ${RECS_DIR} &> /dev/null
-install_deps
-if [ ! -d ${VENV} ];then
- install_birdnet
-fi
-
-echo " BirdNet is installed!!
-
- To start the service manually, issue:
- 'sudo systemctl start birdnet_analysis'
- To monitor the service logs, issue:
- 'journalctl -fu birdnet_analysis'
- To stop the service manually, issue:
- 'sudo systemctl stop birdnet_analysis'
- To stop and disable the service, issue:
- 'sudo systemctl disable --now birdnet_analysis.service'
-
- Visit
- the BirdNET-Pi homepage at http://birdnetpi.local"
- echo
-case $YN in
- [Yy] ) sudo systemctl start birdnet_analysis.service \
- && journalctl -fu birdnet_analysis;;
-* ) echo " Thanks for installing BirdNET-Pi!!
- I hope it was helpful!";;
-esac
+install_birdnet
+exit 0
diff --git a/scripts/install_config.sh b/scripts/install_config.sh
index a2559e2..397b20c 100755
--- a/scripts/install_config.sh
+++ b/scripts/install_config.sh
@@ -6,240 +6,63 @@ trap 'exit 1' SIGINT SIGHUP
my_dir=$(realpath $(dirname $0))
birdnetpi_dir=$(realpath $(dirname $my_dir))
-BIRDNET_CONF="$(dirname ${my_dir})/birdnet.conf"
+birdnet_conf="$(dirname ${my_dir})/birdnet.conf"
-get_RECS_DIR() {
- read -p "What is the full path to your recordings directory (locally)? " RECS_DIR
-}
-
-get_LATITUDE() {
- read -p "What is the latitude where the recordings were made? " LATITUDE
-}
-
-get_LONGITUDE() {
- read -p "What is the longitude where the recordings were made? " LONGITUDE
-}
-
-get_DO_EXTRACTIONS() {
- while true; do
- read -n1 -p "Do you want this device to perform the extractions? " DO_EXTRACTIONS
- echo
- case $DO_EXTRACTIONS in
- [Yy] ) break;;
- [Nn] ) break;;
- * ) echo "You must answer with Yes or No (y or n)";;
- esac
- done
-}
-
-get_DO_RECORDING() {
- while true; do
- read -n1 -p "Is this device also doing the recording? " DO_RECORDING
- echo
- case $DO_RECORDING in
- [Yy] ) break;;
- [Nn] ) break;;
- * ) echo "You must answer with Yes or No (y or n)";;
- esac
- done
-}
-
-get_BIRDNETPI_URL() {
- while true;do
- read -n1 -p "Would you like to access the extractions via a web browser?
-
- *Note: It is recommended, (but not required), that you run the web
- server on the same host that does the extractions. If the extraction
- service and web server are on different hosts, the \"By_Species\" and
- \"Processed\" symbolic links won't work. The \"By-Date\" extractions,
- however, will work as expected." CADDY_SERVICE
- echo
- case $CADDY_SERVICE in
- [Yy] ) read -p "What URL would you like to publish the extractions to?
- *Note: Set this to http://localhost if you do not want to make the
- extractions publically available: " BIRDNETPI_URL
- get_CADDY_PWD
- get_ICE_PWD
- break;;
- [Nn] ) BIRDNETPI_URL= CADDY_PWD= ICE_PWD=;break;;
- * ) echo "Please answer Yes or No";;
- esac
- done
-}
-
-get_CADDY_PWD() {
- if [ -z ${CADDY_PWD} ]; then
- while true; do
- read -p "Please set a password to protect your data: " CADDY_PWD
- case $CADDY_PWD in
- "" ) echo "The password cannot be empty. Please try again.";;
- * ) break;;
- esac
- done
- fi
-}
-
-get_ICE_PWD() {
- if [ ! -z ${CADDY_PWD} ] && [[ ${DO_RECORDING} =~ [Yy] ]];then
- while true; do
- read -n1 -p "Would you like to enable the live audio streaming service?" LIVE_STREAM
- echo
- case $LIVE_STREAM in
- [Yy] )
- read -p "Please set the icecast password. Use only alphanumeric characters." ICE_PWD
- echo
- case ${ICE_PWD} in
- "" ) echo "The password cannot be empty. Please try again.";;
- *) break;;
- esac
- break;;
- [Nn] ) break;;
- * ) echo "You must answer Yes or No (y or n).";;
- esac
- done
- fi
-}
-
-get_DB_PWDS() {
- if [ ! -z ${DB_PWD} ];then
- read -p "Please set a password for your database: " DB_PWD
- echo
- fi
-}
-
-get_PUSHED() {
- while true; do
- read -n1 -p "Do you have a free App key to receive mobile notifications via Pushed.co?" YN
- echo
- case $YN in
- [Yy] ) read -p "Enter your Pushed.co App Key: " PUSHED_APP_KEY
- read -p "Enter your Pushed.co App Key Secret: " PUSHED_APP_SECRET
- break;;
- [Nn] ) PUSHED_APP_KEY=
- PUSHED_APP_SECRET=
- break;;
- * ) echo "A simple Yea or Nay will do";;
- esac
- done
-}
-
-get_INSTALL_NOMACHINE() {
- while true; do
- read -n1 -p "Would you like to also install NoMachine for remote desktop access?" INSTALL_NOMACHINE
- echo
- case $INSTALL_NOMACHINE in
- [Yy] ) break;;
- [Nn] ) break;;
- * ) echo "You must answer with Yes or No (y or n)";;
- esac
- done
-}
-
-get_CHANNELS() {
- REC_CARD="$(sudo -u pi aplay -L \
- | grep dsnoop \
- | cut -d, -f1 \
- | grep -ve 'vc4' -e 'Head' -e 'PCH' \
- | uniq)"
-
- [ -f $(dirname ${my_dir})/soundcard_params.txt ] || touch $(dirname ${my_dir})/soundcard_params.txt
- SOUND_PARAMS=$(dirname ${my_dir})/soundcard_params.txt
- SOUND_CARD="$(sudo -u ${USER} aplay -L \
- | awk -F, '/^hw:/ {print $1}' \
- | grep -ve 'vc4' -e 'Head' -e 'PCH' \
- | uniq)"
- script -c "arecord -D ${SOUND_CARD} --dump-hw-params" -a "${SOUND_PARAMS}" &> /dev/null
- CHANNELS=$(awk '/CHANN/ { print $2 }' "${SOUND_PARAMS}" | sed 's/\r$//')
- [ -z REC_CARD ] && REC_CARD=default
- [ -z CHANNELS ] && CHANNELS=2
- echo "REC_CARD variable set to ${REC_CARD}"
- echo "Number of channels available: ${CHANNELS}"
-}
-
-
-configure() {
- get_RECS_DIR
- get_LATITUDE
- get_LONGITUDE
- get_DB_PWDS
- get_DO_EXTRACTIONS
- get_DO_RECORDING
- get_BIRDNETPI_URL
- get_PUSHED
- get_INSTALL_NOMACHINE
- get_CHANNELS
-}
-
-install_birdnet_conf() {
+install_config() {
cat << EOF > $(dirname ${my_dir})/birdnet.conf
################################################################################
# Configuration settings for BirdNET-Pi #
################################################################################
-############ CHANGE THE LATITUDE AND LONGITUDE TO STATIC VALUES ################
+#--------------------- Required: Latitude, and Longitude ----------------------#
+## The shell substitution below guesses these based on your network. THESE NEED
+## TO BE CHANGED TO STATIC VALUES
+## Please only go to 4 decimal places. Example:43.3984
-## LATITUDE and LONGITUDE are self-explanatroy. Find them easily at
-## maps.google.com.
-## Example: these coordinates would indicate the Eiffel Tower in Paris, France.
-## LATITUDE=48.858
-## LONGITUDE=2.294
+LATITUDE=$(curl -s4 ifconfig.co/json | awk '/lat/ {print $2}' | tr -d ',')
+LONGITUDE=$(curl -s4 ifconfig.co/json | awk '/lon/ {print $2}' | tr -d ',')
-## These are input as shell substitutions so that this will work out of the box.
-## It guesses your latitude and longitude based off of your network information.
-## THESE SHOULD BE CHANGED TO STATIC NUMBERS!!!!
-LATITUDE=${LATITUDE}
-LONGITUDE=${LONGITUDE}
+#--------------------- BirdWeather Station Information -----------------------#
+#_____________The variable below can be set to have your BirdNET-Pi____________#
+#__________________also act as a BirdWeather listening station_________________#
-## RECS_DIR is the location birdnet_analysis.service will look for the data-set
-## it needs to analyze. Be sure this directory is readable and writable for
-## the BIRDNET_USER. If you are going to be accessing a remote data-set, you
-## still need to set this, as this will be where the remote directory gets
-## mounted locally.
-
-RECS_DIR=${RECS_DIR}
+BIRDWEATHER_ID=
#----------------------- Web Interface User Password ------------------------#
-#____________________The variable below sets the 'birdnet'_____________________#
-#___________________user password for the live audio stream,___________________#
-#_________________web tools, system info, and processed files__________________#
+#____________________The variable below sets the 'birdnet'_____________________#
+#___________________user password for the Live Audio Stream,___________________#
+#_________________Tools, System Links, and the Processed files ________________#
## CADDY_PWD is the plaintext password (that will be hashed) and used to access
## certain parts of the web interface
-CADDY_PWD=${CADDY_PWD}
-
-#------------------------- MariaDB User Passwords ---------------------------#
-#_____________The variable below sets the password for the_____________________#
-#_______________________'birder' user on the MariaDB___________________________#
-
-## DB_PWD is for the 'birder' user
-DB_PWD=${DB_PWD}
+CADDY_PWD=
#------------------------- Live Audio Stream --------------------------------#
-#_____________The variable below configures/enables the live___________________#
+#_____________The variable below configures/enables the live___________________#
#_____________________________audio stream.____________________________________#
## ICE_PWD is the password that icecast2 will use to authenticate ffmpeg as a
## trusted source for the stream. You will never need to enter this manually
-## anywhere other than here.
+## anywhere other than here and it stays on 'localhost.'
-ICE_PWD=${ICE_PWD}
+ICE_PWD=birdnetpi
#----------------------- Web-hosting/Caddy File-server -----------------------#
-#________The four variables below can be set to enable internet access_________#
+#_______The three variables below can be set to enable internet access_________#
#____________to your data,(e.g., extractions, raw data, live___________________#
#______________audio stream, BirdNET.selection.txt files)______________________#
## BIRDNETPI_URL is the URL where the extractions, data-set, and live-stream
-## will be web-hosted. If you do not own a domain, or would just prefer to keep
+## will be web-hosted. If you do not own a domain, or would just prefer to keep
## the BirdNET-Pi on your local network, keep this EMPTY.
-BIRDNETPI_URL=${BIRDNETPI_URL}
-WEBTERMINAL_URL${WEBTERMINAL_URL}
-BIRDNETLOG_URL=${BIRDNETLOG_URL}
+BIRDNETPI_URL=
+BIRDNETLOG_URL=
+WEBTERMINAL_URL=
#------------------- Mobile Notifications via Pushed.co ---------------------#
@@ -251,97 +74,54 @@ BIRDNETLOG_URL=${BIRDNETLOG_URL}
## Pushed.co App Key and App Secret
-PUSHED_APP_KEY=${PUSHED_APP_KEY}
-PUSHED_APP_SECRET=${PUSHED_APP_SECRET}
+PUSHED_APP_KEY=
+PUSHED_APP_SECRET=
################################################################################
#-------------------------------- Defaults ----------------------------------#
################################################################################
-#------------------------------- NoMachine ----------------------------------#
-#_____________The variable below can be set include NoMachine__________________#
-#_________________remote desktop software to be installed._____________________#
+## RECS_DIR is the location birdnet_analysis.service will look for the data-set
+## it needs to analyze. Be sure this directory is readable and writable for
+## the BIRDNET_USER.
-# Keep this EMPTY if you do not want to install NoMachine. #
+RECS_DIR=/home/pi/BirdSongs
-## INSTALL_NOMACHINE is simply a setting that can be enabled to install
-## NoMachine alongside the BirdNET-Pi for remote desktop access. This in-
-## staller assumes personal use. Please reference the LICENSE file included
-## in this repository for more information.
-## Set this to Y or y to install NoMachine alongside the BirdNET-Lite
+## REC_CARD is the sound card you would want the birdnet_recording.service to
+## use. Leave this as "default" to use PulseAudio (recommended), or use
+## the output from "aplay -L" to specify an ALSA device.
-INSTALL_NOMACHINE=${INSTALL_NOMACHINE}
+REC_CARD=default
-#
-#------------------------------ Extraction Service ---------------------------#
-
-## DO_EXTRACTIONS is simply a setting for enabling the extraction.service.
-## Set this to Y or y to enable extractions.
-
-DO_EXTRACTIONS=${DO_EXTRACTIONS}
-
-#----------------------------- Recording Service ----------------------------#
-#____________________The variable below can be set to enable __________________#
-#________________________the birdnet_recording.service ________________________#
-
-## DO_RECORDING is simply a setting for enabling the 24/7
-## birdnet_recording.service.
-## Set this to Y or y to enable recording.
-
-DO_RECORDING=${DO_RECORDING}
-
-## REC_CARD is the sound card you would want the birdnet_recording.service to
-## use. This setting is irrelevant if you are not planning on doing data
-## collection via recording on this machine. The command substitution below
-## looks for a USB microphone's dsnoop alsa device. The dsnoop device lets
-## birdnet_recording.service and livestream.service share the raw audio stream
-## from the microphone. If you would like to use a different microphone than
-## what this produces, or if your microphone does not support creating a
-## dsnoop device, you can set this explicitly from a list of the available
-## devices from the output of running 'aplay -L'
-
-REC_CARD=${REC_CARD}
-
-## PROCESSED is the directory where the formerly 'Analyzed' files are moved
-## after extractions have been made from them. This includes both WAVE and
+## PROCESSED is the directory where the formerly 'Analyzed' files are moved
+## after extractions have been made from them. This includes both WAVE and
## BirdNET.selection.txt files.
-PROCESSED=${PROCESSED}
+PROCESSED=/home/pi/BirdSongs/Processed
## EXTRACTED is the directory where the extracted audio selections are moved.
-EXTRACTED=${EXTRACTED}
-
-## IDFILE is the file that keeps a complete list of every spececies that
-## BirdNET has identified from your data-set. It is persistent across
-## data-sets, so would need to be whiped clean through deleting or renaming
-## it. A backup is automatically made from this variable each time it is
-## updated (structure: ${IDFILE}.bak), and would also need to be removed
-## or renamed to start a new file between data-sets. Alternately, you can
-## change this variable between data-sets to preserve records of disparate
-## data-sets according to name.
-
-IDFILE=${IDFILE}
+EXTRACTED=/home/pi/BirdSongs/Extracted
## OVERLAP is the value in seconds which BirdNET should use when analyzing
## the data. The values must be between 0.0-2.9.
-OVERLAP=${OVERLAP}
+OVERLAP=0.0
-## CONFIDENCE is the minimum confidence level from 0.0-1.0 BirdNET's analysis
+## CONFIDENCE is the minimum confidence level from 0.0-1.0 BirdNET's analysis
## should reach before creating an entry in the BirdNET.selection.txt file.
## Don't set this to 1.0 or you won't have any results.
-CONFIDENCE=${CONFIDENCE}
+CONFIDENCE=0.7
## SENSITIVITY is the detection sensitivity from 0.5-1.5.
-SENSITIVITY=${SENSITIVITY}
+SENSITIVITY=1.25
-## CHANNELS holds the variabel that corresponds to the number of channels the
+## CHANNELS holds the variable that corresponds to the number of channels the
## sound card supports.
-CHANNELS=${CHANNELS}
+CHANNELS=2
## FULL_DISK can be set to configure how the system reacts to a full disk
## purge = Remove the oldest day's worth of recordings
@@ -349,46 +129,45 @@ CHANNELS=${CHANNELS}
FULL_DISK=purge
-## VENV is the virtual environment where the the BirdNET python build is found,
-## i.e, VENV is the virtual environment miniforge built for BirdNET.
+## RECORDING_LENGTH sets the length of the recording that BirdNET-Lite will
+## analyze.
-VENV=/home/pi/BirdNET-Pi/birdnet
-
-## RECORDING_LENGTH sets the length of the recording that BirdNET-Lite will analyze.
-RECORDING_LENGTH=${RECORDING_LENGTH}
+RECORDING_LENGTH=15
## EXTRACTION_LENGTH sets the length of the audio extractions that will be made
-## from each BirdNET-Lite detection.
-EXTRACTION_LENGTH=${EXTRACTION_LENGTH}
+## from each BirdNET-Lite detection. An empty value will use the default of 6
+## seconds.
-## BIRDNET_USER should be the non-root user systemd should use to execute each
+EXTRACTION_LENGTH=
+
+## AUDIOFMT set the audio format that sox should use for the extractions.
+## The default is mp3. Available formats are: 8svx aif aifc aiff aiffc al amb
+## amr-nb amr-wb anb au avr awb caf cdda cdr cvs cvsd cvu dat dvms f32 f4 f64 f8
+## fap flac fssd gsm gsrt hcom htk ima ircam la lpc lpc10 lu mat mat4 mat5 maud
+## mp2 mp3 nist ogg paf prc pvf raw s1 s16 s2 s24 s3 s32 s4 s8 sb sd2 sds sf sl
+## sln smp snd sndfile sndr sndt sou sox sph sw txw u1 u16 u2 u24 u3 u32 u4 u8
+## ub ul uw vms voc vorbis vox w64 wav wavpcm wv wve xa xi
+## Note: Most have not been tested.
+
+AUDIOFMT=mp3
+
+## BIRDNET_USER should be the non-root user systemd should use to execute each
## service.
BIRDNET_USER=pi
## These are just for debugging
-LAST_RUN=${LAST_RUN}
-THIS_RUN=${THIS_RUN}
+LAST_RUN=
+THIS_RUN=
+IDFILE=/home/pi/BirdNET-Pi/IdentifiedSoFar.txt
EOF
}
-# Checks for a birdnet.conf file in the BirdNET-Pi directory for a
-# non-interactive installation. Otherwise,the installation is interactive.
-if [ -f ${BIRDNET_CONF} ];then
- source ${BIRDNET_CONF}
- chmod g+w ${BIRDNET_CONF}
- sed -i "s/LATITUDE=.*/LATITUDE=${LATITUDE}/g" ${BIRDNET_CONF}
- sed -i "s/LONGITUDE=.*/LONGITUDE=${LONGITUDE}/g" ${BIRDNET_CONF}
- sed -i "s/DB_PWD=.*/DB_PWD=${DB_PWD}/g" ${BIRDNET_CONF}
- #install_birdnet_conf
- [ -d /etc/birdnet ] || sudo mkdir /etc/birdnet
- sudo ln -sf $(dirname ${my_dir})/birdnet.conf /etc/birdnet/birdnet.conf
- grep -ve '^#' -e '^$' /etc/birdnet/birdnet.conf > ${birdnetpi_dir}/firstrun.ini
-else
- configure
- install_birdnet_conf
- chmod g+w ${BIRDNET_CONF}
- [ -d /etc/birdnet ] || sudo mkdir /etc/birdnet
- sudo ln -sf $(dirname ${my_dir})/birdnet.conf /etc/birdnet/birdnet.conf
- grep -ve '^#' -e '^$' /etc/birdnet/birdnet.conf > ${birdnetpi_dir}/firstrun.ini
+# Checks for a birdnet.conf file
+if ! [ -f ${birdnet_conf} ];then
+ install_config
fi
+chmod g+w ${birdnet_conf}
+[ -d /etc/birdnet ] || sudo mkdir /etc/birdnet
+sudo ln -sf $(dirname ${my_dir})/birdnet.conf /etc/birdnet/birdnet.conf
+grep -ve '^#' -e '^$' /etc/birdnet/birdnet.conf > ${birdnetpi_dir}/firstrun.ini
diff --git a/scripts/install_services.sh b/scripts/install_services.sh
index 447b573..297fb51 100755
--- a/scripts/install_services.sh
+++ b/scripts/install_services.sh
@@ -7,60 +7,38 @@ USER=pi
HOME=/home/pi
my_dir=${HOME}/BirdNET-Pi/scripts
tmpfile=$(mktemp)
-nomachine_url="https://download.nomachine.com/download/7.7/Arm/nomachine_7.7.4_1_arm64.deb"
-gotty_url="https://github.com/yudai/gotty/releases/download/v1.0.1/gotty_linux_arm.tar.gz"
config_file="$(dirname ${my_dir})/birdnet.conf"
+install_depends() {
+ curl -1sLf \
+ 'https://dl.cloudsmith.io/public/caddy/stable/setup.deb.sh' \
+ | sudo -E bash
+ apt -qqq update && apt -qqy upgrade
+ echo "icecast2 icecast2/icecast-setup boolean false" | debconf-set-selections
+ apt install -qqy caddy ftpd sqlite3 php-sqlite3 alsa-utils \
+ pulseaudio avahi-utils sox libsox-fmt-mp3 php php-fpm php-curl php-xml \
+ php-zip icecast2 swig ffmpeg wget unzip curl cmake make bc libjpeg-dev \
+ zlib1g-dev python3-dev python3-pip python3-venv
+}
+
+
set_hostname() {
if [ "$(hostname)" == "raspberrypi" ];then
- echo "Setting hostname to 'birdnetpi'"
hostnamectl set-hostname birdnetpi
sed -i 's/raspberrypi/birdnetpi/g' /etc/hosts
fi
}
-install_lynx() {
- if ! which lynx &> /dev/null;then
- apt -y install lynx
- fi
-}
-
-install_ftpd() {
- if ! [ -f /etc/ftpuseres ];then
- apt -y install ftpd
- fi
-}
-
-update_system() {
- apt update && apt -y upgrade
+update_etc_hosts() {
+ sed -ie s/'$(hostname).local'/"$(hostname).local ${BIRDNETPI_URL//https:\/\/} ${WEBTERMINAL_URL//https:\/\/} ${BIRDNETLOG_URL//https:\/\/}"/g /etc/hosts
}
install_scripts() {
- echo "Installing BirdNET-Pi scripts to /usr/local/bin"
ln -sf ${my_dir}/* /usr/local/bin/
- rm /usr/local/bin/index.html
-}
-
-install_mariadb() {
- if ! which mysql &> /dev/null;then
- echo "Installing MariaDB Server"
- apt -qqy update
- apt -qqy install mariadb-server
- echo "MariaDB Installed"
- fi
- echo "Initializing the database"
- source /etc/os-release
- if [[ "${VERSION_CODENAME}" == "buster" ]];then
- USER=${USER} ${my_dir}/createdb_buster.sh
- elif [[ "${VERSION_CODENAME}" == "bullseye" ]];then
- USER=${USER} ${my_dir}/createdb_bullseye.sh
- fi
- systemctl restart php${php_version}-fpm
}
install_birdnet_analysis() {
- echo "Installing the birdnet_analysis.service"
- cat << EOF > /etc/systemd/system/birdnet_analysis.service
+ cat << EOF > /home/pi/BirdNET-Pi/templates/birdnet_analysis.service
[Unit]
Description=BirdNET Analysis
After=birdnet_server.service
@@ -74,12 +52,12 @@ ExecStart=/usr/local/bin/birdnet_analysis.sh
[Install]
WantedBy=multi-user.target
EOF
+ ln -sf /home/pi/BirdNET-Pi/templates/birdnet_analysis.service /usr/lib/systemd/system
systemctl enable birdnet_analysis.service
}
install_birdnet_server() {
- echo "Installing the birdnet_server.service"
- cat << EOF > /etc/systemd/system/birdnet_server.service
+ cat << EOF > /home/pi/BirdNET-Pi/templates/birdnet_server.service
[Unit]
Description=BirdNET Analysis Server
Before=birdnet_analysis.service
@@ -92,12 +70,12 @@ ExecStart=/usr/local/bin/server.py
[Install]
WantedBy=multi-user.target
EOF
+ ln -sf /home/pi/BirdNET-Pi/templates/birdnet_server.service /usr/lib/systemd/system
systemctl enable birdnet_server.service
}
install_extraction_service() {
- echo "Installing the extraction.service and extraction.timer"
- cat << EOF > /etc/systemd/system/extraction.service
+ cat << EOF > /home/pi/BirdNET-Pi/templates/extraction.service
[Unit]
Description=BirdNET BirdSound Extraction
[Service]
@@ -105,27 +83,16 @@ Restart=on-failure
RestartSec=3
Type=simple
User=${USER}
-ExecStart=/usr/local/bin/extract_new_birdsounds.sh
+ExecStart=/usr/bin/env bash -c 'while true;do extract_new_birdsounds.sh;sleep 3;done'
[Install]
WantedBy=multi-user.target
EOF
- cat << EOF > /etc/systemd/system/extraction.timer
-[Unit]
-Description=BirdNET BirdSound Extraction Timer
-Requires=extraction.service
-[Timer]
-Unit=extraction.service
-OnCalendar=*:*:0/10
-[Install]
-WantedBy=multi-user.target
-EOF
- systemctl enable extraction.timer
+ ln -sf /home/pi/BirdNET-Pi/templates/extraction.service /usr/lib/systemd/system
systemctl enable extraction.service
}
install_pushed_notifications() {
- echo "Installing Pushed.co mobile notifications"
- cat << EOF > /etc/systemd/system/pushed_notifications.service
+ cat << EOF > /home/pi/BirdNET-Pi/templates/pushed_notifications.service
[Unit]
Description=BirdNET-Pi Pushed.co Notifications
[Service]
@@ -137,6 +104,7 @@ ExecStart=/usr/local/bin/species_notifier.sh
[Install]
WantedBy=multi-user.target
EOF
+ ln -sf /home/pi/BirdNET-Pi/templates/pushed_notifications.service /usr/lib/systemd/system
systemctl enable pushed_notifications.service
}
@@ -144,61 +112,23 @@ create_necessary_dirs() {
echo "Creating necessary directories"
[ -d ${EXTRACTED} ] || sudo -u ${USER} mkdir -p ${EXTRACTED}
[ -d ${EXTRACTED}/By_Date ] || sudo -u ${USER} mkdir -p ${EXTRACTED}/By_Date
- [ -d ${EXTRACTED}/By_Common_Name ] || sudo -u ${USER} mkdir -p ${EXTRACTED}/By_Common_Name
- [ -d ${EXTRACTED}/By_Scientific_Name ] || sudo -u ${USER} mkdir -p ${EXTRACTED}/By_Scientific_Name
[ -d ${EXTRACTED}/Charts ] || sudo -u ${USER} mkdir -p ${EXTRACTED}/Charts
[ -d ${PROCESSED} ] || sudo -u ${USER} mkdir -p ${PROCESSED}
sudo -u ${USER} ln -fs $(dirname ${my_dir})/homepage/* ${EXTRACTED}
- if [ ! -z ${BIRDNETLOG_URL} ];then
- BIRDNETLOG_URL="$(echo ${BIRDNETLOG_URL} | sed 's/\/\//\\\/\\\//g')"
- sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local:8080/${BIRDNETLOG_URL}/g" $(dirname ${my_dir})/homepage/*.html
- sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local:8080/${BIRDNETLOG_URL}/g" $(dirname ${my_dir})/scripts/*.html
- sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local:8080/${BIRDNETLOG_URL}/g" $(dirname ${my_dir})/scripts/*.html
- sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local:8080/${BIRDNETLOG_URL}/g" $(dirname ${my_dir})/scripts/*.php
- sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local:8080/${BIRDNETLOG_URL}/g" $(dirname ${my_dir})/scripts/*/*.php
- fi
- if [ ! -z ${WEBTERMINAL_URL} ];then
- WEBTERMINAL_URL="$(echo ${WEBTERMINAL_URL} | sed 's/\/\//\\\/\\\//g')"
- sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local:8888/${WEBTERMINAL_URL}/g" $(dirname ${my_dir})/homepage/*.html
- sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local:8888/${WEBTERMINAL_URL}/g" $(dirname ${my_dir})/scripts/*.html
- sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local:8888/${WEBTERMINAL_URL}/g" $(dirname ${my_dir})/scripts/*.html
- sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local:8888/${WEBTERMINAL_URL}/g" $(dirname ${my_dir})/scripts/*.php
- sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local:8888/${WEBTERMINAL_URL}/g" $(dirname ${my_dir})/scripts/*/*.php
-
- fi
-
- sudo -u ${USER} ln -fs $(dirname ${my_dir})/model/labels.txt ${my_dir}/
+ sudo -u ${USER} ln -fs $(dirname ${my_dir})/model/labels.txt ${my_dir}
sudo -u ${USER} ln -fs $(dirname ${my_dir})/scripts ${EXTRACTED}
- if [ -z ${BIRDNETPI_URL} ];then
- sudo -u${USER} sed -i "s/birdnetpi.local/$(hostname).local/g" $(dirname ${my_dir})/homepage/*.html
- sudo -u${USER} sed -i "s/birdnetpi.local/$(hostname).local/g" $(dirname ${my_dir})/scripts/*.html
- sudo -u${USER} sed -i "s/birdnetpi.local/$(hostname).local/g" $(dirname ${my_dir})/scripts/*.html
- sudo -u${USER} sed -i "s/birdnetpi.local/$(hostname).local/g" $(dirname ${my_dir})/scripts/*.php
- sudo -u${USER} sed -i "s/birdnetpi.local/$(hostname).local/g" $(dirname ${my_dir})/scripts/*/*.php
- else
- BIRDNETPI_URL="$(echo ${BIRDNETPI_URL} | sed 's/\/\//\\\/\\\//g')"
- sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local/${BIRDNETPI_URL}/g" $(dirname ${my_dir})/homepage/*.html
- sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local/${BIRDNETPI_URL}/g" $(dirname ${my_dir})/scripts/*.html
- sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local/${BIRDNETPI_URL}/g" $(dirname ${my_dir})/scripts/*.html
- sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local/${BIRDNETPI_URL}/g" $(dirname ${my_dir})/scripts/*.php
- sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local/${BIRDNETPI_URL}/g" $(dirname ${my_dir})/scripts/*/*.php
- fi
-
+ sudo -u ${USER} ln -fs $(dirname ${my_dir})/scripts/play.php ${EXTRACTED}
sudo -u ${USER} ln -fs $(dirname ${my_dir})/scripts/spectrogram.php ${EXTRACTED}
- sudo -u ${USER} ln -fs $(dirname ${my_dir})/scripts/viewday.php ${EXTRACTED}
sudo -u ${USER} ln -fs $(dirname ${my_dir})/scripts/overview.php ${EXTRACTED}
sudo -u ${USER} ln -fs $(dirname ${my_dir})/scripts/stats.php ${EXTRACTED}
sudo -u ${USER} ln -fs $(dirname ${my_dir})/scripts/viewdb.php ${EXTRACTED}
sudo -u ${USER} ln -fs $(dirname ${my_dir})/scripts/history.php ${EXTRACTED}
sudo -u ${USER} ln -fs $(dirname ${my_dir})/homepage/images/favicon.ico ${EXTRACTED}
sudo -u ${USER} ln -fs ${HOME}/phpsysinfo ${EXTRACTED}
- sudo -u ${USER} cp -f $(dirname ${my_dir})/templates/phpsysinfo.ini ${HOME}/phpsysinfo/
- sudo -u ${USER} cp -f $(dirname ${my_dir})/templates/green_bootstrap.css ${HOME}/phpsysinfo/templates/
- sudo -u ${USER} cp -f $(dirname ${my_dir})/templates/index_bootstrap.html ${HOME}/phpsysinfo/templates/html
-
- echo "Setting Wttr.in URL to "${LATITUDE}", "${LONGITUDE}""
- sudo -u${USER} sed -i "s/https:\/\/v2.wttr.in\//https:\/\/v2.wttr.in\/"${LATITUDE},${LONGITUDE}"/g" $(dirname ${my_dir})/homepage/menu.html
+ sudo -u ${USER} ln -fs $(dirname ${my_dir})/templates/phpsysinfo.ini ${HOME}/phpsysinfo/
+ sudo -u ${USER} ln -fs $(dirname ${my_dir})/templates/green_bootstrap.css ${HOME}/phpsysinfo/templates/
+ sudo -u ${USER} ln -fs $(dirname ${my_dir})/templates/index_bootstrap.html ${HOME}/phpsysinfo/templates/html
chmod -R g+rw $(dirname ${my_dir})
chmod -R g+rw ${RECS_DIR}
}
@@ -212,27 +142,10 @@ generate_BirdDB() {
sudo -u ${USER} sed -i '1 i\Date;Time;Sci_Name;Com_Name;Confidence;Lat;Lon;Cutoff;Week;Sens;Overlap' $(dirname ${my_dir})/BirdDB.txt
fi
ln -sf $(dirname ${my_dir})/BirdDB.txt ${my_dir}/BirdDB.txt &&
- chown pi:pi ${my_dir}/BirdDB.txt && chmod g+rw ${my_dir}/BirdDB.txt
+ chown pi:pi ${my_dir}/BirdDB.txt && chmod g+rw ${my_dir}/BirdDB.txt
}
-install_alsa() {
- echo "Checking for alsa-utils and pulseaudio"
- if which arecord &> /dev/null ;then
- echo "alsa-utils installed"
- else
- echo "Installing alsa-utils"
- apt -qqq update
- apt install -qqy alsa-utils
- echo "alsa-utils installed"
- fi
- if which pulseaudio &> /dev/null;then
- echo "PulseAudio installed"
- else
- echo "Installing pulseaudio"
- apt -qqq update
- apt install -qqy pulseaudio
- echo "PulseAudio installed"
- fi
+set_login() {
if ! [ -d /etc/lightdm ];then
systemctl set-default multi-user.target
ln -fs /lib/systemd/system/getty@.service /etc/systemd/system/getty.target.wants/getty@tty1.service
@@ -246,7 +159,7 @@ EOF
install_recording_service() {
echo "Installing birdnet_recording.service"
- cat << EOF > /etc/systemd/system/birdnet_recording.service
+ cat << EOF > /home/pi/BirdNET-Pi/templates/birdnet_recording.service
[Unit]
Description=BirdNET Recording
[Service]
@@ -259,39 +172,45 @@ ExecStart=/usr/local/bin/birdnet_recording.sh
[Install]
WantedBy=multi-user.target
EOF
+ ln -sf /home/pi/BirdNET-Pi/templates/birdnet_recording.service /usr/lib/systemd/system
systemctl enable birdnet_recording.service
}
-install_caddy() {
- if ! which caddy &> /dev/null ;then
- echo "Installing Caddy"
- curl -1sLf \
- 'https://dl.cloudsmith.io/public/caddy/stable/setup.deb.sh' \
- | sudo -E bash
- apt -qq update
- apt install -qqy caddy=2.4.5 && apt-mark hold caddy
- systemctl enable --now caddy
- usermod -aG pi caddy
- else
- echo "Caddy is installed"
- systemctl enable --now caddy
- usermod -aG pi caddy
- fi
+install_custom_recording_service() {
+ echo "Installing custom_recording.service"
+ cat << EOF > /home/pi/BirdNET-Pi/templates/custom_recording.service
+[Unit]
+Description=BirdNET Custom Recording
+[Service]
+Environment=XDG_RUNTIME_DIR=/run/user/1000
+Restart=always
+Type=simple
+RestartSec=3
+User=${USER}
+ExecStart=/usr/local/bin/custom_recording.sh
+[Install]
+WantedBy=multi-user.target
+EOF
+ ln -sf /home/pi/BirdNET-Pi/templates/birdnet_recording.service /usr/lib/systemd/system
}
install_Caddyfile() {
- echo "Installing the Caddyfile"
[ -d /etc/caddy ] || mkdir /etc/caddy
if [ -f /etc/caddy/Caddyfile ];then
cp /etc/caddy/Caddyfile{,.original}
fi
- php_version="$(awk -F'php' '{print $3}' <(ls -l $(which /etc/alternatives/php)))"
if ! [ -z ${CADDY_PWD} ];then
HASHWORD=$(caddy hash-password -plaintext ${CADDY_PWD})
cat << EOF > /etc/caddy/Caddyfile
http://localhost http://$(hostname).local ${BIRDNETPI_URL} {
root * ${EXTRACTED}
file_server browse
+ handle /By_Date/* {
+ file_server browse
+ }
+ handle /Charts/* {
+ file_server browse
+ }
basicauth /Processed* {
birdnet ${HASHWORD}
}
@@ -304,8 +223,14 @@ http://localhost http://$(hostname).local ${BIRDNETPI_URL} {
basicauth /phpsysinfo* {
birdnet ${HASHWORD}
}
+ basicauth /terminal* {
+ birdnet ${HASHWORD}
+ }
reverse_proxy /stream localhost:8000
- php_fastcgi unix//run/php/php${php_version}-fpm.sock
+ php_fastcgi unix//run/php/php7.4-fpm.sock
+ reverse_proxy /log* localhost:8080
+ reverse_proxy /stats* localhost:8501
+ reverse_proxy /terminal* localhost:8888
}
EOF
else
@@ -313,51 +238,27 @@ EOF
http://localhost http://$(hostname).local ${BIRDNETPI_URL} {
root * ${EXTRACTED}
file_server browse
- reverse_proxy /stream localhost:8000
- php_fastcgi unix//run/php/php${php_version}-fpm.sock
-}
-EOF
- fi
-
- if [ ! -z ${WEBTERMINAL_URL} ] && [ ! -z ${HASHWORD} ];then
- cat << EOF >> /etc/caddy/Caddyfile
-${WEBTERMINAL_URL} {
- basicauth {
- birdnet ${HASHWORD}
+ handle /By_Date/* {
+ file_server browse
}
- reverse_proxy localhost:8888
-}
-EOF
- elif [ ! -z ${WEBTERMINAL_URL} ] && [ -z ${HASHWORD} ];then
- cat << EOF >> /etc/caddy/Caddyfile
-${WEBTERMINAL_URL} {
- reverse_proxy localhost:8888
+ handle /Charts/* {
+ file_server browse
+ }
+ reverse_proxy /stream localhost:8000
+ php_fastcgi unix//run/php/php7.4-fpm.sock
+ reverse_proxy /log* localhost:8080
+ reverse_proxy /stats* localhost:8501
+ reverse_proxy /terminal* localhost:8888
}
EOF
fi
- if [ ! -z ${BIRDNETLOG_URL} ];then
- cat << EOF >> /etc/caddy/Caddyfile
-${BIRDNETLOG_URL} {
- reverse_proxy localhost:8080
-}
-EOF
- fi
- systemctl reload caddy
-}
-
-update_etc_hosts() {
- sed -ie s/'$(hostname).local'/"$(hostname).local ${BIRDNETPI_URL//https:\/\/} ${WEBTERMINAL_URL//https:\/\/} ${BIRDNETLOG_URL//https:\/\/}"/g /etc/hosts
+ systemctl enable caddy
+ usermod -aG pi caddy
}
install_avahi_aliases() {
- echo "Installing Avahi Services"
- if ! which avahi-publish &> /dev/null; then
- echo "Installing avahi-utils"
- apt install -y avahi-utils &> /dev/null
- fi
- echo "Installing avahi-alias service"
- cat << 'EOF' > /etc/systemd/system/avahi-alias@.service
+ cat << 'EOF' > /home/pi/BirdNET-Pi/templates/avahi-alias@.service
[Unit]
Description=Publish %I as alias for %H.local via mdns
After=network.target network-online.target
@@ -370,11 +271,30 @@ ExecStart=/bin/bash -c "/usr/bin/avahi-publish -a -R %I $(hostname -I |cut -d' '
[Install]
WantedBy=multi-user.target
EOF
-systemctl enable avahi-alias@"$(hostname)".local.service
+ ln -sf /home/pi/BirdNET-Pi/templates/avahi-alias@.service /usr/lib/systemd/system
+ systemctl enable avahi-alias@"$(hostname)".local.service
+}
+
+install_birdnet_stats_service() {
+ cat << EOF > /home/pi/BirdNET-Pi/templates/birdnet_stats.service
+[Unit]
+Description=BirdNET Stats
+[Service]
+Restart=on-failure
+RestartSec=5
+Type=simple
+User=${USER}
+ExecStart=/home/pi/BirdNET-Pi/birdnet/bin/streamlit run /home/pi/BirdNET-Pi/scripts/plotly_streamlit.py --server.address localhost --server.baseUrlPath "/stats"
+
+[Install]
+WantedBy=multi-user.target
+EOF
+ ln -sf /home/pi/BirdNET-Pi/templates/birdnet_stats.service /usr/lib/systemd/system
+ systemctl enable birdnet_stats.service
}
install_spectrogram_service() {
- cat << EOF > /etc/systemd/system/spectrogram_viewer.service
+ cat << EOF > /home/pi/BirdNET-Pi/templates/spectrogram_viewer.service
[Unit]
Description=BirdNET-Pi Spectrogram Viewer
[Service]
@@ -386,12 +306,13 @@ ExecStart=/usr/local/bin/spectrogram.sh
[Install]
WantedBy=multi-user.target
EOF
- systemctl enable spectrogram_viewer.service
+ ln -sf /home/pi/BirdNET-Pi/templates/spectrogram_viewer.service /usr/lib/systemd/system
+ systemctl enable spectrogram_viewer.service
}
install_chart_viewer_service() {
echo "Installing the chart_viewer.service"
- cat << EOF > /etc/systemd/system/chart_viewer.service
+ cat << EOF > /home/pi/BirdNET-Pi/templates/chart_viewer.service
[Unit]
Description=BirdNET-Pi Chart Viewer Service
[Service]
@@ -403,21 +324,16 @@ ExecStart=/usr/local/bin/daily_plot.py
[Install]
WantedBy=multi-user.target
EOF
+ ln -sf /home/pi/BirdNET-Pi/templates/chart_viewer.service /usr/lib/systemd/system
systemctl enable chart_viewer.service
}
install_gotty_logs() {
- echo "Installing GoTTY logging"
- if ! which gotty &> /dev/null;then
- echo "Installing GoTTY binary"
- wget -c ${gotty_url} -O - | tar -xz -C /usr/local/bin/
- fi
sudo -u ${USER} ln -sf $(dirname ${my_dir})/templates/gotty \
${HOME}/.gotty
sudo -u ${USER} ln -sf $(dirname ${my_dir})/templates/bashrc \
${HOME}/.bashrc
- echo "Installing the birdnet_log.service"
- cat << EOF > /etc/systemd/system/birdnet_log.service
+ cat << EOF > /home/pi/BirdNET-Pi/templates/birdnet_log.service
[Unit]
Description=BirdNET Analysis Log
[Service]
@@ -426,13 +342,13 @@ RestartSec=3
Type=simple
User=${USER}
Environment=TERM=xterm-256color
-ExecStart=/usr/local/bin/gotty -p 8080 --title-format "BirdNET-Pi Log" birdnet_log.sh
+ExecStart=/usr/local/bin/gotty --address localhost -p 8080 -P log --title-format "BirdNET-Pi Log" birdnet_log.sh
[Install]
WantedBy=multi-user.target
EOF
+ ln -sf /home/pi/BirdNET-Pi/templates/birdnet_log.service /usr/lib/systemd/system
systemctl enable birdnet_log.service
- echo "Installing the web_terminal.service"
- cat << EOF > /etc/systemd/system/web_terminal.service
+ cat << EOF > /home/pi/BirdNET-Pi/templates/web_terminal.service
[Unit]
Description=BirdNET-Pi Web Terminal
[Service]
@@ -441,62 +357,28 @@ RestartSec=3
Type=simple
User=${USER}
Environment=TERM=xterm-256color
-ExecStart=/usr/local/bin/gotty -w -p 8888 --title-format "BirdNET-Pi Terminal" bash
+ExecStart=/usr/local/bin/gotty --address localhost -w -p 8888 -P terminal --title-format "BirdNET-Pi Terminal" bash
[Install]
WantedBy=multi-user.target
EOF
+ ln -sf /home/pi/BirdNET-Pi/templates/web_terminal.service /usr/lib/systemd/system
systemctl enable web_terminal.service
}
-install_sox() {
- if which sox | grep mp3 &> /dev/null;then
- echo "Sox is installed"
- else
- echo "Installing sox"
- apt -qq update
- apt install -y sox libsox-fmt-mp3
- echo "Sox installed"
- fi
-}
-
-install_php() {
- if ! which php &> /dev/null || ! which php-fpm || ! apt list --installed | grep php-xml;then
- echo "Installing PHP modules"
- apt -qq update
- apt install -qqy php php-fpm php-mysql php-xml php-zip
- else
- echo "PHP and PHP-FPM installed"
- fi
- echo "Configuring PHP for Caddy"
- sed -i 's/www-data/caddy/g' /etc/php/*/fpm/pool.d/www.conf
- systemctl restart php7\*-fpm.service
- echo "Adding Caddy sudoers rule"
- cat << EOF > /etc/sudoers.d/010_caddy-nopasswd
+configure_caddy_php() {
+ echo "Configuring PHP for Caddy"
+ sed -i 's/www-data/caddy/g' /etc/php/*/fpm/pool.d/www.conf
+ systemctl restart php7\*-fpm.service
+ echo "Adding Caddy sudoers rule"
+ cat << EOF > /etc/sudoers.d/010_caddy-nopasswd
caddy ALL=(ALL) NOPASSWD: ALL
EOF
- chmod 0440 /etc/sudoers.d/010_caddy-nopasswd
- if [ ! -d ${HOME}/phpsysinfo ];then
- echo "Fetching phpSysInfo"
- sudo -u ${USER} git clone https://github.com/phpsysinfo/phpsysinfo.git \
- ${HOME}/phpsysinfo
- fi
+ chmod 0440 /etc/sudoers.d/010_caddy-nopasswd
}
-install_icecast() {
- if ! which icecast2;then
- echo "Installing IceCast2"
- apt -qq update
- echo "icecast2 icecast2/icecast-setup boolean false" | debconf-set-selections
- apt install -qqy icecast2
- config_icecast
- systemctl enable icecast2.service
- /etc/init.d/icecast2 start
- else
- echo "Icecast2 is installed"
- config_icecast
- systemctl enable icecast2.service
- /etc/init.d/icecast2 start
- fi
+install_phpsysinfo() {
+ sudo -u ${USER} git clone https://github.com/phpsysinfo/phpsysinfo.git \
+ ${HOME}/phpsysinfo
}
config_icecast() {
@@ -508,11 +390,11 @@ config_icecast() {
for i in "${passwords[@]}";do
sed -i "s/<${i}password>.*<\/${i}password>/<${i}password>${ICE_PWD}<\/${i}password>/g" /etc/icecast2/icecast.xml
done
+ systemctl enable icecast2.service
}
install_livestream_service() {
- echo "Installing Live Stream service"
- cat << EOF > /etc/systemd/system/livestream.service
+ cat << EOF > /home/pi/BirdNET-Pi/templates/livestream.service
[Unit]
Description=BirdNET-Pi Live Stream
After=network-online.target
@@ -527,72 +409,47 @@ ExecStart=/usr/local/bin/livestream.sh
[Install]
WantedBy=multi-user.target
EOF
+ ln -sf /home/pi/BirdNET-Pi/templates/livestream.service /usr/lib/systemd/system
systemctl enable livestream.service
}
-install_nomachine() {
- if [ ! -d /usr/share/NX ] && [ -d /etc/lightdm ];then
- echo "Installing NoMachine"
- curl -s -o ${HOME}/nomachine.deb -O "${nomachine_url}"
- apt install -y ${HOME}/nomachine.deb
- rm -f ${HOME}/nomachine.deb
- echo "Enabling VNC"
- systemctl enable --now vncserver-x11-serviced.service
- fi
-}
-
install_cleanup_cron() {
- echo "Installing the cleanup.cron"
cat $(dirname ${my_dir})/templates/cleanup.cron >> /etc/crontab
}
-install_selected_services() {
+install_services() {
set_hostname
- update_system
+ update_etc_hosts
+ set_login
+
+ install_depends
install_scripts
+ install_Caddyfile
+ install_avahi_aliases
install_birdnet_analysis
install_birdnet_server
-
- if [[ "${DO_EXTRACTIONS}" =~ [Yy] ]];then
- install_extraction_service
- fi
-
- if [[ "${DO_RECORDING}" =~ [Yy] ]];then
- install_alsa
- install_recording_service
- fi
-
- install_php
- install_caddy
- install_Caddyfile
- update_etc_hosts
- install_avahi_aliases
- install_gotty_logs
- install_sox
- install_mariadb
- install_spectrogram_service
- install_chart_viewer_service
- install_pushed_notifications
-
- if [ ! -z "${ICE_PWD}" ];then
- install_icecast
- install_livestream_service
- fi
-
- if [[ "${INSTALL_NOMACHINE}" =~ [Yy] ]];then
- install_nomachine
- fi
+ install_birdnet_stats_service
+ install_recording_service
+ install_custom_recording_service # But does not enable
+ install_extraction_service
+ install_pushed_notifications
+ install_spectrogram_service
+ install_chart_viewer_service
+ install_gotty_logs
+ install_phpsysinfo
+ install_livestream_service
+ install_cleanup_cron
create_necessary_dirs
generate_BirdDB
- install_cleanup_cron
- install_ftpd
- install_lynx
+ configure_caddy_php
+ config_icecast
+ ${my_dir}/createdb.sh
}
if [ -f ${config_file} ];then
source ${config_file}
- install_selected_services
+ install_services
else
echo "Unable to find a configuration file. Please make sure that $config_file exists."
fi
diff --git a/scripts/overview.php b/scripts/overview.php
index 8db3bf5..cb06cdc 100644
--- a/scripts/overview.php
+++ b/scripts/overview.php
@@ -5,133 +5,131 @@ error_reporting(E_ALL);
header("refresh: 300;");
$myDate = date('Y-m-d');
$chart = "Combo-$myDate.png";
-$mysqli = mysqli_connect();
-$mysqli->select_db('birds');
-if ($mysqli->connect_error) {
- die('Connect Error (' .
- $mysqli->connect_errno . ') '.
- $mysqli->connect_error);
+$db = new SQLite3('/home/pi/BirdNET-Pi/scripts/birds.db', SQLITE3_OPEN_CREATE | SQLITE3_OPEN_READWRITE);
+if($db == False) {
+ echo "Database is busy";
+ header("refresh: 0;");
}
-// SQL query to select data from database
-$sql0 = "SELECT COUNT(*) AS 'Total' FROM detections";
-$totalcount = $mysqli->query($sql0);
+$statement = $db->prepare('SELECT COUNT(*) FROM detections');
+if($statement == False) {
+ echo "Database is busy";
+ header("refresh: 0;");
+}
+$result = $statement->execute();
+$totalcount = $result->fetchArray(SQLITE3_ASSOC);
-$sql1 = "SELECT Com_Name, Sci_Name, Date, Time FROM detections
- ORDER BY Date DESC, Time DESC LIMIT 1";
-$mostrecent = $mysqli->query($sql1);
+$statement2 = $db->prepare('SELECT COUNT(*) FROM detections WHERE Date == DATE(\'now\', \'localtime\')');
+if($statement2 == False) {
+ echo "Database is busy";
+ header("refresh: 0;");
+}
+$result2 = $statement2->execute();
+$todaycount = $result2->fetchArray(SQLITE3_ASSOC);
-$sql2 = "SELECT COUNT(*) AS 'Total' FROM detections
- WHERE Date = CURDATE()";
-$todayscount = $mysqli->query($sql2);
+$statement3 = $db->prepare('SELECT COUNT(*) FROM detections WHERE Date == Date(\'now\', \'localtime\') AND TIME >= TIME(\'now\', \'localtime\', \'-1 hour\')');
+if($statement3 == False) {
+ echo "Database is busy";
+ header("refresh: 0;");
+}
+$result3 = $statement3->execute();
+$hourcount = $result3->fetchArray(SQLITE3_ASSOC);
-$sql3 = "SELECT COUNT(*) AS 'Total' FROM detections
- WHERE Date = CURDATE()
- AND Time >= DATE_SUB(NOW(),INTERVAL 1 HOUR)";
-$lasthourcount = $mysqli->query($sql3);
+$statement4 = $db->prepare('SELECT Com_Name, Sci_Name, Date, Time, Confidence, File_Name FROM detections ORDER BY Date DESC, Time DESC LIMIT 1');
+if($statement4 == False) {
+ echo "Database is busy";
+ header("refresh: 0;");
+}
+$result4 = $statement4->execute();
+$mostrecent = $result4->fetchArray(SQLITE3_ASSOC);
+$comname = preg_replace('/ /', '_', $mostrecent['Com_Name']);
+$sciname = preg_replace('/ /', '_', $mostrecent['Sci_Name']);
+$comname = preg_replace('/\'/', '', $comname);
+$filename = "/By_Date/".$mostrecent['Date']."/".$comname."/".$mostrecent['File_Name'];
-$sql4 = "SELECT Com_Name
- FROM detections
- WHERE Date = CURDATE()
- GROUP BY Com_Name";
-$specieslist = $mysqli->query($sql4);
-$speciescount = mysqli_num_rows($specieslist);
+$statement5 = $db->prepare('SELECT COUNT(DISTINCT(Com_Name)) FROM detections WHERE Date == Date(\'now\',\'localtime\')');
+if($statement5 == False) {
+ echo "Database is busy";
+ header("refresh: 0;");
+}
+$result5 = $statement5->execute();
+$speciestally = $result5->fetchArray(SQLITE3_ASSOC);
-$mysqli->close();
+$statement6 = $db->prepare('SELECT COUNT(DISTINCT(Com_Name)) FROM detections');
+if($statement6 == False) {
+ echo "Database is busy";
+ header("refresh: 0;");
+}
+$result6 = $statement6->execute();
+$totalspeciestally = $result6->fetchArray(SQLITE3_ASSOC);
?>
-
-
-
-
Overview
-
-
-
-
-
- Overview
-
-
-fetch_assoc())
-{
- $dbname = preg_replace('/ /', '_', $rows['Com_Name']);
- $dbname = preg_replace('/\'/', '', $dbname);
- $dbsciname = preg_replace('/ /', '_', $rows['Sci_Name']);
-?>
-
-
- Most Recent Detection
-
-
-
- More Info
-
-
-
-
-
-
-
-
-
-
-
- Total
- Today
- Last Hour
-
-
- Number of Detections
- fetch_assoc()) { echo $row['Total']; };?>
- fetch_assoc()) { echo $row['Total']; };?>
- fetch_assoc()) { echo $row['Total']; };?>
-
-
-
-
-
-
- Species Detected Today
-
-
-
-
+
+
+
+
+
+ Total
+
+
+
+ Today
+
+
+
+
+
+ Last Hour
+
+
+
+ Species Detected Today
+
+
+
+
+
+ Total Number of Species
+
+
+
+
+
+
+
";
+ echo "
";
} else {
- echo "
No Detections For Today
";
+ echo "
No Detections For Today
";
}
?>
-
Currently Analyzing
-
-
+
+
+ Most Recent Detection:
+
+
+
+
+ :
+
+ Confidence:
+ " preload="none" title="">
+
+
+
+
Currently Analyzing
+
+
+
diff --git a/scripts/play.php b/scripts/play.php
new file mode 100644
index 0000000..a007341
--- /dev/null
+++ b/scripts/play.php
@@ -0,0 +1,153 @@
+prepare('SELECT DISTINCT(Date) FROM detections GROUP BY Date');
+ if($statement == False){
+ echo "Database is busy";
+ header("refresh: 0;");
+ }
+ $result = $statement->execute();
+ $view = "bydate";
+
+ #Specific Date
+} elseif(isset($_POST['date'])) {
+ $date = $_POST['date'];
+ session_start();
+ $_SESSION['date'] = $date;
+ $statement = $db->prepare("SELECT DISTINCT(Com_Name) FROM detections WHERE Date == \"$date\" ORDER BY Com_Name");
+ if($statement == False){
+ echo "Database is busy";
+ header("refresh: 0;");
+ }
+ $result = $statement->execute();
+ $view = "date";
+
+ #By Species
+} elseif(isset($_POST['byspecies'])) {
+ $statement = $db->prepare('SELECT DISTINCT(Com_Name) FROM detections ORDER BY Com_Name');
+ session_start();
+ if($statement == False){
+ echo "Database is busy";
+ header("refresh: 0;");
+ }
+ $result = $statement->execute();
+ $view = "byspecies";
+
+ #Specific Species
+} elseif(isset($_POST['species'])) {
+ $species = $_POST['species'];
+ session_start();
+ $_SESSION['species'] = $species;
+ $statement = $db->prepare("SELECT * FROM detections WHERE Com_Name == \"$species\" ORDER BY Com_Name");
+ $statement3 = $db->prepare("SELECT Date, Time, Sci_Name, MAX(Confidence), File_Name FROM detections WHERE Com_Name == \"$species\" ORDER BY Com_Name");
+ if($statement == False || $statement3 == False){
+ echo "Database is busy";
+ header("refresh: 0;");
+ }
+ $result = $statement->execute();
+ $result3 = $statement3->execute();
+ $view = "species";
+} else {
+ session_start();
+ session_unset();
+ $view = "choose";
+}
+
+?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+fetchArray(SQLITE3_ASSOC)){
+ $date = $results['Date'];
+ echo "
+ $date ";}
+
+ #By Species
+ } elseif($view == "byspecies") {
+ while($results=$result->fetchArray(SQLITE3_ASSOC)){
+ $name = $results['Com_Name'];
+ echo "
+ $name ";}
+
+ #Specific Date
+ } elseif($view == "date") {
+ while($results=$result->fetchArray(SQLITE3_ASSOC)){
+ $name = $results['Com_Name'];
+ echo "
+ $name ";}
+
+ #Choose
+ } else {
+ echo "
+ By Species
+ By Date ";
+ }
+
+ echo "
+
+
";
+}
+
+#Specific Species
+if(isset($_POST['species'])){
+ $name = $_POST['species'];
+ if(isset($_SESSION['date'])) {
+ $date = $_SESSION['date'];
+ $statement2 = $db->prepare("SELECT * FROM detections where Com_Name == \"$name\" AND Date == \"$date\" ORDER BY Time DESC");
+ } else {
+ $statement2 = $db->prepare("SELECT * FROM detections where Com_Name == \"$name\" ORDER BY Date DESC, Time DESC");}
+ if($statement2 == False){
+ echo "Database is busy";
+ header("refresh: 0;");
+ }
+ $result2 = $statement2->execute();
+ echo "
+
+ $name
+ ";
+ while($results=$result2->fetchArray(SQLITE3_ASSOC))
+ {
+ $comname = preg_replace('/ /', '_', $results['Com_Name']);
+ $comname = preg_replace('/\'/', '', $comname);
+ $date = $results['Date'];
+ $filename = "/By_Date/".$date."/".$comname."/".$results['File_Name'];
+ $sciname = preg_replace('/ /', '_', $results['Sci_Name']);
+ $sci_name = $results['Sci_Name'];
+ $time = $results['Time'];
+ $confidence = $results['Confidence'];
+ echo "
+ $date $time $confidence
+
+ ";
+
+ }echo "
";}?>
+
+
diff --git a/scripts/plotly_streamlit.py b/scripts/plotly_streamlit.py
new file mode 100755
index 0000000..507d872
--- /dev/null
+++ b/scripts/plotly_streamlit.py
@@ -0,0 +1,184 @@
+#!/home/pi/BirdNET-Pi/birdnet/bin/python3
+import streamlit as st
+import pandas as pd
+import numpy as np
+import plotly.graph_objects as go
+from plotly.subplots import make_subplots
+from datetime import timedelta, datetime
+from pathlib import Path
+import sqlite3
+from sqlite3 import Connection
+
+URI_SQLITE_DB = "/home/pi/BirdNET-Pi/scripts/birds.db"
+
+st.set_page_config(layout='wide')
+
+# Remove whitespace from the top of the page and sidebar
+st.markdown("""
+
+ """, unsafe_allow_html=True)
+
+col1,col2,col3 = st.columns([20,20,20])
+
+col1.title('BirdNET-Pi', anchor=None)
+col2.image('/home/pi/BirdNET-Pi/homepage/images/bird.png')
+col3.text('')
+
+
+@st.cache(hash_funcs={Connection: id})
+def get_connection(path:str):
+ return sqlite3.connect(path,check_same_thread=False)
+
+
+
+
+# def load_data():
+# df1 = pd.read_csv('/home/pi/BirdNET-Pi/BirdDB.txt', sep=';')
+# return df1
+
+def get_data(conn: Connection):
+ df1=pd.read_sql("SELECT * FROM detections", con=conn)
+ return df1
+
+conn = get_connection(URI_SQLITE_DB)
+# Read in the cereal data
+# df = load_data()
+df=get_data(conn)
+df2=df.copy()
+df2['DateTime']=pd.to_datetime(df2['Date'] + " " + df2['Time'])
+df2=df2.set_index('DateTime')
+
+
+
+# Filter on date range
+# Date as calendars
+# Start_Date = pd.to_datetime(st.sidebar.date_input('Which date do you want to start?', value = df2.index.min()))
+# End_Date = pd.to_datetime(st.sidebar.date_input('Which date do you want to end?', value = df2.index.max()))
+
+# Date as slider
+Start_Date = pd.to_datetime(df2.index.min()).date()
+End_Date = pd.to_datetime(df2.index.max()).date()
+Date_Slider = st.slider('Date Range',
+ min_value = Start_Date-timedelta(days=1),
+ max_value = End_Date,
+ value=(Start_Date,
+ End_Date)
+ )
+
+
+
+filt = (df2.index >= pd.Timestamp(Date_Slider[0])) & (df2.index <= pd.Timestamp(Date_Slider[1]+timedelta(days=1)))
+df2 = df2[filt]
+
+#Create species count for selected date range
+
+Specie_Count=df2['Com_Name'].value_counts()
+
+#Create species treemap
+
+# Create Hourly Crosstab
+hourly=pd.crosstab(df2['Com_Name'],df2.index.hour, dropna=False)
+
+# Filter on species
+species = list(hourly.index)
+
+cols1,cols2= st.columns((1,1))
+top_N = cols1.slider(
+ 'Select Number of Birds to Show',
+ min_value = 1,
+ value=min(10,len(Specie_Count))
+ )
+
+top_N_species = (df2['Com_Name'].value_counts()[:top_N])
+
+
+specie = cols2.selectbox('Which bird would you like to explore for the dates '+str(Date_Slider[0])+' to '+str(Date_Slider[1])+'?', species,
+ index=species.index(list(top_N_species.index)[0]))
+
+
+font_size=15
+
+
+#specie filter
+filt=df2['Com_Name']==specie
+
+df_counts=df2[filt].resample('D').count()
+
+fig = make_subplots(
+ rows=3, cols =2,
+ specs= [[{"type":"xy","rowspan":3}, {"type":"polar","rowspan":2}], [{"rowspan":1}, {"rowspan":1} ], [None, {"type":"xy","rowspan":1}]],
+ subplot_titles=('
Top '+ str(top_N) + ' Species in Date Range '+str(Date_Slider[0])+' to '+str(Date_Slider[1])+' ',
+ 'Total Detect:'+str('{:,}'.format(sum(df_counts.Time)))+
+ ' Confidence Max:'+str('{:.2f}%'.format(max(df2[df2['Com_Name']==specie]['Confidence'])*100))+
+ ' '+' Median:'+str('{:.2f}%'.format(np.median(df2[df2['Com_Name']==specie]['Confidence'])*100))
+ )
+ )
+fig.layout.annotations[1].update(x=0.7,y=0.25, font_size=15)
+
+#Plot seen species for selected date range and number of species
+fig.add_trace(go.Bar(y=top_N_species.index, x=top_N_species, orientation='h'), row=1,col=1)
+
+fig.update_layout(
+ margin=dict(l=0, r=0, t=50, b=0),
+ yaxis={'categoryorder':'total ascending'})
+# Set 360 degrees, 24 hours for polar plot
+theta = np.linspace(0.0, 360, 24, endpoint=False)
+
+d=pd.DataFrame(np.zeros((23,1))).squeeze()
+detections = hourly.loc[specie]
+detections=(d+detections).fillna(0)
+fig.add_trace(go.Barpolar(r = detections, theta=theta), row=1, col=2)
+
+fig.update_layout(
+ autosize=False,
+ width = 1000,
+ height = 500,
+ showlegend=False,
+ polar = dict(
+ radialaxis = dict(
+ tickfont_size = font_size,
+ showticklabels = True,
+ hoverformat = "#%{theta}:
Popularity: %{percent} %{r}"
+ ),
+ angularaxis = dict(
+ tickfont_size= font_size,
+ rotation = -90,
+ direction = 'clockwise',
+ tickmode='array',
+ tickvals=[0,15,35,45,60,75,90,105,120,135,150,165,180,195,210,225,240,255,270,285,300,315,330,345],
+ ticktext=['12am','1am','2am','3am','4am','5am', '6am','7am','8am','9am','10am','11am','12pm','1pm','2pm','3pm','4pm','5pm', '6pm','7pm','8pm','9pm','10pm','11pm'],
+ hoverformat = "#%{theta}:
Popularity: %{percent} %{r}"
+ ),
+ ),
+ )
+
+
+
+daily=pd.crosstab(df2['Com_Name'],df2.index.date, dropna=False)
+
+fig.add_trace(go.Bar(x=daily.columns, y=daily.loc[specie]), row=3, col=2)
+
+# container=st.container()
+# config={'displayModelBar': False}
+st.plotly_chart(fig, use_container_width=True) #, config=config)
+
+# cols3,cols4=st.columns((1,1))
+#
+# extract_date=Date_Slider
+#
+# audio_file = open('/home/pi/BirdSongs/Extracted/By_Date/2022-03-22/Yellow-streaked_Greenbul/Yellow-streaked_Greenbul-77-2022-03-22-birdnet-15:04:28.mp3', 'rb')
+# audio_bytes = audio_file.read()
+# cols4.audio(audio_bytes, format='audio/mp3')
\ No newline at end of file
diff --git a/scripts/rebuild_db.sh b/scripts/rebuild_db.sh
deleted file mode 100755
index d73536a..0000000
--- a/scripts/rebuild_db.sh
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/usr/bin/env bash
-# Rebuild DB from BirdDB.txt
-source /etc/birdnet/birdnet.conf
-BIRDNET_DIR=/home/pi/BirdNET-Pi
-sudo ${BIRDNET_DIR}/scripts/createdb_bullseye.sh
-sudo mysql birds -e "
- LOAD DATA LOCAL INFILE '/home/pi/BirdNET-Pi/BirdDB.txt'
- INTO TABLE detections
- FIELDS TERMINATED BY ';'"
diff --git a/scripts/restart_services.sh b/scripts/restart_services.sh
index fe618b9..cb5384b 100755
--- a/scripts/restart_services.sh
+++ b/scripts/restart_services.sh
@@ -13,7 +13,6 @@ spectrogram_viewer.service
pushed_notifications.service
livestream.service
icecast2.service
-extraction.timer
extraction.service
chart_viewer.service
birdnet_recording.service
@@ -24,6 +23,6 @@ sudo systemctl restart "${i}"
done
until grep 5050 <(netstat -tulpn 2>&1);do
sudo systemctl restart birdnet_server.service
-sleep 30
+sleep 45
done
sudo systemctl restart birdnet_analysis.service
diff --git a/scripts/rewrite_config.sh b/scripts/rewrite_config.sh
deleted file mode 100755
index 2f684ce..0000000
--- a/scripts/rewrite_config.sh
+++ /dev/null
@@ -1,43 +0,0 @@
-#!/usr/bin/bash
-# Writes variables to config file
-set -x
-birdnetpi_dir=/home/pi/BirdNET-Pi
-birdnet_conf=${birdnetpi_dir}/birdnet.conf
-
-if ! [ -z ${new_lat} ];then
-sed -i s/'^LATITUDE=.*'/"LATITUDE=${new_lat}"/g ${birdnet_conf}
-fi
-
-if ! [ -z ${new_lon} ];then
-sed -i s/'^LONGITUDE=.*'/"LONGITUDE=${new_lon}"/g ${birdnet_conf}
-fi
-
-if ! [ -z ${caddy_pwd} ];then
-sed -i s/'^CADDY_PWD=.*'/"CADDY_PWD=${caddy_pwd}"/g ${birdnet_conf}
-hash_pwd=$(caddy hash-password -plaintext ${caddy_pwd})
-sudo sed -i s/'birdnet\ .*'/"birdnet ${hash_pwd}"/g /etc/caddy/Caddyfile
-sudo systemctl reload caddy
-fi
-
-if ! [ -z ${db_pwd} ];then
-sed -i s/'^DB_PWD=.*'/"DB_PWD=${db_pwd}"/g ${birdnet_conf}
-${birdnetpi_dir}/scripts/update_db_pwd_bullseye.sh
-fi
-
-if ! [ -z ${birdweather_id} ];then
-sed -i s/'^BIRDWEATHER_ID=.*'/"BIRDWEATHER_ID=${birdweather_id}"/g ${birdnet_conf}
-fi
-
-if ! [ -z ${birdnetpi_url} ];then
-sed -i s/'^BIRDNETPI_URL=.*'/"BIRDNETPI_URL=${birdnetpi_url/\/\//\\\/\\\/}"/g ${birdnet_conf}
-sed -i s/'^WEBTERMINAL_URL=.*'/"WEBTERMINAL_URL=${extractionlog_url/\/\//\\\/\\\/}"/g ${birdnet_conf}
-sed -i s/'^BIRDNETLOG_URL=.*'/"BIRDNETLOG_URL=${birdnetlog_url/\/\//\\\/\\\/}"/g ${birdnet_conf}
-fi
-
-if ! [ -z ${new_sensitivity} ];then
-sed -i s/'^SENSITIVITY=.*'/"SENSITIVITY=${new_sensitivity}"/g ${birdnet_conf}
-fi
-
-if ! [ -z ${new_confidence} ];then
-sed -i s/'^CONFIDENCE=.*'/"CONFIDENCE=${new_confidence}"/g ${birdnet_conf}
-fi
diff --git a/scripts/server.py b/scripts/server.py
index fdc4a0b..6d0b129 100755
--- a/scripts/server.py
+++ b/scripts/server.py
@@ -18,10 +18,8 @@ import math
import time
from decimal import Decimal
import json
-###############################################################################
import requests
-import mysql.connector
-###############################################################################
+import sqlite3
import datetime
from time import sleep
import pytz
@@ -48,7 +46,7 @@ except:
# Open most recent Configuration and grab DB_PWD as a python variable
with open('/home/pi/BirdNET-Pi/thisrun.txt', 'r') as f:
this_run = f.readlines()
- db_pwd = str(str(str([i for i in this_run if i.startswith('DB_PWD')]).split('=')[1]).split('\\')[0])
+ audiofmt = "." + str(str(str([i for i in this_run if i.startswith('AUDIOFMT')]).split('=')[1]).split('\\')[0])
def loadModel():
@@ -304,7 +302,7 @@ def handle_client(conn, addr):
#print('Time:', date_time_obj.time())
print('Date-time:', date_time_obj)
now = date_time_obj
- current_date = now.strftime("%Y/%m/%d")
+ current_date = now.strftime("%Y-%m-%d")
current_time = now.strftime("%H:%M:%S")
current_iso8601 = now.astimezone(get_localzone()).isoformat()
@@ -331,88 +329,83 @@ def handle_client(conn, addr):
myReturn += str(i) + '-' + str(detections[i][0]) + '\n'
-
-
with open('/home/pi/BirdNET-Pi/BirdDB.txt', 'a') as rfile:
for d in detections:
for entry in detections[d]:
if entry[1] >= min_conf and ((entry[0] in INCLUDE_LIST or len(INCLUDE_LIST) == 0) and (entry[0] not in EXCLUDE_LIST or len(EXCLUDE_LIST) == 0) ):
rfile.write(str(current_date) + ';' + str(current_time) + ';' + entry[0].replace('_', ';') + ';' \
+ str(entry[1]) +";" + str(args.lat) + ';' + str(args.lon) + ';' + str(min_conf) + ';' + str(week) + ';' \
- + str(sensitivity) +';' + str(args.overlap) + '\n')
-
- def insert_variables_into_table(Date, Time, Sci_Name, Com_Name, Confidence, Lat, Lon, Cutoff, Week, Sens, Overlap):
- try:
- connection = mysql.connector.connect(host='localhost',
- database='birds',
- user='birder',
- password=db_pwd)
- cursor = connection.cursor()
- mySql_insert_query = """INSERT INTO detections (Date, Time, Sci_Name, Com_Name, Confidence, Lat, Lon, Cutoff, Week, Sens, Overlap)
- VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) """
+ + str(args.sensitivity) +';' + str(args.overlap) + '\n')
- record = (Date, Time, Sci_Name, Com_Name, Confidence, Lat, Lon, Cutoff, Week, Sens, Overlap)
-
- cursor.execute(mySql_insert_query, record)
- connection.commit()
- print("Record inserted successfully into detections table")
-
-
- except mysql.connector.Error as error:
- print("Failed to insert record into detections table {}".format(error))
-
- finally:
- if connection.is_connected():
- connection.close()
- print("MySQL connection is closed")
-
+ Date = str(current_date)
+ Time = str(current_time)
species = entry[0]
- sci_name,com_name = species.split('_')
- insert_variables_into_table(str(current_date), str(current_time), sci_name, com_name, \
- str(entry[1]), str(args.lat), str(args.lon), str(min_conf), str(week), \
- str(args.sensitivity), str(args.overlap))
+ Sci_Name,Com_Name = species.split('_')
+ score = entry[1]
+ Confidence = str(round(score*100))
+ Lat = str(args.lat)
+ Lon = str(args.lon)
+ Cutoff = str(args.min_conf)
+ Week = str(args.week)
+ Sens = str(args.sensitivity)
+ Overlap = str(args.overlap)
+ Com_Name = Com_Name.replace("'", "")
+ File_Name = Com_Name.replace(" ", "_") + '-' + Confidence + '-' + \
+ Date.replace("/", "-") + '-birdnet-' + Time + audiofmt
- print(str(current_date) + ';' + str(current_time) + ';' + entry[0].replace('_', ';') + ';' + str(entry[1]) +";" + str(args.lat) + ';' + str(args.lon) + ';' + str(min_conf) + ';' + str(week) + ';' + str(args.sensitivity) +';' + str(args.overlap) + '\n')
+ #Connect to SQLite Database
+ try:
+ con = sqlite3.connect('/home/pi/BirdNET-Pi/scripts/birds.db')
+ cur = con.cursor()
+ cur.execute("INSERT INTO detections VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", (Date, Time, Sci_Name, Com_Name, str(score), Lat, Lon, Cutoff, Week, Sens, Overlap, File_Name))
+
+ con.commit()
+ con.close()
+ except:
+ print("Database busy")
+ time.sleep(2)
+ print(str(current_date) + ';' + str(current_time) + ';' + entry[0].replace('_', ';') + ';' + str(entry[1]) + ';' + str(args.lat) + ';' + str(args.lon) + ';' + str(min_conf) + ';' + str(week) + ';' + str(args.sensitivity) +';' + str(args.overlap) + Com_Name.replace(" ", "_") + '-' + str(score) + '-' + str(current_date) + '-birdnet-' + str(current_time) + audiofmt + '\n')
if birdweather_id != "99999":
+ try:
- if soundscape_uploaded is False:
- # POST soundscape to server
- soundscape_url = "https://app.birdweather.com/api/v1/stations/" + birdweather_id + "/soundscapes" + "?timestamp=" + current_iso8601
-
- with open(args.i, 'rb') as f:
- wav_data = f.read()
- response = requests.post(url=soundscape_url, data=wav_data, headers={'Content-Type': 'application/octet-stream'})
- print("Soundscape POST Response Status - ", response.status_code)
- sdata = response.json()
- soundscape_id = sdata['soundscape']['id']
- soundscape_uploaded = True
-
- # POST detection to server
- detection_url = "https://app.birdweather.com/api/v1/stations/" + birdweather_id + "/detections"
- start_time = d.split(';')[0]
- end_time = d.split(';')[1]
- post_begin = "{ "
- now_p_start = now + datetime.timedelta(seconds=float(start_time))
- current_iso8601 = now_p_start.astimezone(get_localzone()).isoformat()
- post_timestamp = "\"timestamp\": \"" + current_iso8601 + "\","
- post_lat = "\"lat\": " + str(args.lat) + ","
- post_lon = "\"lon\": " + str(args.lon) + ","
- post_soundscape_id = "\"soundscapeId\": " + str(soundscape_id) + ","
- post_soundscape_start_time = "\"soundscapeStartTime\": " + start_time + ","
- post_soundscape_end_time = "\"soundscapeEndTime\": " + end_time + ","
- post_commonName = "\"commonName\": \"" + entry[0].split('_')[1] + "\","
- post_scientificName = "\"scientificName\": \"" + entry[0].split('_')[0] + "\","
- post_algorithm = "\"algorithm\": " + "\"alpha\"" + ","
- post_confidence = "\"confidence\": " + str(entry[1])
- post_end = " }"
-
- post_json = post_begin + post_timestamp + post_lat + post_lon + post_soundscape_id + post_soundscape_start_time + post_soundscape_end_time + post_commonName + post_scientificName + post_algorithm + post_confidence + post_end
- print(post_json)
- response = requests.post(detection_url, json=json.loads(post_json))
- print("Detection POST Response Status - ", response.status_code)
-
-
+ if soundscape_uploaded is False:
+ # POST soundscape to server
+ soundscape_url = "https://app.birdweather.com/api/v1/stations/" + birdweather_id + "/soundscapes" + "?timestamp=" + current_iso8601
+
+ with open(args.i, 'rb') as f:
+ wav_data = f.read()
+ response = requests.post(url=soundscape_url, data=wav_data, headers={'Content-Type': 'application/octet-stream'})
+ print("Soundscape POST Response Status - ", response.status_code)
+ sdata = response.json()
+ soundscape_id = sdata['soundscape']['id']
+ soundscape_uploaded = True
+
+ # POST detection to server
+ detection_url = "https://app.birdweather.com/api/v1/stations/" + birdweather_id + "/detections"
+ start_time = d.split(';')[0]
+ end_time = d.split(';')[1]
+ post_begin = "{ "
+ now_p_start = now + datetime.timedelta(seconds=float(start_time))
+ current_iso8601 = now_p_start.astimezone(get_localzone()).isoformat()
+ post_timestamp = "\"timestamp\": \"" + current_iso8601 + "\","
+ post_lat = "\"lat\": " + str(args.lat) + ","
+ post_lon = "\"lon\": " + str(args.lon) + ","
+ post_soundscape_id = "\"soundscapeId\": " + str(soundscape_id) + ","
+ post_soundscape_start_time = "\"soundscapeStartTime\": " + start_time + ","
+ post_soundscape_end_time = "\"soundscapeEndTime\": " + end_time + ","
+ post_commonName = "\"commonName\": \"" + entry[0].split('_')[1] + "\","
+ post_scientificName = "\"scientificName\": \"" + entry[0].split('_')[0] + "\","
+ post_algorithm = "\"algorithm\": " + "\"alpha\"" + ","
+ post_confidence = "\"confidence\": " + str(entry[1])
+ post_end = " }"
+
+ post_json = post_begin + post_timestamp + post_lat + post_lon + post_soundscape_id + post_soundscape_start_time + post_soundscape_end_time + post_commonName + post_scientificName + post_algorithm + post_confidence + post_end
+ print(post_json)
+ response = requests.post(detection_url, json=json.loads(post_json))
+ print("Detection POST Response Status - ", response.status_code)
+ except:
+ print("Cannot POST right now")
conn.send(myReturn.encode(FORMAT))
#time.sleep(3)
diff --git a/scripts/service_controls.php b/scripts/service_controls.php
index 8a14c8f..eb1db6a 100644
--- a/scripts/service_controls.php
+++ b/scripts/service_controls.php
@@ -1,107 +1,86 @@
+
-
-
-
-
-
-
- Stop Core Services
-
-
-
- Restart ALL Services
-
-
-
- Restart BirdNET Analysis
-
-
-
- Restart Recording
-
-
-
- Restart Caddy
-
-
-
-Restarting Services
-
Please wait 60-90 seconds
";
- echo str_pad($str, 4096);
- ob_flush();
- flush();
-}
-if(isset($command)){
-$results = shell_exec("$command 2>&1");
-echo "
$results ";
-}
-}
-ob_end_flush();
-?>
-
-
-
+
+
+
+
+ Live Audio Stream
+ Stop
+ Restart
+ Disable
+ Enable
+
+
+ Web Terminal
+ Stop
+ Restart
+ Disable
+ Enable
+
+
+ BirdNET Log
+ Stop
+ Restart
+ Disable
+ Enable
+
+
+ Extraction Service
+ Stop
+ Restart
+ Disable
+ Enable
+
+
+ BirdNET Analysis Server
+ Stop
+ Restart
+ Disable
+ Enable
+
+
+ BirdNET Analysis Client
+ Stop
+ Restart
+ Disable
+ Enable
+
+
+ Streamlit Statistics
+ Stop
+ Restart
+ Disable
+ Enable
+
+
+ Recording Service
+ Stop
+ Restart
+ Disable
+ Enable
+
+
+ Chart Viewer
+ Stop
+ Restart
+ Disable
+ Enable
+
+
+ Spectrogram Viewer
+ Stop
+ Restart
+ Disable
+ Enable
+
+
+ Pushed Notifications
+ Stop
+ Restart
+ Disable
+ Enable
+
+
+ Restart All Services
+
+
diff --git a/scripts/spectrogram.php b/scripts/spectrogram.php
index 9f2ca18..e9d87bc 100644
--- a/scripts/spectrogram.php
+++ b/scripts/spectrogram.php
@@ -4,8 +4,8 @@ if (file_exists('/home/pi/BirdNET-Pi/thisrun.txt')) {
} elseif (file_exists('/home/pi/BirdNET-Pi/firstrun.ini')) {
$config = parse_ini_file('/home/pi/BirdNET-Pi/firstrun.ini');
}
-$refreshtime = $config['RECORDING_LENGTH'];
-header("refresh:$refreshtime");
+$refresh = $config['RECORDING_LENGTH'];
+$time = time();
+echo "
";
+header("Refresh: $refresh;");
?>
-
-
diff --git a/scripts/stats.php b/scripts/stats.php
index 2680592..96eee9d 100644
--- a/scripts/stats.php
+++ b/scripts/stats.php
@@ -3,270 +3,139 @@ ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
-$mysqli = mysqli_connect();
-$mysqli->select_db('birds');
-
-if ($mysqli->connect_error) {
- die('Connect Error (' .
- $mysqli->connect_errno . ') '.
- $mysqli->connect_error);
+$db = new SQLite3('/home/pi/BirdNET-Pi/scripts/birds.db', SQLITE3_OPEN_CREATE | SQLITE3_OPEN_READWRITE);
+if($db == False) {
+ echo "Database busy";
+ header("refresh: 0;");
}
+$statement = $db->prepare('SELECT Date, Time, File_Name, Com_Name, COUNT(*), MAX(Confidence) FROM detections GROUP BY Com_Name ORDER BY COUNT(*) DESC');
+if($statement == False) {
+ echo "Database busy";
+ header("refresh: 0;");
+}
+$result = $statement->execute();
-// SQL query to select data from database
-$sql = "SELECT COUNT(*) AS 'Total' FROM detections
- ORDER BY Date DESC, Time DESC";
-$totalcount = $mysqli->query($sql);
+$statement2 = $db->prepare('SELECT Date, Time, File_Name, Com_Name, COUNT(*), MAX(Confidence) FROM detections GROUP BY Com_Name ORDER BY Com_Name');
+if($statement == False) {
+ echo "Database busy";
+ header("refresh: 0;");
+}
+$result2 = $statement2->execute();
-$sql1 = "SELECT Com_Name, COUNT(*), MAX(Confidence)
- FROM detections
- GROUP BY Com_Name
- ORDER BY COUNT(*) DESC";
-$stats = $mysqli->query($sql1);
-$sql2 = "SELECT COUNT(*) AS 'Total' FROM detections
- WHERE Date = CURDATE()";
-$todayscount = $mysqli->query($sql2);
-
-$sql3 = "SELECT COUNT(*) AS 'Total' FROM detections
- WHERE Date = CURDATE()
- AND Time >= DATE_SUB(NOW(),INTERVAL 1 HOUR)";
-$lasthourcount = $mysqli->query($sql3);
-
-$sql4 = "SELECT Com_Name, Date, Time, MAX(Confidence)
- FROM detections
- GROUP BY Com_Name
- ORDER BY MAX(Confidence) DESC";
-$specieslist = $mysqli->query($sql4);
-$speciescount = mysqli_num_rows($specieslist);
-
-$sql5 = "SELECT Com_Name,COUNT(*)
- AS 'Total'
- FROM detections
- GROUP BY Com_Name
- ORDER BY Total DESC";
-$speciestally = $mysqli->query($sql5);
-
-$getspecies = "SELECT Com_Name from detections
- GROUP BY Com_Name";
-$result = $mysqli->query($getspecies);
if(isset($_POST['species'])){
$selection = $_POST['species'];
- $specificspecies = "SELECT Com_Name, Sci_Name, COUNT(*), MAX(Confidence) from detections
- WHERE Com_Name = \"$selection\"";
- $specificstats = $mysqli->query($specificspecies);}
-
-$mysqli->close();
+ $statement3 = $db->prepare("SELECT Com_Name, Sci_Name, COUNT(*), MAX(Confidence), File_Name, Date, Time from detections WHERE Com_Name = \"$selection\"");
+ if($statement3 == False) {
+ echo "Database busy";
+ header("refresh: 0;");
+ }
+ $result3 = $statement3->execute();
+}
?>
-
BirdNET-Pi DB
-
-/* Firefox */
-input[type=number] {
- -moz-appearance: textfield;
-}
-* {
- font-family: 'Arial', 'Gill Sans', 'Gill Sans MT',
- ' Calibri', 'Trebuchet MS', 'sans-serif';
- box-sizing: border-box;
-}
-/* Create two unequal columns that floats next to each other */
-.column {
- float: left;
- padding: 10px;
-}
-.first {
- width: calc(50% - 70px);
-}
-.second {
- width: calc(50% + 70px);
-}
-.
-/* Clear floats after the columns */
-.row:after {
- content: "";
- display: table;
- clear: both;
-}
-body {
- background-color: rgb(119, 196, 135);
-}
-a {
- color:black;
- text-decoration: none;
-}
-.block {
- display: block;
- width:40%;
- margin-left:auto;
- border: none;
- padding: 5px 5px;
- font-size: medium;
- cursor: pointer;
- text-align: center;
-}
-
-
-img {
- width:75%;
-}
-
-.center {
- display: block;
- margin-left: auto;
- margin-right: auto;
-}
-
-select option {
- font-size:large;
-}
-
-select {
- float:left;
- display:block;
- margin-right:auto;
- font-size:large;
- width: 50%;
-}
-
-@media screen and (max-width: 800px) {
- h3 {
- margin-bottom:0px;
- text-align:center;
- }
- form {
- text-align:left;
- margin-left:0px;
- width:100%;
- }
- .column {
- float: none;
- width: 100%;
- }
- input, label, img {
- width:100%;
- {
-}
-
-
-
-
-
-
-
Number of Detections
-
-
- Total
- Today
- Last Hour
- Number of Unique Species
-
-
- fetch_assoc()) { echo $row['Total']; };?>
- fetch_assoc()) { echo $row['Total']; };?>
- fetch_assoc()) { echo $row['Total']; };?>
-
-
-
-
Summary
-
-
- Common Name
- Occurrences
- Max Confidence Score
-
-fetch_assoc())
+
+
+
+
+fetchArray(SQLITE3_ASSOC))
{
- $MAX = sprintf("%.1f%%", $rows['MAX(Confidence)'] * 100);
- $links = preg_replace('/ /', '_', $rows['Com_Name']);
- $links = preg_replace('/\'/', '', $links);
+$comname = preg_replace('/ /', '_', $results['Com_Name']);
+$comname = preg_replace('/\'/', '', $comname);
+$filename = "/By_Date/".$results['Date']."/".$comname."/".$results['File_Name'];
?>
-
-
-
-
-
-
+
+
+
+
+
-
-
-
-
- Species Stats
-
-
- fetch_assoc()) {
- ?>
- "
+
+
+
+
+
+
Choose a species to load images from Wikimedia Commons.
-
-
Show Species Statistics
-
+};?>
$species
-
-
- Common Name
- Scientific Name
- Occurrences
- Highest Confidence Score
- Links
- ";
- echo str_pad($str, 4096);
- ob_flush();
- flush();
-while($rows = $specificstats->fetch_assoc()) {
- $count = $rows['COUNT(*)'];
- $maxconf = $rows['MAX(Confidence)'];
- $name = $rows['Com_Name'];
- $sciname = $rows['Sci_Name'];
- $dbname = preg_replace('/ /', '_', $rows['Com_Name']);
- $dbname = preg_replace('/\'/', '', $dbname);
- $dbsciname = preg_replace('/ /', '_', $rows['Sci_Name']);
- $imagelink = shell_exec("/home/pi/BirdNET-Pi/scripts/get_image.sh $dbsciname");
- $imagecitation = shell_exec("/home/pi/BirdNET-Pi/scripts/get_citation.sh $dbsciname");
- $str= "
- $name
- $sciname
- $count
- $maxconf
- Wikipedia , All About Birds
+while($results=$result3->fetchArray(SQLITE3_ASSOC)){
+ $count = $results['COUNT(*)'];
+ $maxconf = $results['MAX(Confidence)'];
+ $date = $results['Date'];
+ $time = $results['Time'];
+ $name = $results['Com_Name'];
+ $sciname = $results['Sci_Name'];
+ $dbsciname = preg_replace('/ /', '_', $sciname);
+ $comname = preg_replace('/ /', '_', $results['Com_Name']);
+ $comname = preg_replace('/\'/', '', $comname);
+ $linkname = preg_replace('/_/', '+', $dbsciname);
+ $filename = "/By_Date/".$date."/".$comname."/".$results['File_Name'];
+ echo str_pad("$species
+ ";
- echo str_pad($str, 4096);
+
+
Loading Images from Wikimedia Commons
", '6096');
+
ob_flush();
flush();
- echo "
-
$imagecitation
-
-
-";
+ $imagelink = "https://commons.wikimedia.org/w/index.php?search=$linkname&title=Special:MediaSearch&go=Go&type=image";
+ $homepage = file_get_contents($imagelink);
+ preg_match_all("{ }ims", $homepage, $matches, PREG_SET_ORDER);
+ foreach ($matches as $val) {
+ $pos = strpos($val[2],"/");
+ $link = substr($val[2],1,-1);
+ if($pos !== 1 && strpos($link, "upload") == true && strpos($link, "CentralAutoLogin") == false)
+ echo " ";
+ }
}}
?>
-
-
+
+
+fetchArray(SQLITE3_ASSOC))
+{
+$comname = preg_replace('/ /', '_', $results['Com_Name']);
+$comname = preg_replace('/\'/', '', $comname);
+$filename = "/By_Date/".$results['Date']."/".$comname."/".$results['File_Name'];
+?>
+
+
+
+ Occurrences:
+ Max Confidence:
+ Best Recording: " preload="none" title="">
+
+
+
+
+
+
+
diff --git a/scripts/stop_core_services.sh b/scripts/stop_core_services.sh
index 0d5eb98..309986c 100755
--- a/scripts/stop_core_services.sh
+++ b/scripts/stop_core_services.sh
@@ -6,7 +6,7 @@ services=(birdnet_recording.service
birdnet_analysis.service
birdnet_server.service
chart_viewer.service
-extraction.timer
+extraction.service
spectrogram_viewer.service)
for i in "${services[@]}";do
diff --git a/scripts/system_controls.php b/scripts/system_controls.php
index b498c04..19a7529 100644
--- a/scripts/system_controls.php
+++ b/scripts/system_controls.php
@@ -1,103 +1,18 @@
+
-
-
-
-
-
-
- Reboot
-
-
-
- Update
-
-
-
- Shutdown
-
-
-
- Clear ALL data
-
-
-
-Updating . . .
-
Please wait 60 seconds
";
- echo str_pad($str, 4096);
- ob_flush();
- flush();
-}
-if(isset($command)){
-$results = shell_exec("$command 2>&1");
-echo "
-
-$results ";
-}
-}
-ob_end_flush();
-?>
-
+
+
+
+
+ Reboot
+
+
+ Update
+
+
+ Shutdown
+
+
+ Clear ALL data
+
+
diff --git a/scripts/todays_detections.php b/scripts/todays_detections.php
new file mode 100644
index 0000000..dbdd8b9
--- /dev/null
+++ b/scripts/todays_detections.php
@@ -0,0 +1,110 @@
+prepare('SELECT Time, Com_Name, Sci_Name, Confidence, File_Name FROM detections WHERE Date == Date(\'now\', \'localtime\') ORDER BY Time DESC');
+if($statement0 == False){
+ echo "Database is busy";
+ header("refresh: 0;");
+}
+$result0 = $statement0->execute();
+
+$statement1 = $db->prepare('SELECT COUNT(*) FROM detections');
+if($statement1 == False){
+ echo "Database is busy";
+ header("refresh: 0;");
+}
+$result1 = $statement1->execute();
+$totalcount = $result1->fetchArray(SQLITE3_ASSOC);
+
+$statement2 = $db->prepare('SELECT COUNT(*) FROM detections WHERE Date == DATE(\'now\', \'localtime\')');
+if($statement2 == False){
+ echo "Database is busy";
+ header("refresh: 0;");
+}
+$result2 = $statement2->execute();
+$todaycount = $result2->fetchArray(SQLITE3_ASSOC);
+
+$statement3 = $db->prepare('SELECT COUNT(*) FROM detections WHERE Date == Date(\'now\', \'localtime\') AND TIME >= TIME(\'now\', \'localtime\', \'-1 hour\')');
+if($statement3 == False){
+ echo "Database is busy";
+ header("refresh: 0;");
+}
+$result3 = $statement3->execute();
+$hourcount = $result3->fetchArray(SQLITE3_ASSOC);
+
+$statement4 = $db->prepare('SELECT Com_Name, Sci_Name, Time, Confidence FROM detections LIMIT 1');
+if($statement4 == False){
+ echo "Database is busy";
+ header("refresh: 0;");
+}
+$result4 = $statement4->execute();
+$mostrecent = $result4->fetchArray(SQLITE3_ASSOC);
+
+$statement5 = $db->prepare('SELECT COUNT(DISTINCT(Com_Name)) FROM detections');
+if($statement4 == False){
+ echo "Database is busy";
+ header("refresh: 0;");
+}
+$result5 = $statement5->execute();
+$speciestally = $result5->fetchArray(SQLITE3_ASSOC);
+
+?>
+
+
+
+
+
+
+
+ BirdNET-Pi DB
+
+
+
+
Number of Detections
+
+
+ Total
+ Today
+ Last Hour
+ Number of Unique Species
+
+
+
+
+
+
+
+
+
+
+
+
+
Today's Detections
+
+fetchArray(SQLITE3_ASSOC))
+{
+$comname = preg_replace('/ /', '_', $todaytable['Com_Name']);
+$comname = preg_replace('/\'/', '_', $comname);
+$filename = "/By_Date/".date('Y-m-d')."/".$comname."/".$todaytable['File_Name'];
+$sciname = preg_replace('/ /', '_', $todaytable['Sci_Name']);
+?>
+
+
+
+
+ Confidence:
+ ">
+
+
+
+
diff --git a/scripts/update_birdnet.sh b/scripts/update_birdnet.sh
index a184236..42816b6 100755
--- a/scripts/update_birdnet.sh
+++ b/scripts/update_birdnet.sh
@@ -1,59 +1,12 @@
#!/usr/bin/env bash
# Update BirdNET-Pi
source /etc/birdnet/birdnet.conf
-trap 'rm -f ${tmpfile}' EXIT
trap 'exit 1' SIGINT SIGHUP
USER=pi
HOME=/home/pi
my_dir=${HOME}/BirdNET-Pi/scripts
-tmpfile=$(mktemp)
-services=$(awk '/service/ && /systemctl/ && !/php/ {print $3}' ${my_dir}/install_services.sh | sort)
-
-remove_services() {
- for i in "${services[@]}"; do
- if [ -L /etc/systemd/system/multi-user.target.wants/"${i}" ];then
- sudo systemctl kill "${i}"
- sudo systemctl disable "${i}"
- fi
- if [ -f /etc/systemd/system/"${i}" ];then
- sudo rm /etc/systemd/system/"${i}"
- fi
- if [ -d /etc/systemd/system/"${i}" ];then
- sudo rm -drf /etc/systemd/system/"${i}"
- fi
- done
- remove_icecast
- remove_crons
-}
-
-remove_crons() {
- sudo sed -i '/birdnet/,+1d' /etc/crontab
-}
-
-remove_icecast() {
- if [ -f /etc/init.d/icecast2 ];then
- sudo /etc/init.d/icecast2 stop
- sudo systemctl disable --now icecast2
- fi
-}
-
-remove_scripts() {
- for i in "${scripts[@]}";do
- if [ -L "/usr/local/bin/${i}" ];then
- sudo rm -v "/usr/local/bin/${i}"
- fi
- done
-}
-
-# Stage 1 removes old stuff
-remove_services
-remove_scripts
-
-# Backup labels.txt
-sudo -u${USER} cp -f ~/BirdNET-Pi/model/labels.txt{,.bak}
-# Stage 2 does a git pull to fetch new things
-sudo -u${USER} git -C ${HOME}/BirdNET-Pi checkout -f
-sudo -u${USER} git -C ${HOME}/BirdNET-Pi pull -f
-# Trigger the new update_birdnet2.sh
-sudo -u${USER} ${my_dir}/update_birdnet2.sh
+sudo -u${USER} git -C /home/pi/BirdNET-Pi stash
+sudo -u${USER} git -C /home/pi/BirdNET-Pi pull -f
+sudo systemctl daemon-reload
+sudo -u${USER} git -C /home/pi/BirdNET-Pi stash pop
diff --git a/scripts/update_birdnet2.sh b/scripts/update_birdnet2.sh
deleted file mode 100755
index e27a8ba..0000000
--- a/scripts/update_birdnet2.sh
+++ /dev/null
@@ -1,59 +0,0 @@
-#!/usr/bin/env bash
-# Second stage of update
-USER=pi
-birdnet_conf=/home/pi/BirdNET-Pi/birdnet.conf
-my_dir=${HOME}/BirdNET-Pi/scripts
-
-# Stage 1 updates the services
-sudo ${my_dir}/update_services.sh
-
-# Stage 1.5: adding new birdnet.conf entries
-if ! grep FULL_DISK ${birdnet_conf} &> /dev/null;then
- cat << EOF >> ${birdnet_conf}
-
-## FULL_DISK can be set to configure how the system reacts to a full disk
-## purge = Remove the oldest day's worth of recordings
-## keep = Keep all data and `stop_core_services.sh`
-
-FULL_DISK=purge
-EOF
-fi
-
-if ! grep AUDIOFMT ${birdnet_conf} &> /dev/null;then
- cat<< EOF >> ${birdnet_conf}
-## AUDIOFMT set the audio format that sox should use for the extractions.
-## The default is mp3. Available formats are: 8svx aif aifc aiff aiffc al amb
-## amr-nb amr-wb anb au avr awb caf cdda cdr cvs cvsd cvu dat dvms f32 f4 f64 f8
-## fap flac fssd gsm gsrt hcom htk ima ircam la lpc lpc10 lu mat mat4 mat5 maud
-## mp2 mp3 nist ogg paf prc pvf raw s1 s16 s2 s24 s3 s32 s4 s8 sb sd2 sds sf sl
-## sln smp snd sndfile sndr sndt sou sox sph sw txw u1 u16 u2 u24 u3 u32 u4 u8
-## ub ul uw vms voc vorbis vox w64 wav wavpcm wv wve xa xi
-## Note: Most have not been tested.
-
-AUDIOFMT=mp3
-EOF
-fi
-
-sudo -u${USER} sed -i 's/EXTRACTIONLOG_URL/WEBTERMINAL_URL/g' ${birdnetconf}
-
-# Replace Backup labels.txt
-sudo -u${USER} cp -f ~/BirdNET-Pi/model/labels.txt.bak ~/BirdNET-Pi/model/labels.txt
-
-# Stage 2 restarts the services
-sudo systemctl daemon-reload
-sudo systemctl stop birdnet_recording.service
-sudo rm -rf ${RECS_DIR}/$(date +%B-%Y/%d-%A)/*
-services=(web_terminal.service
-spectrogram_viewer.service
-pushed_notifications.service
-livestream.service
-icecast2.service
-extraction.timer
-extraction.service
-chart_viewer.service
-birdnet_recording.service
-birdnet_log.service)
-
-for i in "${services[@]}";do
-sudo systemctl restart "${i}"
-done
diff --git a/scripts/update_caddyfile.sh b/scripts/update_caddyfile.sh
index 6b8982d..c0f0e3e 100755
--- a/scripts/update_caddyfile.sh
+++ b/scripts/update_caddyfile.sh
@@ -14,6 +14,12 @@ cat << EOF > /etc/caddy/Caddyfile
http://localhost http://$(hostname).local ${BIRDNETPI_URL} {
root * ${EXTRACTED}
file_server browse
+ handle /By_Date/* {
+ file_server browse
+ }
+ handle /Charts/* {
+ file_server browse
+ }
basicauth /Processed* {
birdnet ${HASHWORD}
}
@@ -26,8 +32,14 @@ http://localhost http://$(hostname).local ${BIRDNETPI_URL} {
basicauth /phpsysinfo* {
birdnet ${HASHWORD}
}
+ basicauth /terminal* {
+ birdnet ${HASHWORD}
+ }
reverse_proxy /stream localhost:8000
php_fastcgi unix//run/php/php7.4-fpm.sock
+ reverse_proxy /log* localhost:8080
+ reverse_proxy /stats* localhost:8501
+ reverse_proxy /terminal* localhost:8888
}
EOF
else
@@ -35,79 +47,19 @@ else
http://localhost http://$(hostname).local ${BIRDNETPI_URL} {
root * ${EXTRACTED}
file_server browse
+ handle /By_Date/* {
+ file_server browse
+ }
+ handle /Charts/* {
+ file_server browse
+ }
reverse_proxy /stream localhost:8000
php_fastcgi unix//run/php/php7.4-fpm.sock
+ reverse_proxy /log* localhost:8080
+ reverse_proxy /stats* localhost:8501
+ reverse_proxy /terminal* localhost:8888
}
EOF
fi
-if [ ! -z ${WEBTERMINAL_URL} ] && [ ! -z ${HASHWORD} ];then
- cat << EOF >> /etc/caddy/Caddyfile
-${WEBTERMINAL_URL} {
- basicauth {
- birdnet ${HASHWORD}
- }
- reverse_proxy localhost:8888
-}
-EOF
-elif [ ! -z ${WEBTERMINAL_URL} ] && [ -z ${HASHWORD} ];then
- cat << EOF >> /etc/caddy/Caddyfile
-${WEBTERMINAL_URL} {
- reverse_proxy localhost:8888
-}
-EOF
-fi
-
-if [ ! -z ${BIRDNETLOG_URL} ];then
- cat << EOF >> /etc/caddy/Caddyfile
-
-${BIRDNETLOG_URL} {
- reverse_proxy localhost:8080
-}
-EOF
-fi
-################################################################################
-sudo -u${USER} git -C /home/pi/BirdNET-Pi checkout -f homepage/*
-sudo -u${USER} git -C /home/pi/BirdNET-Pi checkout -f scripts/*
-sudo -u${USER} git -C /home/pi/BirdNET-Pi checkout -f scripts/*/*
-sudo -u${USER} sed -i "s/https:\/\/v2.wttr.in\//https:\/\/v2.wttr.in\/"${LATITUDE},${LONGITUDE}"/g" $(dirname ${my_dir})/homepage/menu.html
-
-if [ ! -z ${BIRDNETLOG_URL} ];then
- BIRDNETLOG_URL="$(echo ${BIRDNETLOG_URL} | sed 's/\/\//\\\/\\\//g')"
-else
- BIRDNETLOG_URL="$(echo http://$(hostname).local:8080 | sed 's/\/\//\\\/\\\//g')"
-fi
-sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local:8080/${BIRDNETLOG_URL}/g" $(dirname ${my_dir})/homepage/*.html
-sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local:8080/${BIRDNETLOG_URL}/g" $(dirname ${my_dir})/scripts/*.html
-sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local:8080/${BIRDNETLOG_URL}/g" $(dirname ${my_dir})/scripts/*.html
-sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local:8080/${BIRDNETLOG_URL}/g" $(dirname ${my_dir})/scripts/*.php
-sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local:8080/${BIRDNETLOG_URL}/g" $(dirname ${my_dir})/scripts/*/*.php
-
-if [ ! -z ${WEBTERMINAL_URL} ];then
- WEBTERMINAL_URL="$(echo ${WEBTERMINAL_URL} | sed 's/\/\//\\\/\\\//g')"
-else
- WEBTERMINAL_URL="$(echo http://$(hostname).local:8888 | sed 's/\/\//\\\/\\\//g')"
-fi
-sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local:8888/${WEBTERMINAL_URL}/g" $(dirname ${my_dir})/homepage/*.html
-sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local:8888/${WEBTERMINAL_URL}/g" $(dirname ${my_dir})/scripts/*.html
-sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local:8888/${WEBTERMINAL_URL}/g" $(dirname ${my_dir})/scripts/*.html
-sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local:8888/${WEBTERMINAL_URL}/g" $(dirname ${my_dir})/scripts/*.php
-sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local:8888/${WEBTERMINAL_URL}/g" $(dirname ${my_dir})/scripts/*/*.php
-
-
-if [ -z ${BIRDNETPI_URL} ];then
- sudo -u${USER} sed -i "s/birdnetpi.local/$(hostname).local/g" $(dirname ${my_dir})/homepage/*.html
- sudo -u${USER} sed -i "s/birdnetpi.local/$(hostname).local/g" $(dirname ${my_dir})/scripts/*.html
- sudo -u${USER} sed -i "s/birdnetpi.local/$(hostname).local/g" $(dirname ${my_dir})/scripts/*.html
- sudo -u${USER} sed -i "s/birdnetpi.local/$(hostname).local/g" $(dirname ${my_dir})/scripts/*.php
- sudo -u${USER} sed -i "s/birdnetpi.local/$(hostname).local/g" $(dirname ${my_dir})/scripts/*/*.php
-else
- BIRDNETPI_URL="$(echo ${BIRDNETPI_URL} | sed 's/\/\//\\\/\\\//g')"
- sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local/${BIRDNETPI_URL}/g" $(dirname ${my_dir})/homepage/*.html
- sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local/${BIRDNETPI_URL}/g" $(dirname ${my_dir})/scripts/*.html
- sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local/${BIRDNETPI_URL}/g" $(dirname ${my_dir})/scripts/*.html
- sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local/${BIRDNETPI_URL}/g" $(dirname ${my_dir})/scripts/*.php
- sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local/${BIRDNETPI_URL}/g" $(dirname ${my_dir})/scripts/*/*.php
-fi
-
-systemctl reload caddy
+sudo systemctl reload caddy
diff --git a/scripts/update_db_pwd_bullseye.sh b/scripts/update_db_pwd_bullseye.sh
deleted file mode 100755
index 723e81c..0000000
--- a/scripts/update_db_pwd_bullseye.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/usr/bin/env bash
-# Update database password
-source /etc/birdnet/birdnet.conf
-
-mysql -e "
- SET PASSWORD FOR 'birder'@'localhost' = PASSWORD('${DB_PWD}');
- FLUSH PRIVILEGES";
-sed -i "s/mysqli.default_host =.*/mysqli.default_host = localhost/g" /etc/php/7.4/fpm/php.ini
-sed -i "s/mysqli.default_user =.*/mysqli.default_user = birder/g" /etc/php/7.4/fpm/php.ini
-sed -i "s/mysqli.default_pw =.*/mysqli.default_pw = ${DB_PWD}/g" /etc/php/7.4/fpm/php.ini
-systemctl restart php7.4-fpm.service
diff --git a/scripts/update_inprogress.php b/scripts/update_inprogress.php
deleted file mode 100644
index 7eff704..0000000
--- a/scripts/update_inprogress.php
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/scripts/update_services.sh b/scripts/update_services.sh
deleted file mode 100755
index d6ef6fa..0000000
--- a/scripts/update_services.sh
+++ /dev/null
@@ -1,591 +0,0 @@
-#!/usr/bin/env bash
-# This reinstalls the services
-set -x # Uncomment to enable debugging
-trap 'rm -f ${tmpfile}' EXIT
-trap 'exit 1' SIGINT SIGHUP
-USER=pi
-HOME=/home/pi
-my_dir=${HOME}/BirdNET-Pi/scripts
-tmpfile=$(mktemp)
-nomachine_url="https://download.nomachine.com/download/7.7/Arm/nomachine_7.7.4_1_arm64.deb"
-gotty_url="https://github.com/yudai/gotty/releases/download/v1.0.1/gotty_linux_arm.tar.gz"
-config_file="$(dirname ${my_dir})/birdnet.conf"
-
-install_ftpd() {
- if ! [ -f /etc/ftpuseres ];then
- apt -y install ftpd
- fi
-}
-
-install_lynx() {
- if ! which lynx &> /dev/null;then
- apt -y install lynx
- fi
-}
-
-install_scripts() {
- echo "Installing BirdNET-Pi scripts to /usr/local/bin"
- ln -sf ${my_dir}/* /usr/local/bin/
- rm /usr/local/bin/index.html
-}
-
-install_mariadb() {
- if ! which mysql &> /dev/null;then
- echo "Installing MariaDB Server"
- apt -qqy install mariadb-server
- echo "MariaDB Installed"
- fi
- source /etc/os-release
- if [[ "${VERSION_CODENAME}" == "buster" ]];then
- USER=${USER} ${my_dir}/update_db_pwd_buster.sh
- elif [[ "${VERSION_CODENAME}" == "bullseye" ]];then
- mysql -e "
- SET PASSWORD FOR 'birder'@'localhost' = PASSWORD('${DB_PWD}');
- FLUSH PRIVILEGES";
- sed -i "s/mysqli.default_host =.*/mysqli.default_host = localhost/g" /etc/php/7.4/fpm/php.ini
- sed -i "s/mysqli.default_user =.*/mysqli.default_user = birder/g" /etc/php/7.4/fpm/php.ini
- sed -i "s/mysqli.default_pw =.*/mysqli.default_pw = ${DB_PWD}/g" /etc/php/7.4/fpm/php.ini
- fi
-}
-
-install_birdnet_analysis() {
- echo "Installing the birdnet_analysis.service"
- cat << EOF > /etc/systemd/system/birdnet_analysis.service
-[Unit]
-Description=BirdNET Analysis
-After=birdnet_server.service
-Requires=birdnet_server.service
-[Service]
-Restart=always
-Type=simple
-RestartSec=2
-User=${USER}
-ExecStart=/usr/local/bin/birdnet_analysis.sh
-[Install]
-WantedBy=multi-user.target
-EOF
- systemctl enable birdnet_analysis.service
-}
-
-install_birdnet_server() {
- echo "Installing the birdnet_server.service"
- cat << EOF > /etc/systemd/system/birdnet_server.service
-[Unit]
-Description=BirdNET Analysis Server
-Before=birdnet_analysis.service
-[Service]
-Restart=always
-Type=simple
-RestartSec=2
-User=${USER}
-ExecStart=/usr/local/bin/server.py
-[Install]
-WantedBy=multi-user.target
-EOF
- systemctl enable birdnet_server.service
-}
-
-
-install_extraction_service() {
- echo "Installing the extraction.service and extraction.timer"
- cat << EOF > /etc/systemd/system/extraction.service
-[Unit]
-Description=BirdNET BirdSound Extraction
-[Service]
-Restart=on-failure
-RestartSec=3
-Type=simple
-User=${USER}
-ExecStart=/usr/local/bin/extract_new_birdsounds.sh
-[Install]
-WantedBy=multi-user.target
-EOF
- cat << EOF > /etc/systemd/system/extraction.timer
-[Unit]
-Description=BirdNET BirdSound Extraction Timer
-Requires=extraction.service
-
-[Timer]
-Unit=extraction.service
-OnCalendar=*:*:0/10
-
-[Install]
-WantedBy=multi-user.target
-EOF
- systemctl enable extraction.timer
- systemctl enable extraction.service
-}
-
-install_pushed_notifications() {
- echo "Installing Pushed.co mobile notifications"
- cat << EOF > /etc/systemd/system/pushed_notifications.service
-[Unit]
-Description=BirdNET-Pi Pushed.co Notifications
-[Service]
-Restart=on-success
-RestartSec=3
-Type=simple
-User=pi
-ExecStart=/usr/local/bin/species_notifier.sh
-[Install]
-WantedBy=multi-user.target
-EOF
- systemctl enable pushed_notifications.service
-}
-
-create_necessary_dirs() {
- echo "Creating necessary directories"
- [ -d ${EXTRACTED} ] || sudo -u ${USER} mkdir -p ${EXTRACTED}
- [ -d ${EXTRACTED}/By_Date ] || sudo -u ${USER} mkdir -p ${EXTRACTED}/By_Date
- [ -d ${EXTRACTED}/By_Common_Name ] || sudo -u ${USER} mkdir -p ${EXTRACTED}/By_Common_Name
- [ -d ${EXTRACTED}/By_Scientific_Name ] || sudo -u ${USER} mkdir -p ${EXTRACTED}/By_Scientific_Name
- [ -d ${EXTRACTED}/Charts ] || sudo -u ${USER} mkdir -p ${EXTRACTED}/Charts
- [ -d ${PROCESSED} ] || sudo -u ${USER} mkdir -p ${PROCESSED}
-
- sudo -u ${USER} ln -fs $(dirname ${my_dir})/homepage/* ${EXTRACTED}
- if [ ! -z ${BIRDNETLOG_URL} ];then
- BIRDNETLOG_URL="$(echo ${BIRDNETLOG_URL} | sed 's/\/\//\\\/\\\//g')"
- sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local:8080/${BIRDNETLOG_URL}/g" $(dirname ${my_dir})/homepage/*.html
- sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local:8080/${BIRDNETLOG_URL}/g" $(dirname ${my_dir})/scripts/*.html
- sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local:8080/${BIRDNETLOG_URL}/g" $(dirname ${my_dir})/scripts/*.html
- sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local:8080/${BIRDNETLOG_URL}/g" $(dirname ${my_dir})/scripts/*.php
- sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local:8080/${BIRDNETLOG_URL}/g" $(dirname ${my_dir})/scripts/*/*.php
- fi
- if [ ! -z ${WEBTERMINAL_URL} ];then
- WEBTERMINAL_URL="$(echo ${WEBTERMINAL_URL} | sed 's/\/\//\\\/\\\//g')"
- sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local:8888/${WEBTERMINAL_URL}/g" $(dirname ${my_dir})/homepage/*.html
- sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local:8888/${WEBTERMINAL_URL}/g" $(dirname ${my_dir})/scripts/*.html
- sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local:8888/${WEBTERMINAL_URL}/g" $(dirname ${my_dir})/scripts/*.html
- sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local:8888/${WEBTERMINAL_URL}/g" $(dirname ${my_dir})/scripts/*.php
- sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local:8888/${WEBTERMINAL_URL}/g" $(dirname ${my_dir})/scripts/*/*.php
- fi
-
- sudo -u ${USER} ln -fs $(dirname ${my_dir})/model/labels.txt ${my_dir}/
- sudo -u ${USER} ln -fs $(dirname ${my_dir})/scripts ${EXTRACTED}
- if [ -z ${BIRDNETPI_URL} ];then
- sudo -u${USER} sed -i "s/birdnetpi.local/$(hostname).local/g" $(dirname ${my_dir})/homepage/*.html
- sudo -u${USER} sed -i "s/birdnetpi.local/$(hostname).local/g" $(dirname ${my_dir})/scripts/*.html
- sudo -u${USER} sed -i "s/birdnetpi.local/$(hostname).local/g" $(dirname ${my_dir})/scripts/*.html
- sudo -u${USER} sed -i "s/birdnetpi.local/$(hostname).local/g" $(dirname ${my_dir})/scripts/*.php
- sudo -u${USER} sed -i "s/birdnetpi.local/$(hostname).local/g" $(dirname ${my_dir})/scripts/*/*.php
- else
- BIRDNETPI_URL="$(echo ${BIRDNETPI_URL} | sed 's/\/\//\\\/\\\//g')"
- sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local/${BIRDNETPI_URL}/g" $(dirname ${my_dir})/homepage/*.html
- sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local/${BIRDNETPI_URL}/g" $(dirname ${my_dir})/scripts/*.html
- sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local/${BIRDNETPI_URL}/g" $(dirname ${my_dir})/scripts/*.html
- sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local/${BIRDNETPI_URL}/g" $(dirname ${my_dir})/scripts/*.php
- sudo -u${USER} sed -i "s/http:\/\/birdnetpi.local/${BIRDNETPI_URL}/g" $(dirname ${my_dir})/scripts/*/*.php
- fi
-
- sudo -u ${USER} ln -fs $(dirname ${my_dir})/scripts/spectrogram.php ${EXTRACTED}
- sudo -u ${USER} ln -fs $(dirname ${my_dir})/scripts/viewday.php ${EXTRACTED}
- sudo -u ${USER} ln -fs $(dirname ${my_dir})/scripts/overview.php ${EXTRACTED}
- sudo -u ${USER} ln -fs $(dirname ${my_dir})/scripts/stats.php ${EXTRACTED}
- sudo -u ${USER} ln -fs $(dirname ${my_dir})/scripts/viewdb.php ${EXTRACTED}
- sudo -u ${USER} ln -fs $(dirname ${my_dir})/scripts/history.php ${EXTRACTED}
- sudo -u ${USER} ln -fs $(dirname ${my_dir})/homepage/images/favicon.ico ${EXTRACTED}
- sudo -u ${USER} ln -fs ${HOME}/phpsysinfo ${EXTRACTED}
- sudo -u ${USER} cp -f $(dirname ${my_dir})/templates/phpsysinfo.ini ${HOME}/phpsysinfo/
- sudo -u ${USER} cp -f $(dirname ${my_dir})/templates/green_bootstrap.css ${HOME}/phpsysinfo/templates/
- sudo -u ${USER} cp -f $(dirname ${my_dir})/templates/index_bootstrap.html ${HOME}/phpsysinfo/templates/html
-
- echo "Setting Wttr.in URL to "${LATITUDE}", "${LONGITUDE}""
- sudo -u${USER} sed -i "s/https:\/\/v2.wttr.in\//https:\/\/v2.wttr.in\/"${LATITUDE},${LONGITUDE}"/g" $(dirname ${my_dir})/homepage/menu.html
- chmod -R g+rw $(dirname ${my_dir})
- chmod -R g+rw ${RECS_DIR}
-}
-
-generate_BirdDB() {
- echo "Generating BirdDB.txt"
- if ! [ -f $(dirname ${my_dir})/BirdDB.txt ];then
- sudo -u ${USER} touch $(dirname ${my_dir})/BirdDB.txt
- echo "Date;Time;Sci_Name;Com_Name;Confidence;Lat;Lon;Cutoff;Week;Sens;Overlap" | sudo -u ${USER} tee -a $(dirname ${my_dir})/BirdDB.txt
- elif ! grep Date $(dirname ${my_dir})/BirdDB.txt;then
- sudo -u ${USER} sed -i '1 i\Date;Time;Sci_Name;Com_Name;Confidence;Lat;Lon;Cutoff;Week;Sens;Overlap' $(dirname ${my_dir})/BirdDB.txt
- fi
- ln -sf $(dirname ${my_dir})/BirdDB.txt ${my_dir}/BirdDB.txt &&
- chown pi:pi ${my_dir}/BirdDB.txt && chmod g+rw ${my_dir}/BirdDB.txt
-}
-
-install_alsa() {
- echo "Checking for alsa-utils and pulseaudio"
- if which arecord &> /dev/null ;then
- echo "alsa-utils installed"
- else
- echo "Installing alsa-utils"
- apt install -qqy alsa-utils
- echo "alsa-utils installed"
- fi
- if which pulseaudio &> /dev/null;then
- echo "PulseAudio installed"
- else
- echo "Installing pulseaudio"
- apt install -qqy pulseaudio
- echo "PulseAudio installed"
- fi
- if ! [ -d /etc/lightdm ];then
- systemctl set-default multi-user.target
- ln -fs /lib/systemd/system/getty@.service /etc/systemd/system/getty.target.wants/getty@tty1.service
- cat > /etc/systemd/system/getty@tty1.service.d/autologin.conf << EOF
-[Service]
-ExecStart=
-ExecStart=-/sbin/agetty --autologin $USER --noclear %I \$TERM
-EOF
- fi
-
-}
-
-install_recording_service() {
- echo "Installing birdnet_recording.service"
- cat << EOF > /etc/systemd/system/birdnet_recording.service
-[Unit]
-Description=BirdNET Recording
-
-[Service]
-Environment=XDG_RUNTIME_DIR=/run/user/1000
-Restart=always
-Type=simple
-RestartSec=3
-User=${USER}
-ExecStart=/usr/local/bin/birdnet_recording.sh
-
-[Install]
-WantedBy=multi-user.target
-EOF
- systemctl enable birdnet_recording.service
-}
-
-install_caddy() {
- if ! which caddy &> /dev/null ;then
- echo "Installing Caddy"
- curl -1sLf \
- 'https://dl.cloudsmith.io/public/caddy/stable/setup.deb.sh' \
- | sudo -E bash
- apt install -qqy caddy=2.4.5
- systemctl enable --now caddy
- else
- echo "Caddy is installed"
- systemctl enable --now caddy
- fi
-}
-
-install_Caddyfile() {
- echo "Installing the Caddyfile"
- [ -d /etc/caddy ] || mkdir /etc/caddy
- if [ -f /etc/caddy/Caddyfile ];then
- cp /etc/caddy/Caddyfile{,.original}
- fi
- php_version="$(awk -F'php' '{print $3}' <(ls -l $(which /etc/alternatives/php)))"
- if ! [ -z ${CADDY_PWD} ];then
- HASHWORD=$(caddy hash-password -plaintext ${CADDY_PWD})
- cat << EOF > /etc/caddy/Caddyfile
-http://localhost http://$(hostname).local ${BIRDNETPI_URL} {
- root * ${EXTRACTED}
- file_server browse
- basicauth /Processed* {
- birdnet ${HASHWORD}
- }
- basicauth /scripts* {
- birdnet ${HASHWORD}
- }
- basicauth /stream {
- birdnet ${HASHWORD}
- }
- basicauth /phpsysinfo* {
- birdnet ${HASHWORD}
- }
- reverse_proxy /stream localhost:8000
- php_fastcgi unix//run/php/php${php_version}-fpm.sock
-}
-EOF
- else
- cat << EOF > /etc/caddy/Caddyfile
-http://localhost http://$(hostname).local ${BIRDNETPI_URL} {
- root * ${EXTRACTED}
- file_server browse
- reverse_proxy /stream localhost:8000
- php_fastcgi unix//run/php/php${php_version}-fpm.sock
-}
-EOF
- fi
-
- if [ ! -z ${WEBTERMINAL_URL} ] && [ ! -z ${HASHWORD} ];then
- cat << EOF >> /etc/caddy/Caddyfile
-${WEBTERMINAL_URL} {
- basicauth {
- birdnet ${HASHWORD}
- }
- reverse_proxy localhost:8888
-}
-EOF
- elif [ ! -z ${WEBTERMINAL_URL} ] && [ -z ${HASHWORD} ];then
- cat << EOF >> /etc/caddy/Caddyfile
-${WEBTERMINAL_URL} {
- reverse_proxy localhost:8888
-}
-EOF
- fi
- if [ ! -z ${BIRDNETLOG_URL} ];then
- cat << EOF >> /etc/caddy/Caddyfile
-
-${BIRDNETLOG_URL} {
- reverse_proxy localhost:8080
-}
-EOF
- fi
-}
-
-update_etc_hosts() {
- sed -ie s/'$(hostname).local'/"$(hostname).local ${BIRDNETPI_URL//https:\/\/} ${WEBTERMINAL_URL//https:\/\/} ${BIRDNETLOG_URL//https:\/\/}"/g /etc/hosts
-}
-
-install_avahi_aliases() {
- echo "Installing Avahi Services"
- if ! which avahi-publish &> /dev/null; then
- echo "Installing avahi-utils"
- apt install -y avahi-utils &> /dev/null
- fi
- echo "Installing avahi-alias service"
- cat << 'EOF' > /etc/systemd/system/avahi-alias@.service
-[Unit]
-Description=Publish %I as alias for %H.local via mdns
-After=network.target network-online.target
-Requires=network-online.target
-
-[Service]
-Restart=always
-RestartSec=3
-Type=simple
-ExecStart=/bin/bash -c "/usr/bin/avahi-publish -a -R %I $(hostname -I |cut -d' ' -f1)"
-
-[Install]
-WantedBy=multi-user.target
-EOF
-systemctl enable avahi-alias@"$(hostname)".local.service
-}
-
-install_spectrogram_service() {
- cat << EOF > /etc/systemd/system/spectrogram_viewer.service
-[Unit]
-Description=BirdNET-Pi Spectrogram Viewer
-[Service]
-Restart=always
-RestartSec=10
-Type=simple
-User=${USER}
-ExecStart=/usr/local/bin/spectrogram.sh
-[Install]
-WantedBy=multi-user.target
-EOF
- systemctl enable spectrogram_viewer.service
-}
-
-install_chart_viewer_service() {
- echo "Installing the chart_viewer.service"
- cat << EOF > /etc/systemd/system/chart_viewer.service
-[Unit]
-Description=BirdNET-Pi Chart Viewer Service
-
-[Service]
-Restart=always
-RestartSec=300
-Type=simple
-User=pi
-ExecStart=/usr/local/bin/daily_plot.py
-[Install]
-WantedBy=multi-user.target
-EOF
- systemctl enable chart_viewer.service
-}
-
-install_gotty_logs() {
- echo "Installing GoTTY logging"
- if ! which gotty &> /dev/null;then
- echo "Installing GoTTY binary"
- wget -c ${gotty_url} -O - | tar -xz -C /usr/local/bin/
- fi
- sudo -u ${USER} ln -sf $(dirname ${my_dir})/templates/gotty \
- ${HOME}/.gotty
- sudo -u ${USER} ln -sf $(dirname ${my_dir})/templates/bashrc \
- ${HOME}/.bashrc
- echo "Installing the birdnet_log.service"
- cat << EOF > /etc/systemd/system/birdnet_log.service
-[Unit]
-Description=BirdNET Analysis Log
-
-[Service]
-Restart=on-failure
-RestartSec=3
-Type=simple
-User=${USER}
-Environment=TERM=xterm-256color
-ExecStart=/usr/local/bin/gotty -p 8080 --title-format "BirdNET-Pi Log" birdnet_log.sh
-
-[Install]
-WantedBy=multi-user.target
-EOF
- systemctl enable birdnet_log.service
- echo "Installing the Web Terminal"
- cat << EOF > /etc/systemd/system/web_terminal.service
-[Unit]
-Description=BirdNET-Pi Web Terminal
-
-[Service]
-Restart=on-failure
-RestartSec=3
-Type=simple
-User=${USER}
-Environment=TERM=xterm-256color
-ExecStart=/usr/local/bin/gotty -w -p 8888 --title-format "BirdNET-Pi Terminal" bash
-
-[Install]
-WantedBy=multi-user.target
-EOF
- systemctl enable web_terminal.service
-}
-
-install_sox() {
- if which sox | grep mp3 &> /dev/null;then
- echo "Sox is installed"
- else
- echo "Installing sox"
- apt install -y sox libsox-fmt-mp3
- echo "Sox installed"
- fi
-}
-
-install_php() {
- if ! which php &> /dev/null || ! which php-fpm || ! apt list --installed | grep php-xml;then
- echo "Installing PHP modules"
- apt install -qqy php php-fpm php-mysql php-xml php-zip
- else
- echo "PHP and PHP-FPM installed"
- fi
- echo "Configuring PHP for Caddy"
- sed -i 's/www-data/caddy/g' /etc/php/*/fpm/pool.d/www.conf
- echo "Adding Caddy sudoers rule"
- cat << EOF > /etc/sudoers.d/010_caddy-nopasswd
-caddy ALL=(ALL) NOPASSWD: ALL
-EOF
- chmod 0440 /etc/sudoers.d/010_caddy-nopasswd
- if [ ! -d ${HOME}/phpsysinfo ];then
- echo "Fetching phpSysInfo"
- sudo -u ${USER} git clone https://github.com/phpsysinfo/phpsysinfo.git \
- ${HOME}/phpsysinfo
- fi
-}
-
-install_icecast() {
- if ! which icecast2;then
- echo "Installing IceCast2"
- echo "icecast2 icecast2/icecast-setup boolean false" | debconf-set-selections
- apt install -qqy icecast2
- config_icecast
- systemctl enable icecast2.service
- /etc/init.d/icecast2 start
- else
- echo "Icecast2 is installed"
- config_icecast
- systemctl enable icecast2.service
- /etc/init.d/icecast2 start
- fi
-}
-
-config_icecast() {
- if [ -f /etc/icecast2/icecast.xml ];then
- cp /etc/icecast2/icecast.xml{,.prebirdnetpi}
- fi
- sed -i 's/>admin>birdnet.*<\/${i}password>/<${i}password>${ICE_PWD}<\/${i}password>/g" /etc/icecast2/icecast.xml
- done
-}
-
-install_livestream_service() {
- echo "Installing Live Stream service"
- cat << EOF > /etc/systemd/system/livestream.service
-[Unit]
-Description=BirdNET-Pi Live Stream
-After=network-online.target
-Requires=network-online.target
-
-[Service]
-Environment=XDG_RUNTIME_DIR=/run/user/1000
-Restart=always
-Type=simple
-RestartSec=3
-User=${USER}
-ExecStart=/usr/local/bin/livestream.sh
-
-[Install]
-WantedBy=multi-user.target
-EOF
- systemctl enable livestream.service
-}
-
-install_nomachine() {
- if [ ! -d /usr/share/NX ] && [ -d /etc/lightdm ];then
- echo "Installing NoMachine"
- curl -s -o ${HOME}/nomachine.deb -O "${nomachine_url}"
- apt install -y ${HOME}/nomachine.deb
- rm -f ${HOME}/nomachine.deb
- echo "Enabling VNC"
- systemctl enable --now vncserver-x11-serviced.service
- fi
-}
-
-install_cleanup_cron() {
- echo "Installing the cleanup.cron"
- cat $(dirname ${my_dir})/templates/cleanup.cron >> /etc/crontab
-}
-
-install_selected_services() {
- sudo apt -qqqq update
- install_scripts
- install_birdnet_analysis
- install_birdnet_server
-
- if [[ "${DO_EXTRACTIONS}" =~ [Yy] ]];then
- install_extraction_service
- fi
-
- if [[ "${DO_RECORDING}" =~ [Yy] ]];then
- install_alsa
- install_recording_service
- fi
-
- install_php
- install_caddy
- install_Caddyfile
- update_etc_hosts
- install_avahi_aliases
- install_gotty_logs
- install_sox
- install_mariadb
- install_spectrogram_service
- install_chart_viewer_service
- install_pushed_notifications
-
- if [ ! -z "${ICE_PWD}" ];then
- install_icecast
- install_livestream_service
- fi
-
- if [[ "${INSTALL_NOMACHINE}" =~ [Yy] ]];then
- install_nomachine
- fi
-
- create_necessary_dirs
- generate_BirdDB
- install_cleanup_cron
- install_ftpd
- install_lynx
-}
-
-if [ -f ${config_file} ];then
- source ${config_file}
- install_selected_services
-else
- echo "Unable to find a configuration file. Please make sure that $config_file exists."
-fi
diff --git a/scripts/update_settings_inprogress.php b/scripts/update_settings_inprogress.php
deleted file mode 100644
index 496a00e..0000000
--- a/scripts/update_settings_inprogress.php
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/scripts/update_species.sh b/scripts/update_species.sh
index cc4b945..eb59741 100755
--- a/scripts/update_species.sh
+++ b/scripts/update_species.sh
@@ -1,14 +1,5 @@
#!/usr/bin/env bash
# Update the species list
#set -x
-trap 'rm -f "$TMPFILE"' EXIT
source /etc/birdnet/birdnet.conf
-db=birds
-dbuser=birder
-dbpassword=${DB_PWD}
-
-mysql -u${dbuser} -p${dbpassword} ${db} \
- -e 'SELECT Com_Name
- FROM detections
- GROUP BY Com_Name' |\
- tail -n+2 > ${IDFILE}
+sqlite3 /home/pi/BirdNET-Pi/scripts/birds.db "SELECT DISTINCT(Com_Name) FROM detections" | sort > ${IDFILE}
diff --git a/scripts/viewdb.php b/scripts/viewdb.php
deleted file mode 100644
index 45abb55..0000000
--- a/scripts/viewdb.php
+++ /dev/null
@@ -1,123 +0,0 @@
-select_db('birds');
-
-if ($mysqli->connect_error) {
- die('Connect Error (' .
- $mysqli->connect_errno . ') '.
- $mysqli->connect_error);
-}
-
-// SQL query to select data from database
-$sql = "SELECT COUNT(*) AS 'Total' FROM detections
- ORDER BY Date DESC, Time DESC";
-$totalcount = $mysqli->query($sql);
-
-$sql1 = "SELECT Date, Time, Sci_Name, Com_Name, MAX(Confidence)
- FROM detections
- WHERE Date = CURDATE()
- GROUP BY Date, Time, Sci_Name, Com_Name
- ORDER BY Time DESC";
-$mosttable = $mysqli->query($sql1);
-
-$sql2 = "SELECT COUNT(*) AS 'Total' FROM detections
- WHERE Date = CURDATE()";
-$todayscount = $mysqli->query($sql2);
-
-$sql3 = "SELECT COUNT(*) AS 'Total' FROM detections
- WHERE Date = CURDATE()
- AND Time >= DATE_SUB(NOW(),INTERVAL 1 HOUR)";
-$lasthourcount = $mysqli->query($sql3);
-
-$sql4 = "SELECT Com_Name, Date, Time, MAX(Confidence)
- FROM detections
- GROUP BY Com_Name
- ORDER BY MAX(Confidence) DESC";
-$specieslist = $mysqli->query($sql4);
-$speciescount = mysqli_num_rows($specieslist);
-
-$sql5 = "SELECT Com_Name,COUNT(*)
- AS 'Total'
- FROM detections
- GROUP BY Com_Name
- ORDER BY Total DESC";
-$speciestally = $mysqli->query($sql5);
-
-$mysqli->close();
-?>
-
-
-
-
-
-
-
- BirdNET-Pi DB
-
-
-
-
-
-
- Number of Detections
-
-
-
-
- Total
- Today
- Last Hour
- Number of Unique Species
-
-
- fetch_assoc()) { echo $row['Total']; };?>
- fetch_assoc()) { echo $row['Total']; };?>
- fetch_assoc()) { echo $row['Total']; };?>
-
-
-
-
-
- Today's Detections
-
-
-
- Time
- Scientific Name
- Common Name
- Confidence
- Links
-
-
-fetch_assoc())
-{
- $Confidence = sprintf("%.1f%%", $rows['MAX(Confidence)'] * 100);
- $dbname = preg_replace('/ /', '_', $rows['Com_Name']);
- $dbname = preg_replace('/\'/', '', $dbname);
- $dbsciname = preg_replace('/ /', '_', $rows['Sci_Name']);
-?>
-
-
-
-
-
-
- All About Birds , Wikipedia
-
-
-
diff --git a/scripts/welcome_wizard.sh b/scripts/welcome_wizard.sh
deleted file mode 100755
index beff850..0000000
--- a/scripts/welcome_wizard.sh
+++ /dev/null
@@ -1,167 +0,0 @@
-#!/usr/bin/env bash
-# BirdNET-Pi Welcome Wiz!
-#trap 'systemctl --user disable birdnet-pi-config-gui.service' EXIT 0
-set -x
-
-birdnet_config=/home/pi/BirdNET-Pi/birdnet.conf
-
-zenity --title="Welcome!" --ok-label="Next" --window-icon=/usr/share/pixmaps/red-cardinal32.png \
- --info --text="
-Thank for you installing BirdNET-Pi\!" --no-wrap --icon-name=red-cardinal
-
- [ $? -eq 1 ] && exit 1
-
-overview() {
- zenity --title="Configuration Wizard" --window-icon=/usr/share/pixmaps/red-cardinal32.png --width=300 --ok-label="Exit" \
- --extra-button="Next" --info --text="This will walk you through the following steps:
-
-1) Change the 'pi' user password
-
-2) Setting your Language, Country, Timezone, Keyboard, and WiFi Country (if applicable)
-
-3) Connect to WiFi (if applicable) / Set Date and Time (if applicable)
-
-4) Set BirdNET-Pi's latitude and longitude
-
-5) Set the web interface and database passwords
-
-6) Updating the system to use your new birdnet.conf file" --no-wrap --icon-name=red-cardinal
-
- if [ $? -eq 0 ];then
- exit 0
- elif [ $? -eq 1 ];then
- open_rpi_configuration && change_password
- fi
-}
-
-change_password() {
- zenity --title="Change the 'pi' user password" \
- --window-icon=/usr/share/pixmaps/red-cardinal32.png --ok-label="Back" \
- --extra-button="Continue" --info --text="Click the button labeled \"Change Password...\"
-and enter your new password in each box." --no-wrap --icon-name=red-cardinal
-
- if [ $? -eq 1 ];then
- change_locale
- else
- overview
- fi
-}
-
-change_locale() {
- zenity --title="Setting Language, Country, Timezone, Keyboard, and WiFI Country" \
- --window-icon=/usr/share/pixmaps/red-cardinal32.png --ok-label="Back" \
- --extra-button="Continue" --info --text="Use the right-most tab labeled \"Localisation\"
-
-1) Locale: Set your Language and Country -- leave Character Set as \"UTF-8\"
-
-2) Timezone: Set your Area and Location
-
-3) Keyboard: Set your keyboard
-
-4) WiFi Country: Choose your country from the list" --no-wrap --icon-name=red-cardinal
-
- if [ $? -eq 1 ];then
- sync_clock
- else
- change_password
- fi
-}
-
-sync_clock() {
- zenity --title="Connecting to WiFi/Setting the Date and Time" --window-icon=/usr/share/pixmaps/red-cardinal32.png \
- --question --ok-label="Automatically" --cancel-label="Manually" --icon-name=red-cardinal --text="Should the installation update the date and time Automatically (using the internet),
-or will you do this Manually?" --no-wrap
- if [ $? -eq 1 ];then
- get_date_and_time
- else
- setup_wifi
- fi
-}
-
-get_date_and_time() {
- full_date="$(zenity --forms --title="Set the current time" --window-icon=/usr/share/pixmaps/red-cardinal32.png --add-calendar=Calendar --add-combo="Current Hour (24h)" --combo-values="01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23" --add-combo="Current Minute" --combo-values="00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46|47|48|49|50|51|52|53|54|55|56|57|58|59" --add-combo="Current Second" --combo-values="00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46|47|48|49|50|51|52|53|54|55|56|57|58|59")"
- current_date="$(echo ${full_date} | awk -F\| '{print $1}')"
- if ! [ -z $current_date ];then
- current_time="$(echo ${full_date} | awk -F\| '{print $1" "$2":"$3":"$4}')"
- sudo date -s "${current_time}"
- get_latitude
- else
- sync_clock
- fi
-}
-
-setup_wifi() {
- sudo systemctl start dhcpcd
- wifi_list=""
- until [[ "${wifi_list}" == "Continue" ]];do
- wifi_list="$(zenity --title="Connect to WiFi" --extra-button="Refresh WiFi List" --window-icon=/usr/share/pixmaps/red-cardinal32.png --info --text="Use the Networking Icon in the bottom right corner of
-the screen to select your WiFi network. Enter the credentials to connect when prompted.
-
-If you are currently connected to BirdNET-Pi via its Access Point and VNC/NoMachine,
-this connection will be severed as soon as the new connection is made.
-Simply connect your VNC/NoMachine client to the network which you are
-currently configuring BirdNET-Pi to use, and you will be able to resume the setup.
-
-Press \"Continue\" AFTER you have connected." --ok-label="Continue" --no-wrap)"
- [ -z ${wifi_list} ] && break
- if [[ "${wifi_list}" == "Refresh WiFi List" ]];then
- sudo systemctl restart dhcpcd
- fi
-done
-
- get_latitude
-}
-
-open_rpi_configuration() {
- if ! pgrep rc_gui;then
- env SUDO_ASKPASS=/usr/lib/rc-gui/pwdrcg.sh sudo -AE rc_gui &
- sleep 1.5
- fi
-}
-
-get_latitude() {
- new_lat="$(zenity --cancel-label="Back" --ok-label="Set" --title="Enter Your Latitude" --window-icon=/usr/share/pixmaps/red-cardinal32.png --width=300 --entry --text="Enter your Latitude.
-
- A network guess: $(curl -s4 ifconfig.co/json | awk '/lat/ {print $2}' | tr -d ',')")"
-
- if [ -n "$new_lat" ];then
- get_longitude
- else
- change_locale
- fi
-}
-
-get_longitude() {
- new_lon="$(zenity --cancel-label="Back" --ok-label="Set" --title="Enter Your Longitude" --window-icon=/usr/share/pixmaps/red-cardinal32.png --width=300 --entry --text="Enter your Longitude.
-
- A network guess: $(curl -s4 ifconfig.co/json | awk '/lon/ {print $2}' | tr -d ',')")"
-
- if [ -n "$new_lon" ];then
- set_caddy_pwd
- else
- get_latitude
- fi
-}
-
-set_caddy_pwd() {
- caddy_pwd="$(zenity --cancel-label="Back" --ok-label="Set" --title="Set Web Password" --window-icon=/usr/share/pixmaps/red-cardinal32.png --width=300 --entry --text="Set a new password for the web interface")"
-
- if [ -n "${caddy_pwd}" ];then
- set_db_pwd
- else
- get_longitude
- fi
-}
-
-set_db_pwd() {
- db_pwd="$(zenity --cancel-label="Back" --ok-label="Set" --title="Set The Database Password" --window-icon=/usr/share/pixmaps/red-cardinal32.png --width=300 --entry --text="Set a new password for the databse.")"
-
- if [ -n "${db_pwd}" ];then
- rearview
- else
- set_caddy_pwd
- fi
-}
-
-
-overview
diff --git a/scripts/write_config.php b/scripts/write_config.php
deleted file mode 100644
index f423cd5..0000000
--- a/scripts/write_config.php
+++ /dev/null
@@ -1,50 +0,0 @@
-
-
diff --git a/templates/avahi-alias@.service b/templates/avahi-alias@.service
deleted file mode 100644
index 6bcc3e7..0000000
--- a/templates/avahi-alias@.service
+++ /dev/null
@@ -1,10 +0,0 @@
-[Unit]
-Description=Publish %I as alias for %H.local via mdns
-After=network.target network-online.target
-Requires=network-online.target
-[Service]
-Restart=always
-Type=simple
-ExecStart=/bin/bash -c "/usr/bin/avahi-publish -a -R %I $(avahi-resolve -4 -n %H.local | cut -f 2)"
-[Install]
-WantedBy=multi-user.target
diff --git a/templates/bashrc b/templates/bashrc
index c104735..f5a93a8 100644
--- a/templates/bashrc
+++ b/templates/bashrc
@@ -112,3 +112,8 @@ if ! shopt -oq posix; then
fi
fi
cd ~/BirdNET-Pi
+function remove() {
+ find /home/pi/BirdSongs -iname *${1}* -exec rm -drfv {} +
+}
+alias rerc="source ~/.bashrc"
+alias vimrc="vim ~/.bashrc"
diff --git a/templates/birdnet_analysis.service b/templates/birdnet_analysis.service
deleted file mode 100644
index 0817d89..0000000
--- a/templates/birdnet_analysis.service
+++ /dev/null
@@ -1,14 +0,0 @@
-[Unit]
-Description=BirdNET Analysis
-Requires=${SYSTEMD_MOUNT}
-After=network-online.target ${SYSTEMD_MOUNT}
-
-[Service]
-Restart=always
-Type=simple
-RestartSec=1
-User=${BIRDNET_USER}
-ExecStart=/usr/local/bin/birdnet_analysis.sh
-
-[Install]
-WantedBy=multi-user.target
diff --git a/templates/birdnet_log.service b/templates/birdnet_log.service
deleted file mode 100644
index 75f5c75..0000000
--- a/templates/birdnet_log.service
+++ /dev/null
@@ -1,11 +0,0 @@
-[Unit]
-Description=BirdNET Analysis Log
-[Service]
-Restart=on-failure
-RestartSec=3
-Type=simple
-User=${BIRDNET_USER}
-Environment=TERM=xterm-256color
-ExecStart=/usr/local/bin/gotty -p 8080 --title-format "BirdNET-Lite Log" journalctl -fu birdnet_analysis.service
-[Install]
-WantedBy=multi-user.target
diff --git a/templates/birdnet_recording.service b/templates/birdnet_recording.service
deleted file mode 100644
index 6f7c4f4..0000000
--- a/templates/birdnet_recording.service
+++ /dev/null
@@ -1,11 +0,0 @@
-[Unit]
-Description=BirdNET Recording
-[Service]
-Environment=XDG_RUNTIME_DIR=/run/user/1000
-Restart=always
-Type=simple
-RestartSec=3
-User=${BIRDNET_USER}
-ExecStart=/usr/local/bin/birdnet_recording.sh
-[Install]
-WantedBy=multi-user.target
diff --git a/templates/birdstats.service b/templates/birdstats.service
deleted file mode 100644
index 10ddf7e..0000000
--- a/templates/birdstats.service
+++ /dev/null
@@ -1,11 +0,0 @@
-[Unit]
-Description=BirdNET Statistics Log
-[Service]
-Restart=on-failure
-RestartSec=3
-Type=simple
-User=${BIRDNET_USER}
-Environment=TERM=xterm-256color
-ExecStart=/usr/local/bin/gotty -p 9090 --title-format "BirdNET-Lite Statistics" /usr/local/bin/birdnet_stats.sh
-[Install]
-WantedBy=multi-user.target
diff --git a/templates/birdterminal.service b/templates/birdterminal.service
deleted file mode 100644
index d564374..0000000
--- a/templates/birdterminal.service
+++ /dev/null
@@ -1,13 +0,0 @@
-[Unit]
-Description=A BirdNET-Lite Web Terminal
-
-[Service]
-Restart=on-failure
-RestartSec=3
-Type=simple
-User=${BIRDNET_USER}
-Environment=TERM=xterm-256color
-ExecStart=/usr/local/bin/gotty -w --title-format "Login!" -p 9111 tmux new -A -s Login sudo bash -c login
-
-[Install]
-WantedBy=multi-user.target
diff --git a/templates/extraction.service b/templates/extraction.service
deleted file mode 100644
index 00d3f73..0000000
--- a/templates/extraction.service
+++ /dev/null
@@ -1,10 +0,0 @@
-[Unit]
-Description=BirdNET BirdSound Extraction
-[Service]
-Restart=on-failure
-RestartSec=3
-Type=simple
-User=${BIRDNET_USER}
-ExecStart=/usr/local/bin/extract_new_birdsounds.sh
-[Install]
-WantedBy=multi-user.target
diff --git a/templates/extraction.timer b/templates/extraction.timer
deleted file mode 100644
index ce36129..0000000
--- a/templates/extraction.timer
+++ /dev/null
@@ -1,8 +0,0 @@
-[Unit]
-Description=BirdNET BirdSound Extraction Timer
-Requires=extraction.service
-[Timer]
-Unit=extraction.service
-OnCalendar=*:*:0/10
-[Install]
-WantedBy=multi-user.target
diff --git a/templates/extraction_log.service b/templates/extraction_log.service
deleted file mode 100644
index 76d87db..0000000
--- a/templates/extraction_log.service
+++ /dev/null
@@ -1,11 +0,0 @@
-[Unit]
-Description=BirdNET Extraction Log
-[Service]
-Restart=on-failure
-RestartSec=3
-Type=simple
-User=${BIRDNET_USER}
-Environment=TERM=xterm-256color
-ExecStart=/usr/local/bin/gotty -p 8888 --title-format "Extractions Log" journalctl -fu extraction.service
-[Install]
-WantedBy=multi-user.target
diff --git a/templates/livestream.service b/templates/livestream.service
deleted file mode 100644
index ee28e4a..0000000
--- a/templates/livestream.service
+++ /dev/null
@@ -1,11 +0,0 @@
-[Unit]
-Description=BirdNET-Pi Live Stream
-[Service]
-Environment=XDG_RUNTIME_DIR=/run/user/1000
-Restart=always
-Type=simple
-RestartSec=3
-User=${BIRDNET_USER}
-ExecStart=ffmpeg -loglevel 52 -ac 2 -f alsa -i ${REC_CARD} -acodec libmp3lame -b:a 320k -ac 2 -content_type 'audio/mpeg' -f mp3 icecast://source:${ICE_PWD}@localhost:8000/stream -re
-[Install]
-WantedBy=multi-user.target
diff --git a/templates/phpsysinfo.ini b/templates/phpsysinfo.ini
index 90bab10..ccf35df 100644
--- a/templates/phpsysinfo.ini
+++ b/templates/phpsysinfo.ini
@@ -397,7 +397,7 @@ HIDE_TOTALS=false
; Example : HIDE_NETWORK_INTERFACE="eth0,sit0"
; HIDE_NETWORK_INTERFACE=true //hide all network interfaces
;
-HIDE_NETWORK_INTERFACE="lo"
+HIDE_NETWORK_INTERFACE=""
; Use a regular expression in the name of a hidden network interface (e.g. HIDE_NETWORK_INTERFACE="docker.*")
@@ -785,7 +785,7 @@ USE_REGEX=false
;
; string contains a list of process names that are checked, names are seperated by a comma (on WinNT names must end with '.exe')
;
-PROCESSES="avahi-daemon,gotty,sshd,mariadbd,ffmpeg,vncserver-x11-serviced,nxd,bash"
+PROCESSES="avahi-daemon,gotty,sshd,ffmpeg,icecast2,arecord,server.py"
[quotas]
diff --git a/templates/pushed_notifications.service b/templates/pushed_notifications.service
deleted file mode 100644
index 4df4e9b..0000000
--- a/templates/pushed_notifications.service
+++ /dev/null
@@ -1,10 +0,0 @@
-[Unit]
-Description=BirdNET-Pi Pushed.co Notifications
-[Service]
-Restart=on-success
-RestartSec=3
-Type=simple
-User=pi
-ExecStart=/usr/local/bin/species_notifier.sh
-[Install]
-WantedBy=multi-user.target
diff --git a/version.md b/version.md
index 66d3c84..62cf729 100644
--- a/version.md
+++ b/version.md
@@ -1,3 +1,16 @@
+# 0.13
+- Removed secondary and tertiary custom URLs
+- Added new custom-compiled GoTTY binary
+- All new web interface
+- SQLite database replaced MariaDB
+- Better service controls
+- Spectrogram views
+- Privacy server.py for testing
+- New mobile view
+- Moved (nearly) all CSS to style.css
+- Added "try/except" to server.py to fail BirdWeather
+ POSTing gracefully and not kill the service
+
# main v.11.1
- `server.py` socket
- Removed DB password from scripts