From 8262febe325acac9e4337c646c82e11cef946326 Mon Sep 17 00:00:00 2001 From: Quitta Date: Fri, 16 Aug 2013 21:43:39 +0200 Subject: [PATCH] sending mail with supportgroup ID is possible --HG-- branch : quitta-gsoc-2013 --- .../ams_lib/autoload/mail_handler.php | 36 +++++++++--------- .../tools/server/ryzom_ams/www/config.php | 4 +- .../server/ryzom_ams/www/html/sql/install.php | 16 ++++---- .../ryzom_ams/www/html/sql/ticketsql.sql | 14 +++---- .../www/html/sql/ticketsystemmodel.mwb | Bin 17249 -> 17315 bytes 5 files changed, 36 insertions(+), 34 deletions(-) diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/mail_handler.php b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/mail_handler.php index 4c5e14caf..67c53b301 100644 --- a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/mail_handler.php +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/mail_handler.php @@ -58,11 +58,14 @@ class Mail_Handler{ //the main function function cron() { global $cfg; - $inbox_username = $cfg['mail']['username']; + $default_groupemail = $cfg['mail']['default_groupemail']; + $default_groupname = $cfg['mail']['default_groupname']; + /*$inbox_username = $cfg['mail']['username']; $inbox_password = $cfg['mail']['password']; $inbox_host = $cfg['mail']['host']; $oms_reply_to = "Ryzom Ticketing Support "; - global $MAIL_DIR; + global $MAIL_DIR;*/ + // Deliver new mail echo("mail cron\n"); @@ -70,15 +73,14 @@ class Mail_Handler{ //creates child process $pid = self::mail_fork(); $pidfile = '/tmp/ams_cron_email_pid'; - - //INFO: if $pid = - //-1: "Could not fork!\n"; - // 0: "In child!\n"; - //>0: "In parent!\n"; if($pid) { // We're the parent process, do nothing! + //INFO: if $pid = + //-1: "Could not fork!\n"; + // 0: "In child!\n"; + //>0: "In parent!\n"; } else { //make db connection here because the children have to make the connection. @@ -86,6 +88,7 @@ class Mail_Handler{ //if $pidfile doesn't exist yet, then start sending the mails that are in the db. if(!file_exists($pidfile)) { + //create the file and write the child processes id in it! $pid = getmypid(); $file = fopen($pidfile, 'w'); @@ -106,18 +109,16 @@ class Mail_Handler{ $email['Recipient'] = Ticket_User::get_email_by_user_id($email['UserId']); } - //create sending email adres based on the $sender id - if($email['Sender'] != 0) { - $username = Ticket_User::get_username_from_id($email['Sender']); - $from = "$username <$username@$inbox_host>"; + //create sending email adres based on the $sender id which refers to the department id + if($email['Sender'] == NULL) { + $from = $default_groupname ." <".$default_groupemail.">"; } else { - $from = $oms_reply_to; + $group = Support_Group::getGroup($email['Sender']); + $from = $group->getName()." <".$group->getGroupEmail().">"; } + $headers = "From: $from\r\n" . "Message-ID: " . $message_id ; - print("recip: " . $email['Recipient']); - print("subj: " .$email['Subject']); - print("body: " . $email['Body']); - print("headers: " . $headers); + if(mail($email['Recipient'], $email['Subject'], $email['Body'], $headers)) { $status = "DELIVERED"; echo("Emailed {$email['Recipient']}\n"); @@ -127,13 +128,12 @@ class Mail_Handler{ } //change the status of the emails. $this->db->execute('update email set Status = ?, MessageId = ?, Attempts = Attempts + 1 where MailId = ?', array($status, $message_id, $email['MailId'])); - //db_exec('update email set status = ?, message_id = ?, attempts = attempts + 1 where id_email = ?', array($status, $message_id, $email['id_email'])); + } unlink($pidfile); } // Check mail - //$mailbox = imap_open("{localhost:110/pop3/novalidate-cert}INBOX", $inbox_username, $inbox_password); $mbox = imap_open($cfg['mail']['server'], $inbox_username, $inbox_password) or die('Cannot connect to mail server: ' . imap_last_error()); $message_count = imap_num_msg($mbox); diff --git a/code/ryzom/tools/server/ryzom_ams/www/config.php b/code/ryzom/tools/server/ryzom_ams/www/config.php index 4112b9f32..611d96e76 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/config.php +++ b/code/ryzom/tools/server/ryzom_ams/www/config.php @@ -31,9 +31,11 @@ $cfg['db']['ring']['name'] = 'ring_open'; $cfg['db']['ring']['user'] = 'shard'; $cfg['db']['ring']['pass'] = ''; +$cfg['mail']['default_groupemail'] = 'support@ryzomcore.com'; +$cfg['mail']['default_groupname'] = 'Ryzomcore Support'; $cfg['mail']['username'] = 'amsryzom@gmail.com'; $cfg['mail']['password'] = 'lol123bol'; -$cfg['mail']['host'] = 'ryzomcore.com'; +//$cfg['mail']['host'] = 'ryzomcore.com'; // To connect to an IMAP server running on port 143 on the local machine, // do the following: $mbox = imap_open("{localhost:143}INBOX", "user_id", "password"); diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/sql/install.php b/code/ryzom/tools/server/ryzom_ams/www/html/sql/install.php index 6a49cf8bd..acfdb3987 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/sql/install.php +++ b/code/ryzom/tools/server/ryzom_ams/www/html/sql/install.php @@ -353,19 +353,14 @@ `Body` VARCHAR(400) NULL , `Status` VARCHAR(45) NULL , `Attempts` VARCHAR(45) NULL DEFAULT 0 , - `Sender` INT(10) UNSIGNED NOT NULL , `UserId` INT(10) UNSIGNED NOT NULL , - `MessageId` VARCHAR(45) NOT NULL , + `MessageId` VARCHAR(45) NULL , `TicketId` INT UNSIGNED NOT NULL , + `Sender` INT(10) UNSIGNED NULL , PRIMARY KEY (`MailId`) , - INDEX `fk_email_ticket_user1` (`Sender` ASC) , INDEX `fk_email_ticket_user2` (`UserId` ASC) , INDEX `fk_email_ticket1` (`TicketId` ASC) , - CONSTRAINT `fk_email_ticket_user1` - FOREIGN KEY (`Sender` ) - REFERENCES `" . $cfg['db']['lib']['name'] ."`.`ticket_user` (`TUserId` ) - ON DELETE NO ACTION - ON UPDATE NO ACTION, + INDEX `fk_email_support_group1` (`Sender` ASC) , CONSTRAINT `fk_email_ticket_user2` FOREIGN KEY (`UserId` ) REFERENCES `" . $cfg['db']['lib']['name'] ."`.`ticket_user` (`TUserId` ) @@ -375,6 +370,11 @@ FOREIGN KEY (`TicketId` ) REFERENCES `" . $cfg['db']['lib']['name'] ."`.`ticket` (`TId` ) ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_email_support_group1` + FOREIGN KEY (`Sender` ) + REFERENCES `" . $cfg['db']['lib']['name'] ."`.`support_group` (`SGroupId` ) + ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB; diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/sql/ticketsql.sql b/code/ryzom/tools/server/ryzom_ams/www/html/sql/ticketsql.sql index 905f8f693..66059fa8d 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/sql/ticketsql.sql +++ b/code/ryzom/tools/server/ryzom_ams/www/html/sql/ticketsql.sql @@ -309,19 +309,14 @@ CREATE TABLE IF NOT EXISTS `mydb`.`email` ( `Body` VARCHAR(400) NULL , `Status` VARCHAR(45) NULL , `Attempts` VARCHAR(45) NULL DEFAULT 0 , - `Sender` INT(10) UNSIGNED NOT NULL , `UserId` INT(10) UNSIGNED NOT NULL , `MessageId` VARCHAR(45) NOT NULL , `TicketId` INT UNSIGNED NOT NULL , + `Sender` INT(10) UNSIGNED NULL , PRIMARY KEY (`MailId`) , - INDEX `fk_email_ticket_user1` (`Sender` ASC) , INDEX `fk_email_ticket_user2` (`UserId` ASC) , INDEX `fk_email_ticket1` (`TicketId` ASC) , - CONSTRAINT `fk_email_ticket_user1` - FOREIGN KEY (`Sender` ) - REFERENCES `mydb`.`ticket_user` (`TUserId` ) - ON DELETE NO ACTION - ON UPDATE NO ACTION, + INDEX `fk_email_support_group1` (`Sender` ASC) , CONSTRAINT `fk_email_ticket_user2` FOREIGN KEY (`UserId` ) REFERENCES `mydb`.`ticket_user` (`TUserId` ) @@ -331,6 +326,11 @@ CREATE TABLE IF NOT EXISTS `mydb`.`email` ( FOREIGN KEY (`TicketId` ) REFERENCES `mydb`.`ticket` (`TId` ) ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_email_support_group1` + FOREIGN KEY (`Sender` ) + REFERENCES `mydb`.`support_group` (`SGroupId` ) + ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB; diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/sql/ticketsystemmodel.mwb b/code/ryzom/tools/server/ryzom_ams/www/html/sql/ticketsystemmodel.mwb index cc8aec0c235f77bdc1681d83396bac44250bb3fb..47b014bc951ad98d658f45a87503af9edf562903 100644 GIT binary patch delta 9481 zcmZvCRZyNmlP<2o-QC^c!`)qiI|O&Pmn1mBHNoB8-2()7hv4q6-{#+QwrVeSE_!OJ z#=57vpYG}24udQRhs0A;goeR}fPg@NKuboKgm#(NP6k0hSk>YEApu;{Jf+sBB}GDGpBFQvLhAcIBn*Rc{1h@*j$hjnJ@rNU5rt%EBX5Z!+HYz@m&OEA zN+r!)_~`;};h;4b3|}BWyrT7B1{(ADRke_e;`>9E9N4q&p%j-|nmc6Z2bbouK#c=o zB>kW*@|@gqkV37B)ppP~Zp@-NxmFksZct3f*v`LUJT^umC24e7PnJ_U=m}=x%$dgkYBchQU#8`IfbVt76!3kOi`z=KqkJ}1u+>~t z9V*sQfVOv*el|~p*tE>L3a0YBL~a;jc>r>eCbnohIMCM>(iF1RALfiMa09!$oo`=` zm56-EtV5GnhCYU3$P7!9SVs^m3_Co2r}mrywaSSye&@n_nCQ zs#Wj`0d5bvHee7nFm&=8b?fE?6y0a%nksqtXanR+5=W+&##{bXi4~clm~&;qBngwM zP*Z5&VJt~CjN*!bcFq%Z1Z!8%J)8 zyZA^ONBHLN({4i2z{?z8GKCWV;mV4V;gy5+qYI+(`Bh%2`^41y_3wSd?a;J}d(aju zVFNdr&We~(x9I7eh*4+HU2mG~wcNvDXT^?I0+P}FxL!rJKI;UMf1hZ)+V+@}Y*)2# zOIIo&WM(;xggL&29tazr|8y zQX?~00e^T^G!`miaM|#N6|k}XV>#*-FPWT73GO=2&|(KI)+Jy^ivapo!V0DAAs zULK*W;^*o84Ocf4aZp?5_k*dn4xNbXt(gu0;rhrFB?Z%+8P0vngl2{NzSWB&pM(qN zWci+qBf_?>ir%UYaw%xvFmeAY<7rO}#kWe>>gu{e_SW^#ijsqSY^;Hy{KeW7kK6V)oqz|IqqU!@+|PYo(c$0Cs&muIq2@%Y3+hwcu= zK{wP4!%8gTu}8(ppln0<#Suw0Ndg1l5zFJ%pf|^+-;0zOR%57u#C}N@r0|jZd`w;9 zOZ;tlSa?vx?wdZ|Yr0-bWTb*_OI6%O1g5&TNBGzZ)S$@0HA!7qv$!$unp!6xF5I#otlYO*q=hjjazt+q# z$tqdF2)lKr0ygN;pV$olQW3mZ*+fk|yRlYom|{wHYG@A7bpOximB-;+z~Llm2KF zy)ZeG8jlV;Ol585lhIT|r~x0F$g)Zo!OybrT+uJ;vQj9PM8OORdKn|~8dNgLP(1o_ zD1t8S!t;N{V&K$wcNqbo=VaUk+e2w^TCeP8B$Jb42RmX$!JN8McrX_seumuA34hkomgS!qg+G1!@Ce;qCSy+*ogkwgn zkh(EGTqpe`@;roTIzljHFFo{+NzPj@13$5_ibASyGWelo7~J0hIL;Epn6n;;7+gXE zivD;>JkB=0QRvg#{_#K`)3#9o+TGB^c%)1cuk9ml0c-_SVmq2}%TLY7%dAC0UK8ed zH8FT4MxXz~>Q5vyOMH0xJ-ZFsA{#%2`CNQxo>e)N7l|sqT4VB{yl0Sq(WKp=$Yl=L|tS6dD`Ec&+Tj;KE)q@*UU@!e(^dOX2H} z$d9ONmH3=x!&6?4zf$*&-CkuMMTVwmQE6ENTg`XC0@z34nkl%ZMLAlqGdmbm44e68 z{;2(xQS@}5f+c8i?Ey)P1FQI<{0A!Cd2gSm_HV5bId}cMis0|v0`#z2xgcp&^Gk%v zk`MEs_DoZ)H;=Y`p2(ka=6ZbZhLaCpg9P3kK3~VP8~3Qu*jQX~%hqS?l+~c=pg&L^*?B zjSJ2__Oy=og0|!=@y!SREALP(x*f69hIaWqKzbmP!Jh#0gQWv=JG}AwsF10-nT)kFH_=@fKQ=EMIvQsYeY6~<=U4DEK!Nb!Z1MEN#{wB>qui#bXs z{oymirtHrrqAuNlj0x|#-y1Y8Ygs$iRm@yzLs5K9Q+zdN#2i1~> zpq9?e058GjeMEqUEJz^dpy1SgY*M*mv8U}Q_uO%Oc%PAxU6nN8-m8u~DbeJ^lGaP} zdI!$Vo8Z;3ci6{ElhMYffg&l2jtuBZ{c-UqcWqafsa(HelFV+=HDcaWvJ|&AGFAIV zLp|g_F|%@CWaQl4#4LRE+3O>19*WgEV&LLw=pn61);AfcN6B`gwb1=cQm44Q zLICky5cloY#9Ni)+D7)}$9LJ&j}4x@g>Sk%dzRC4+9oWlf)g^>)(iz!V`eEJCU#blGJeB zHLaaU#!;DQEoK~-wvS=dasl&&dTNRH4;fA2p8G8>Y;h%c zgm+vXLvvo$SRCycCX3VRx5>DaXmaOsuxuOoIfnLFS z8ar0pS%hEWgW*CPX1>=vIs;Gof^Fjlcg;;bY&-W>-~?J+{$j;kLGQJL-}$Y!2MPExv1NPX@p6mz(av{kZuE#@yi|C+RQ&LUn@$__;*@xx zTt;$;3!kp>E`GUVba>ulaR;cc=<#$uy*A)v#0IKZl>laqzDXx5n(fd^W!r0yS*lhg z8V^Q({qFL-YU0BF3jPT1cOUML=ed6z5=#U!&RAgwK8}yyu~-yAuT}x|bCKN6p!4>A z!QOxu8*dfo2E-vIC3?4dEJlaTkX7GE|6qc9r|F)jH`WY|^8REbRWAh|7bfE^%Rg~Q zE}_0ss(=?Mj|mKkr>h0OY1UR!Q@Cqr>x&3CkaCvzS~`qyL? zU*u%pUhpr&mA^g&w(Onxy?)#*HGoe7j*JaOa`@i4Y4r}87UvlrGEW!!ikD0JwnViv z&AY%ynYFmze>Ua(^!&wT$ElE5H~M{MTdD8$C(z#!9Rxn_jpCmeGa-8&RKmh{hQ+mQxPwIxaRP|!#Vdf_B@fcHblR; zd;1}0GIhVlisb#iCP{Xf=6TB6=6mqO9|PNOy>ul~W-KpfE+N@IcId}swd~W(K6PLX zRG%p`GTqr^=h#2yUTDQuZ?wIKRLX*L0dxA-kOVOlcr&q|yQ%K1m9d#_qv_<*$syRe~2hM;^n#D z0_coPdt^hQ*h+d&hS1~O$Im_qWNzi%(a+tPr<)r#IL;%BOHAFfsno-1Zp)k~z!!I} z_H66OSiaYvWMrMs&~uydSRF`(`R~DDT~4_pVz3hC66`n;wI4ZC*4_aJ(u*bJWD}me zvh{czW3yTHx+l-GijPi;j2vH@Z$75(TjKb3XC|?$*ia|*(NJZVD%zeoO89zuA`7(4 z64Eu~`4ojfmzf>mbj%tIs<&F0z;O`i2YSA@KOy{)z{C)l#r>-dM^t_JV{3@@vfjyn z6_v>^Z5Y?p%Wxrl4|b%|GhMsL>`!4H{AZ66(&69xAa$)Cd3-U%gK>JxA!`#A?q3_1 zkR?L2#E#=(qw<}mWux@<94o>R6RSiL@T$8ITSj#hs@eB>_$3ytn9Y(5@ z#`qIG3*02VX0=OvcPk?1h_H4jY|^7^ZRS5}t&%)rcUgoA{G@ zjbMoVzr9M?r4w*nKhXg^W=Kit?3pE*B>{677>Fib8rN_PfhZvWlmt((niqrVMB_>m zcCae^p{6Cua%HP`aXHG>@!%77B7P|2I9zblz|ApTc+ci49;OX!V|k7aMdXj!^b37_ zv5N0=e`+HL1Yry^5PoVP24T~QGnJ_kZ?C5|TLj7J?@LEs!)f(QeyJep#WpPuQd+^u zQy<^2#(_)+@fX(uN)n+`!s$Ed22#H*?Ny$F_)YEbit|T8(rJ#a(pL@TjqdMe4W|yM zpuYhB80J^6H4DGZTaYqRf>L;5Kgx|ok^=aT%25vrnYO)7u5vLke!DrUhK}Z`f>B*~ z;Br@C851}aiBp|5Jpv!F*^%(IMGLU|wCpGQlA*we>_q^f1ikf^3Gy!#vBE`?yjBG? zYlW{|Aogx_*D<+k3rPHOqj_3lyn3!QeVEEkxfSn zsRLO-h^I=!uB;T|#e!_QU|SbONQz|r$R>Ia(oYGiLlUJuQkcm=`~@0)aggz<211Sp zR>Mnp8iuROUKpZKWvmB^T)P8+9pa}D5`)=q2{X&3>PT1@EgYAM`@P1e4MPu`Y!_@V zolXe+KCXs^Oa@hDFotnp$w$-+eC2hg`~<6ZVmcgDR=Wn}#DL@0L<;dQax+!NTNdW}hZT_)>xUN$ z;@^4O4SC3tKW-<-XgPsm=D61Zjf$5J-Tt0HL#BxpIVOWVmDH{l#ho3Mn~?tUQp^(K zEPhu2uSIJ)nVNLX2E zN9anF`fWPaKm&;>a)z5=s5lB{4Hiq7?0xJ`HaerOxgFG-!XJ+|CgYP$$+U$!=8^Sz zdtoW6;r8`qbv(M~x!`=r$C{@ftWhs`<{jmg#Q=ISNPjYi2S;n4?`3i*!fR*`^enXK zv{YHe-R3O$#nvEeYMtCyS;r~c5s_qHI^E1|@MI5}C@LrEanS>4?Wm?=?}ejA3Yw%H zw8P5tdtRnWgbbSH)<>@PZUK|N$UFjhJST2iDrvXw`r2tpSabV+nm;>H9WUIB;9qYD z8-01%LvGz3ONXl`go68OL##0=*ckgfx*Ko`+U;XH<0wt-2CBn``&~j3237zjP>Y_(8G_Hoqy4_ zZ0C3G98t;KsDSHIEQ-c)<0@&^mFC>>OFOFYg+?s#oezqi5D|WgB|)g7)+Vg*=3tla z@}DkW8tLlEeJ4MX0@9x9!}awd9lp{VLal$7hCAdr6a!L3AHHnYhaMg@kv1gX+2kGO zuX2n{>C`VCs8Yh1&PL17WQQ7ySAgWNAR`dbg{MF_Z0Sxeiq z=J2!{*eT^IUU%wJ<)P|Q`7s^0Q6-0TCmtf%3p-0YiRDnqz9eaRUZ&<@zGcLe!`&Ri zm7!l)>QgB4m@Auk(n^Y_$O;iF_CfP`!I-6YAfQ_EycZoOQ6r@)HW1hZg|Z^Gz3~jI zC+G+Xf7!d6)VEtYX5}FkD_O!gb%qZc{*%mD4GHQp17&4v&d6ku>Z}(QXhwhPs@c>I z=ky+(M*PzWXO)fesifZUWZpv5J>mTJvsNf8Zbts(Xq#!RG+W{1EzEh4=DSE+9wLp# zC*b{w%t}iQgOi%3B-5N32kR3Pu6bgNnJzm^ZTTQ&~qs5%82FMD@1z5~y~ zEtr-S-WU{=*c5o@@tl9j`5^6TT}|zGXK=Lk}tKH^ooy2RW5r!U>$C z6wX)i!AIW~l=IVyJJzU$rq6sXIJUf1HV?Z!4NeTezb0sX-KOE$LfChd%%jvt82Ue9 zP|)lcTKBBr4RN;E=J?I4lD)t6H2_HtU1gpBadhMSdqRP%bgi1-V~3W)>DC}+D{7x- z+lSMDXIFuYjKStTryjv3QITme)-M`K|6JfVNlay2??s7^+YBFGft+>L4*`)WQC;wx z4~;0;&i46pL(EJ18oKuw9e95`TKLgW5W3vs_`6ld{8E=EVNZgqe|tX;a2KX`a;y6C zGCUBCvabmO8BZKOhwG?xa{808v$X|2;ha?l-L{s`$eJ314xIX%U5lch{e%=`SMD|#PW#$@shyfS^;l|V zXO=7R=16?$qafJZiw>!IM8bOk?H3~P>|X?V5<=d1_0kdlywHBTo#6u_!t-q4;_xn-`x6_Q7PlD?~d@`XwoJ zGDpi6bqOz=e!8L(==UYvYSZ0aSRXg*>a^_3=P|lh=L@>=jY|WsnU*6Vuuzg`HQD8O zHWMS!>Dww8zjHcTxNW8qIKFV&eUAg`m`zUjzz<-^q#qz|z&a6Kl007Qv|fFsqnbiY(Zi zxJqYh9E}iPsby{nFN1nhz~VPzqH&k#fB6pYcS@6H?01~kbvL_0W98aJDJ%d}J@)*S zP~_o}>Wek-<>9sar?cl{QpTEO8m|9qhh6%PC5LTOVor%|A~o4lk9QK*`Xhjhb!jj< zb}gP5`1p|s)XjbvJb!FF0IOgpaKn4t!`9kXj7U^O#8ckYB#p_N&jwx^>(frZuSq5A z>&|*UTk4wqzLXP~=Q=JTA_9zTXkTS0|MD?Z4Fd4n-=SM}$JyU)_0KNPi{X1#u4w^x z51Xc6V6eg)6(yxPY3*wFETJ-3#}=G4v`mA6aT~!8rlLIX`DpQ-RoPV42kdfgRh5N| z9BT|e?&cO7!X=BmGbMlH=(mq!RB|DZ{K3|sg@(WwBQM5JK%X=Rt88wJ%*8leT4y_j z0&>l>_68XS$9b!KITi15vn)0|G|LGZmNJxmDZ(_MZFi|3NvO$hlp#|X-^2>kJ}f@@ z8-<8x?>A0yNw{X;L$oGPAkc_oTZqjp@xWfX#Z&chQV@)eKujw=aQrD0+kiZFliL0( zHRF48y7*_m;q|?B>@f7e%UPWED;%#^2P~M~9 zOwtOU<4E>tVS{aq#}p>GborfQ=;g)_X=E5Z(2!J#qD^Jrb7V=UrmCtK2eoBmU;^H5 zDaD!h#-E6cgzQ=3ykcX51pHnSC)EBrI&p{JM74;Mky7nyc^SQ(Ol9rty(EmE4O~06 zT)ypm-Vl78GdXyi!^6ogy}6dnYFbcft_^7OZ%T0xt-YAxm(VdmeJp>>*qvMt*~N1d z<@mrn2c)D1?M1-`RcKh?i1e_-M_eYdBQ$4i-uWX5?6AmLHZ{%66!b}r4S1vk?f~*$ z_Qlm;#9`awxNk+|n@f~=0sW0QNgcx2lmLX5$WN5A9!c1y&hj4QvbgPE5PCO=2!HXk z5Rr3{_eCd@u7zmDR(j0=Kjah`eByT;LM3jsaG-#j;#lP;+a;y+qS0jWmQPf zu>8~crL%Tesu~1_g#%@;v+f}Jq{7B@m>gkPDyBF>2&G5eS3AheCg$WRat=dEyzwuC zQFYsB`fpc@(2GRE8J98q3_edgQ3I9JaG^J_1(>D;hTw02iza@F1WFHIJtmY+P|sI3 zu8gdLfqlEb!UQNn)fAQr!I5P4KjP6RpI>^B6S(2Bd&iN~u_hi&19})?`=4e$WTnR2 z-ks?#X-564yeF?9Vo^WS)yiNZ5BXrju0A3r)w^Qwo$!V~5WKbme?eD|Fr(8n}#`)hrrc$$52S)$w|QJq4j?Kd?!v@$3`9=kEG(- zlCgv%{Ksk&i&FAKkW1oa-F`IYhg+;WLVKW`xboKoz)Rzlk^OMDdKN*|5tduzk5~Vz z=7+5VxJ~qR?hO1q>UvRHEYnvWz0x{{M0wI-2$^}W`Hv;&?uYOrZ1L%_(|4%4~aAM;K z>F5& zH$DVQ+#FhN=dl?J3R#_M|9uE(#5P6j3zJ9{u!zNaZJoO}dV!c!RXLx9m-}^$7-6R} z=J6em62%(E2{xpZJrr@@ev-Lm-?+YL_!KL?_t@4UGJucG&au-zGGMUH3f@d&nT_JlB zLLAYzs_bn2J_^_1e|q$DGVU6X8q8b+>zsN=0#cnIAweL({f3N84S|6Q$`S&SU0>-l z{_QG{P>6ex6CgpY{JKjJPp%#{ty{>G9+XpLjtYG)@r=&!gZ*<}fD}3{acV%RT4 zMRbC+Kna$N11;KTRwRtQP~)#rwBQJ6(HvS_yzBgS_0GcLqnZD1JY=pcDDapLroyZc zxRj?$5Ux^4rQAk>aFuAVH-I3e3G#Vi=2I`X8HL0h6Fp?8kk;mO>A{$UYmGM2LxgDx z^Z>IsaDNroJbFO-eE;e5BV^FN)91e~)*jV@REUPKm~mzbyX2Kk9ub8& zZDH~V+fNDBsVv-2kUXMv@(7pEg+?cja9LcCJOWZ7LMp^#G4;2T3{%9pB&4tdV|lU~ z(#9miSwAU73-=R{wKQ2>0x_DMWY}SG0a=fete-D0{`PrLdw*W03~N_a+Hwb1>?bzB zu`S00SQh-Pj84L5fc@X4BW}lr#ECeZbf>-kZ2W3 zX|_h?)KW@u2GQRw^ry`R&OmxYNN?Dr^oChPM)l(|7bzt-1TGXlbWBIcB9+D{K4k_O zNU_^a1{p}P3k+%$gMNL%mUM)WlbGgF2x3F_5F5fGwtw%~kjguXZRz)xEjPOOt^#S9 z#uUA(qDLMae>`$>SbzG4GK2}|JUg3-3!csF9xlPF9X=FwuKBq?-ng7Ayzp|hUgz6I zW0vN_DjTTF_h+5nr;GQO9{BPo9?AZkcU7D!QlYD!IcwEZ%cWUiFZc%%Dty`PsModU zw%3v;jDPG{L4x^PL66;=imoL_C8Ze4Ekz-PPWHZ*ezf~t$(i(ENv&?IjG{|w@4Kb+ z>(yv__23-7bdk_!t9+J!f-igfCpu;}x8}03bgb&pvtw;1rgl0yoOrZ_j=j#uUZ+3U z6B}8i6{iN+*dR6<(Hu5bk8uSy7GmRr-}Xeu0)Nk_bQ17{ooiZL zjjW%ta_5En2?94t2X0ii`)dx|sBVoz;6_^mH!d#wgTL1vx8c(w-AgKhsts)U)%7-s z9n2HIBvu%;k;Jy2BEo^hha_?3GlsfJT-o*q5(9~wWB(qE#l@OrtWDu*QYfMZD1X#O3Pp?pg*;K{7%F8ofI^>gCj<}aDxKss zk3$gqxQEzBO;GD%A2aJVF;NNYw)N2+Q6lP&?r=FbqU|b<7(o@fYQIcGr^m#Yk>)TF@i2^{7-fngf_wmbWa2ui!8Z(Dr236( z)T9lylwFJgztI$NBwH9wk@b^OgcR;4h^8nVO;O#ZuQ{5cx}^=#6cA0(0Bdt!VH9QC z*7ED)oVQmqM_xrjQhblU~ zL;GVC8ODrLi2_6r%9;`eIt;~;#wZ#|S`njYNF*f{`KaK{s6-JuSab-kKYuzTB@i9b z%IJ_ZEF2y38X`DOK7!+&9*r-O>c>iMa!P{Rg_ehoBupjZCc$xCtY|TY2fEAV%zw3FnaO>v92ivJPBQy07^ye(V1282rYZEz1YQ%_AphgR+ zVFymPhZ-EH(I9GkT;=aqoqrjQf{uw8IxAHknNuc4oB}agNsNTGhZqzAG8%-8?ku^j z&I=bQM+6H@bVx#>PZ$=MX@Er=VSzbn5iA(6qCw_`ZO&@p!Mbpgb40u#%&;^}sBIIL zC&~-MfEUGiff@h|69F&)7-fLbS!UjDOAp9!m2^zd&?ey|CRv-zX@5e42n5h*qme-b zha9?)$-PM)SRc(aF>?>bi<6uq;!qfcsS%W(GKbO#IMhZCg$M(OfJ05<(C3Aj`|t#I zlXFb=5G5fMIJdC}Ncn(~tEA?!2&z%-p&FHuQR}Kv zWjAyzC8+qx=z%J4P=+w!oM)LhVxN^aVyblAl{Z}ON1^gYUU|cImC+%t(p4u~jjAd} zcB~*BHmC9iqmo)PL2fAusJ!8^@`jn{(Rh;v^lG&*b3dgw3V({-R|Ts4hR`mP6XYO6 zaorqrxt|3N<{S(oiXz5h;9zq&$S?yAo-7B+emF>K;b4B&%tKoIthw!#7-J?(?bV4L zPWpj^>*~a*kdfxJLRSF?eREI>sKj`R9Q1Dr9tZ0qQs_K>haN;$7#%KPuON!WEfXsU056 zJ~_6d!%ozxNtuKSxb|(`VDc-WUYR03uJ98SsPPZvD)3` zzKSarZ`JWI*X0_^FLQ+mTgcq3pAr!Pa}UVe>bKD~Gk>@G9WgK$m|N>T>A{#wPKUWJ zS7v^hD?{Ew=4Snr$m|5UU_SwKOEb6n&3Dbrt$rU3%mwDwbtiiW+~N}nlbY!7A7!Io1pCka09tt1 zwfuJ1l7GHQN7MYL$8G%aH;bZ`rTtZi_fa1HMlTlMX7k;Aad!aRcBQyktH;bivEnW5 z^Ua^@QPTUenr`@3stfLAEGh`7Fa-12x8ZC)(aSQcX0eJ&ESx7=u`Q_b%-j}Mp=Xwv z3tSel+#k)Wh!{+-N7Ib<)9I|=EiWgZ-HvT}!aP^WhfmI@`RMxEvUAg_^=~dZXnW)G zak+{L%##OSy1w7;=ShR+WOKyH{Vm19{4Le|4V8C7sJD0Tl`}COYVas9;HI7Ql9b8H0QaG zpO}L>O{ETF56bDkM&{e*&3?B(KB1OM%S$a* zPkruf+|8|I{lDe5PmpoctyPFXVJFJ_`2O5S`{@|fmX^M{g3X2*xwk5mixM+aj^ zr>Wwkn$fi*i|E~l;OS9#e2U7GK{=7&d7>(%K|;CME@ z_W7!|=c4f}@-<8RiCXuZM}b+-c@&pr(^!rs#-liIW9qF{x5k?S$y&8o>dB2Kd3H-X zF-vbM{u-`E2{iR2N9!2T7$F?n2^Hj&i+mMcLuV+)w^DV2`uufj? zOVQaq{mAF^%LV$JgSkNO6ETbc>2uhlk*{Gf)78Y+Ix)-ACUbtjUNO&PR&VW* z(Y4z8=qHoQC5Gam%q)E3=}yQV^kZ~pv+USDR$V4 zyG{-^RZ9xr3EO9HxrV;^baDBQi_1^{j{kSb+wkuD_ivkfwY=}?Wb_nf)E;KkpmTYe zlPVp3H%arR)Q)qD15By@pm*`E^Y-5{`oE~`tQubY{n=_w$3CaB(=gh+N%ib0-2tZ5 z@a_A~r?OKifBP;y;khImsGy!br9FgxdjGlmc2H$D$)C&GK6EcGpU;_o8j~#ZT5IYQd(QRh zU{mbV;P0O*PO;v9bWT`{!OYsv%sR~(H5nzz*yO?JaHin>OyS){zyEe%MV#j3nyw~h zK8oS)f7t)s@#W`tgAW(I)0|g!_+U=?pHo)GY0jtn{1VNZRnJAh9AHXi+wAf#Q`xsW zy-!U(Zz$w&8dY{U-EuTtxQ2A@O0@IR2yDVF3w`rGJG8XIYC2uJ zwO`JbdOd^V`Rv;woz0fd$@yuVBVIA9;PqsAf8M)q%1>>3F!0Ydf>p?%^KCZ&8kuSQ z<^1N$?P3(`@p*rwujhJl7lph2?V*qJ%er-!+)T|zaT*JR&932nQoWLp#Ds=)m(TT9 z%CPZlVV=##{#^R~v`RhZJU`d&LEWhwUAuGp30aT+LB&w^2_u0T4#I#kfdkba;sA$T ze?}zg%P#Hx`DCA}NSi2D(!?`QS}FNGrryYym&rq^#hS}qsI>g z{{4NL+Ac!p=Kmm6R>(h!3n`eg@VN$s3vVwR;lWwF%rrI+sAmQ-TSY-ReN>u(=##-p7nT3;NRwH_Rfu2*yO zV@_{=e-lTk!Xh!Hl5UoGbly344^LR6Ql93iB+~sn{2@f|_B0OAbDE1k#_IRce_|A6 zHSTc<&9Jk$hs#F3G^+^WwBHYTFz8?uP}#B652TQZg^CUbg9EV2?rUBsAPBGm zSRD*jQmKBQ_Ig2xkP0XrvOrPP4f==()a`YoU?ITj@UWr`;V?>bTQmk(ogAzNn0I&| z2b~U<0p%10vd{Ygo!(G|k`h6O0ICzSstk!!iA9_}JOWVF0V=_}eJpx`HLk2xg^&zXcR+&kj*0#Y@IRCeRmk=5Y+Dl6iX6x!j9d=iQa&y9v2FMNp)%_e-)6bZc>H) z!GO{JFi>1&q>>g=J!@f+UN6LCNQeE7+}HV^zP<*73NY0uObtk%h69NLqK1Qj_WS*y z!vwc0qtlmzA?kI9a7}e;1{J0#(jt!GEL{df2;wU75C0mwE;ez7@tBCqfmv}08nvQKKeu;f zbpx0JOx2GmyCO7-x!koP08k*?eT+><=*22qy|Q>~KD`ny8COKnWiP9n?{Q=nn^7)xn%}CEQLO9#kU2 zSg!4{ZmEeN30X<1T{WF|IYJ}1nbB^5KE)WJOcA|Z^T z8Kum|lvR;T>Yx-DRDi0cxcS*t5vH2&S`~n*(=w<4Rkb^%e``&!vI7vun@h6B!< z$l8JR;5R@PAgck$%ED%J=A#bCY7nv#O2fn;k_}6|A8G)ynj1*Sfs$JL$L~(lrx3n zYyiTVSOxwS0I8-x%B}~RV5WDi2Y}RR`Bwm>>h=QE#-u`_01=em8is+6>_&3`kTMfJ z8pBN$P^w{GfZ8N1B|8@cQ0la9su;#hBw;=$&}L4Af1vc;sxDp5QVc7`J6J+ITMyBihuD({Bo!{5j zW?uZwA8jwjGpiB)my+FKzf-j9OwrNb!o(LlGx%SuYA5H6Svrua8vd=mwYqIBdz}Bg z)^mJamZDOxZ#8>tQrqb8e0P(d?ym97?nlc^laMnge+`HOSWZ7_a+kuC$F9k76E(RV z7?VcIl&Tnd+?pJpbKXKtPH2s~9F^1M{G3+R<>bV4x!%+zuS1)=9D~BXyasKa4GiJD z-1+peYjYB|PMfpy5Vud8hv$k^)8;rl$(?zA0bPeecgeR7+w&R}dNwdzOH?Wm{;?}` zKlb}Ue-%1Dm!y3Pot2z{V+_htaR64D;M<@K$bh^H-Lyx-@BL_WRgC5TYMkQH3;SzOsL60|aZyvUCZ(d1} zt8=-VUdO1%uj@HCcd673s=NkOo(+t_dBr(Uf8~$;S-5QBxp}R}EG0c!=((tN%yOa* zEmw1MGp^-~#igJ&DD*n^=5}C&h)}6Y=dd?#;28^R-x&)(53A{OLQYek=b86vaZ_Xw zGwXX$(C3YEQ?vsUYaD|u_nY0~0BV zO4TMi`Y0mR!YCrq#@%_v)AJK`Iv>w!@oRBOo({^qj>}LxFfqftR95?A-I=f7hXQV2BDysk&CjzCUlBLKlTx{+i>cNGqP6 zGje)oEw$@(mkJJ`)9Z-!w*$jtWlELS0G-}2oleiGXroRKD{j)!sYQm~*Y2uAnY(1@ z1Z7@>GS3EvQ&}!`>am}>NZP_Jy5#Ls=j5CT*rFFw=Xqv!zo~wo+|Yy)DTaRhe~&UM zs0bO7l2cAGmWm066$>%Rjwr)|X@OPMw7@?tuf?m^uKA4DT{#$hINOYT!N#Zejkmh~ zZg6LLe&nB9;Wh=|W&eFN0eO@%EqT!iSPI>n?#yq!9kkSw(8dX-v8K`HHRiL~axHe} z=He;!@3JW=n4$XF@ibD#2gy7ok9JLOXkxe@;sLydE=7$sfaw6v?E32xrDzL zk>?VFS*U#uAwY%Zi-QY#5qU2DkA=q9!3U?%c=)ZM{l?`EqR@KtTfwwKk%XdZ)b1B5 zs?lGwL&uF4%?}`dqUqtbE-&r4ch=;1zK@L0ea~VQy?t`)^TNK{rR~q}f4P+)TfK`2 z5upgVV0K}VkRYb0kb)_}8QGNsJv+>JQ%%aD=S%Cw zm+gxmoxHk9^wM;98=VK5f6qPU`_AR@+_!E^ed}Md*(6Ut`rw5SMx04ZF$y_Fm?0vh zM4Zd)H~XU4zTGpA`st&ee?NG38n3slm$Ri_&zXB8;dNqCy&5l{ll5RC>ok>-;N>Us zuk+={SJ!D+%3@jmxnL*+;i;=sM4hm6vI+q_tuF5N5<{xe+pO7OlGOiKk4fq z4=*;9Pf;LV&FA((cORC*!Lu(*lc&u4c(qv0CVjosPCdpe*FAct=U?whKgoY_8!XNp zk0%Nv?ZvTrJkz#LGAPU3L0pID!J{Ak^7Lyf{^GFR%YGV8?`}W-?QK7LH%nGy^UKGt zqnqJ>UQ847Ju~GWe=A!j8P~?Xy#eRs-wux=iSTP<%^%d2!W zHtPlT`pax$UME^lU(ave}sNF^Yuqpda`)^?c2B4 zUzU^cYm2MbYgg(FVmZ8uzv{xy@2ky?*OmSIvb~@KOS)f`fw!e^0Dq=iJ0yuX#R5?>xay;^?B&L8`Bh@1!gzHsWL`F56{<2rve z+Ya}>=;?K~e;p=vcNZWTV0MPZFCi)>C08-`QmlPX&k+8FGIuFEj!>Wf*3EpjwjVC- zD4xyIv*j0aw)xOmh@I$*{IU4l{jJwa>Nl%>tS++~na5u|5UWZ|^WXHf`Dm8QT-p7Y z=G+vY<|2uOP(s{|#y*?)6CVeWq4vWvb&=lSQEtaJT%XZBp# z+F0j~83pHsUhK(@X8lWdcN_12{EKDzQos4P{|}SGIy4EYiw{H7v}vEAlm9vwe_OkA z8^;|!5PV3qNXc;$Sytgwkr^T5^X&VfGy$N)OeV@mmS{(=$bH?IGodfZ5|Z*HvkH*4*`l%L;g|EvAa z_TSroYyY+V&FHI$h=~6d-o4^C-`(_^E0_G{(nY^nU-g>{%YL)k-Y6$>`_GAgL_|dV zU*KkI?OM|JZ}!#E&>bGRJ!gjL57XlCU_U+j#hy3$+oN6U)%^cQ;vW$ae-Vp-_4c*a zX!^HG`=2bwLlP0Oh=}t)B4UB(f14-m<3}T8A3E?dF@8{jEJl*Q{?&RrCh-4?dxwE~K9;-w1nL7L+ z-GNq9f*mPEW+W0^*(uQ(f1e{_oOGb%7a@F(5Cj^9@}FYZ>mm&DET?^*5sLGy2f*zN zK`05L7z2vFtSNYxgB%H#3CT!C27qR=k5MKC>JCVkBMJv+iq5m2x7My+zutPeQk{&4 z_qOldzuO@dhkV=14aOd zirpVmtl!>B0r?Q356hh?B)6!%1^LGM&5iZ6!tt(qy!}Y+yYjZd*XoEue zf>8;u3~qlxWw*O|@E$?6k_mC6g&~}cddEW~jgDg@L?MX@4LPl* zn)6WzAGC}?a@eDyoBOy?vW(>32@o{zWq3d^!?zJa16g0jkfIADA%m<3;J_>TAd}c{ zAcv3&PI0%J*A+d=W!@7aL;g22Li*fm$?c4Cj&lgQeMo;nO@WbiQtK)(=i@`A5uVu# zXnd6Ig!iZX%h>*NfA(kD|BI93+)+)9g4H2r<3m;uQD5Z>;A~Em>QQ^}F`U8`0#G@v?acUm{49E&dZeGgzr0e&^)LrO}9bFd9(=XlaR> zmz4?Od}nGz1xT7TuE;>eDGD7?PgzgM9_Y&qA<=)$NLR8DbkH;Y*Vo~S+Qu4=S>9OCuad^%)tHAB$C>3A{!G=PXIb%)>`?%BfRr&zV z_oi0q10>Dz1VlBbWx2sCkp^=Dw*o>`n8JkeHD{LFaxK}?)BFS^aCTW3kjhXWeFCbh zLVJIl2}#hLLi;kN7b2K1a9MZeg7}^1s~e+K#=)qrL{O(?nLaqHSuYH&*Odft-kGW^ z36L~S9I^x=Sl%I_Z1KAK`7-CDIVZ3T>y;a)8l)Dp%PS1mQ1kLu*MR!`vV4OY>ntXr zd}jbF6o~cz5fKs5|Br}>i1R-pBI3OGe`$X+S=#(xxc@KW+r`Q8oJV4Sctw2g*QP%Un63xwzV5((dfC=JvPL8ikcAPkdnej1tfixP&^pMwY z9t`1Jox1TfKyps~e?crMOew(Wki4sAOJ?mcZD&pUGqaY*Xs5vMAEcZo&gCGr3j5hT7%j5Wh&+{ z&@Pk@k-`Xb70O2hVZvd_hdP8$9WAgWC0~T_m9q>PRJO+j@Ug~)