* @license GNU General Public License, version 2 (GPL-2.0) * * For full copyright and license information, please see * the docs/CREDITS.txt file. * */ namespace phpbb\db\migration\data\v310; class dev extends \phpbb\db\migration\container_aware_migration { public function effectively_installed() { return version_compare($this->config['version'], '3.1.0-dev', '>='); } static public function depends_on() { return array( '\phpbb\db\migration\data\v310\extensions', '\phpbb\db\migration\data\v310\style_update_p2', '\phpbb\db\migration\data\v310\timezone_p2', '\phpbb\db\migration\data\v310\reported_posts_display', '\phpbb\db\migration\data\v310\migrations_table', ); } public function update_schema() { return array( 'add_columns' => array( $this->table_prefix . 'groups' => array( 'group_teampage' => array('UINT', 0, 'after' => 'group_legend'), ), $this->table_prefix . 'profile_fields' => array( 'field_show_on_pm' => array('BOOL', 0), ), $this->table_prefix . 'styles' => array( 'style_path' => array('VCHAR:100', ''), 'bbcode_bitfield' => array('VCHAR:255', 'kNg='), 'style_parent_id' => array('UINT:4', 0), 'style_parent_tree' => array('TEXT', ''), ), $this->table_prefix . 'reports' => array( 'reported_post_text' => array('MTEXT_UNI', ''), 'reported_post_uid' => array('VCHAR:8', ''), 'reported_post_bitfield' => array('VCHAR:255', ''), ), ), 'change_columns' => array( $this->table_prefix . 'groups' => array( 'group_legend' => array('UINT', 0), ), ), ); } public function revert_schema() { return array( 'drop_columns' => array( $this->table_prefix . 'groups' => array( 'group_teampage', ), $this->table_prefix . 'profile_fields' => array( 'field_show_on_pm', ), $this->table_prefix . 'styles' => array( 'style_path', 'bbcode_bitfield', 'style_parent_id', 'style_parent_tree', ), $this->table_prefix . 'reports' => array( 'reported_post_text', 'reported_post_uid', 'reported_post_bitfield', ), ), ); } public function update_data() { return array( array('if', array( (strpos('phpbb_search_', $this->config['search_type']) !== 0), array('config.update', array('search_type', 'phpbb_search_' . $this->config['search_type'])), )), array('config.add', array('fulltext_postgres_ts_name', 'simple')), array('config.add', array('fulltext_postgres_min_word_len', 4)), array('config.add', array('fulltext_postgres_max_word_len', 254)), array('config.add', array('fulltext_sphinx_stopwords', 0)), array('config.add', array('fulltext_sphinx_indexer_mem_limit', 512)), array('config.add', array('load_jquery_cdn', 0)), array('config.add', array('load_jquery_url', '//ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js')), array('config.add', array('use_system_cron', 0)), array('config.add', array('legend_sort_groupname', 0)), array('config.add', array('teampage_forums', 1)), array('config.add', array('teampage_memberships', 1)), array('config.add', array('load_cpf_pm', 0)), array('config.add', array('display_last_subject', 1)), array('config.add', array('assets_version', 1)), array('config.add', array('site_home_url', '')), array('config.add', array('site_home_text', '')), array('permission.add', array('u_chgprofileinfo', true, 'u_sig')), array('module.add', array( 'acp', 'ACP_GROUPS', array( 'module_basename' => 'acp_groups', 'module_langname' => 'ACP_GROUPS_POSITION', 'module_mode' => 'position', 'module_auth' => 'acl_a_group', ), )), array('module.add', array( 'acp', 'ACP_ATTACHMENTS', array( 'module_basename' => 'acp_attachments', 'module_langname' => 'ACP_MANAGE_ATTACHMENTS', 'module_mode' => 'manage', 'module_auth' => 'acl_a_attach', ), )), array('module.add', array( 'acp', 'ACP_STYLE_MANAGEMENT', array( 'module_basename' => 'acp_styles', 'module_langname' => 'ACP_STYLES_INSTALL', 'module_mode' => 'install', 'module_auth' => 'acl_a_styles', ), )), array('module.add', array( 'acp', 'ACP_STYLE_MANAGEMENT', array( 'module_basename' => 'acp_styles', 'module_langname' => 'ACP_STYLES_CACHE', 'module_mode' => 'cache', 'module_auth' => 'acl_a_styles', ), )), array('module.add', array( 'ucp', 'UCP_PROFILE', array( 'module_basename' => 'ucp_profile', 'module_langname' => 'UCP_PROFILE_AUTOLOGIN_KEYS', 'module_mode' => 'autologin_keys', ), )), // Module will be renamed later array('module.add', array( 'acp', 'ACP_CAT_STYLES', 'ACP_LANGUAGE' )), array('module.remove', array( 'acp', false, 'ACP_TEMPLATES', )), array('module.remove', array( 'acp', false, 'ACP_THEMES', )), array('module.remove', array( 'acp', false, 'ACP_IMAGESETS', )), array('custom', array(array($this, 'rename_module_basenames'))), array('custom', array(array($this, 'rename_styles_module'))), array('custom', array(array($this, 'add_group_teampage'))), array('custom', array(array($this, 'update_group_legend'))), array('custom', array(array($this, 'localise_global_announcements'))), array('custom', array(array($this, 'update_ucp_pm_basename'))), array('custom', array(array($this, 'update_ucp_profile_auth'))), array('custom', array(array($this, 'move_customise_modules'))), array('config.update', array('version', '3.1.0-dev')), ); } public function move_customise_modules() { // Move language management to new location in the Customise tab // First get language module id $sql = 'SELECT module_id FROM ' . MODULES_TABLE . " WHERE module_basename = 'acp_language'"; $result = $this->db->sql_query($sql); $language_module_id = $this->db->sql_fetchfield('module_id'); $this->db->sql_freeresult($result); // Next get language management module id of the one just created $sql = 'SELECT module_id FROM ' . MODULES_TABLE . " WHERE module_langname = 'ACP_LANGUAGE'"; $result = $this->db->sql_query($sql); $language_management_module_id = $this->db->sql_fetchfield('module_id'); $this->db->sql_freeresult($result); // acp_modules calls adm_back_link, which is undefined at this point if (!function_exists('adm_back_link')) { include($this->phpbb_root_path . 'includes/functions_acp.' . $this->php_ext); } $module_manager = $this->container->get('module.manager'); $module_manager->move_module($language_module_id, $language_management_module_id, 'acp'); } public function update_ucp_pm_basename() { $sql = 'SELECT module_id, module_basename FROM ' . MODULES_TABLE . " WHERE module_basename <> 'ucp_pm' AND module_langname='UCP_PM'"; $result = $this->db->sql_query_limit($sql, 1); if ($row = $this->db->sql_fetchrow($result)) { // This update is still not applied. Applying it $sql = 'UPDATE ' . MODULES_TABLE . " SET module_basename = 'ucp_pm' WHERE module_id = " . (int) $row['module_id']; $this->sql_query($sql); } $this->db->sql_freeresult($result); } public function update_ucp_profile_auth() { // Update the auth setting for the module $sql = 'UPDATE ' . MODULES_TABLE . " SET module_auth = 'acl_u_chgprofileinfo' WHERE module_class = 'ucp' AND module_basename = 'ucp_profile' AND module_mode = 'profile_info'"; $this->sql_query($sql); } public function rename_styles_module() { // Rename styles module to Customise $sql = 'UPDATE ' . MODULES_TABLE . " SET module_langname = 'ACP_CAT_CUSTOMISE' WHERE module_langname = 'ACP_CAT_STYLES'"; $this->sql_query($sql); } public function rename_module_basenames() { // rename all module basenames to full classname $sql = 'SELECT module_id, module_basename, module_class FROM ' . MODULES_TABLE; $result = $this->db->sql_query($sql); while ($row = $this->db->sql_fetchrow($result)) { $module_id = (int) $row['module_id']; unset($row['module_id']); if (!empty($row['module_basename']) && !empty($row['module_class'])) { // all the class names start with class name or with phpbb_ for auto loading if (strpos($row['module_basename'], $row['module_class'] . '_') !== 0 && strpos($row['module_basename'], 'phpbb_') !== 0) { $row['module_basename'] = $row['module_class'] . '_' . $row['module_basename']; $sql_update = $this->db->sql_build_array('UPDATE', $row); $sql = 'UPDATE ' . MODULES_TABLE . ' SET ' . $sql_update . ' WHERE module_id = ' . $module_id; $this->sql_query($sql); } } } $this->db->sql_freeresult($result); } public function add_group_teampage() { $sql = 'UPDATE ' . GROUPS_TABLE . ' SET group_teampage = 1 WHERE group_type = ' . GROUP_SPECIAL . " AND group_name = 'ADMINISTRATORS'"; $this->sql_query($sql); $sql = 'UPDATE ' . GROUPS_TABLE . ' SET group_teampage = 2 WHERE group_type = ' . GROUP_SPECIAL . " AND group_name = 'GLOBAL_MODERATORS'"; $this->sql_query($sql); } public function update_group_legend() { $sql = 'SELECT group_id FROM ' . GROUPS_TABLE . ' WHERE group_legend = 1 ORDER BY group_name ASC'; $result = $this->db->sql_query($sql); $next_legend = 1; while ($row = $this->db->sql_fetchrow($result)) { $sql = 'UPDATE ' . GROUPS_TABLE . ' SET group_legend = ' . $next_legend . ' WHERE group_id = ' . (int) $row['group_id']; $this->sql_query($sql); $next_legend++; } $this->db->sql_freeresult($result); } public function localise_global_announcements() { // Localise Global Announcements $sql = 'SELECT topic_id, topic_approved, (topic_replies + 1) AS topic_posts, topic_last_post_id, topic_last_post_subject, topic_last_post_time, topic_last_poster_id, topic_last_poster_name, topic_last_poster_colour FROM ' . TOPICS_TABLE . ' WHERE forum_id = 0 AND topic_type = ' . POST_GLOBAL; $result = $this->db->sql_query($sql); $global_announcements = $update_lastpost_data = array(); $update_lastpost_data['forum_last_post_time'] = 0; $update_forum_data = array( 'forum_posts' => 0, 'forum_topics' => 0, 'forum_topics_real' => 0, ); while ($row = $this->db->sql_fetchrow($result)) { $global_announcements[] = (int) $row['topic_id']; $update_forum_data['forum_posts'] += (int) $row['topic_posts']; $update_forum_data['forum_topics_real']++; if ($row['topic_approved']) { $update_forum_data['forum_topics']++; } if ($update_lastpost_data['forum_last_post_time'] < $row['topic_last_post_time']) { $update_lastpost_data = array( 'forum_last_post_id' => (int) $row['topic_last_post_id'], 'forum_last_post_subject' => $row['topic_last_post_subject'], 'forum_last_post_time' => (int) $row['topic_last_post_time'], 'forum_last_poster_id' => (int) $row['topic_last_poster_id'], 'forum_last_poster_name' => $row['topic_last_poster_name'], 'forum_last_poster_colour' => $row['topic_last_poster_colour'], ); } } $this->db->sql_freeresult($result); if (!empty($global_announcements)) { // Update the post/topic-count for the forum and the last-post if needed $sql = 'SELECT forum_id FROM ' . FORUMS_TABLE . ' WHERE forum_type = ' . FORUM_POST; $result = $this->db->sql_query_limit($sql, 1); $ga_forum_id = $this->db->sql_fetchfield('forum_id'); $this->db->sql_freeresult($result); $sql = 'SELECT forum_last_post_time FROM ' . FORUMS_TABLE . ' WHERE forum_id = ' . $ga_forum_id; $result = $this->db->sql_query($sql); $lastpost = (int) $this->db->sql_fetchfield('forum_last_post_time'); $this->db->sql_freeresult($result); $sql_update = 'forum_posts = forum_posts + ' . $update_forum_data['forum_posts'] . ', '; $sql_update .= 'forum_topics_real = forum_topics_real + ' . $update_forum_data['forum_topics_real'] . ', '; $sql_update .= 'forum_topics = forum_topics + ' . $update_forum_data['forum_topics']; if ($lastpost < $update_lastpost_data['forum_last_post_time']) { $sql_update .= ', ' . $this->db->sql_build_array('UPDATE', $update_lastpost_data); } $sql = 'UPDATE ' . FORUMS_TABLE . ' SET ' . $sql_update . ' WHERE forum_id = ' . $ga_forum_id; $this->sql_query($sql); // Update some forum_ids $table_ary = array(TOPICS_TABLE, POSTS_TABLE, LOG_TABLE, DRAFTS_TABLE, TOPICS_TRACK_TABLE); foreach ($table_ary as $table) { $sql = "UPDATE $table SET forum_id = $ga_forum_id WHERE " . $this->db->sql_in_set('topic_id', $global_announcements); $this->sql_query($sql); } unset($table_ary); } } } &Ck4. '٪yis"1Y+sEr;5 "vDU(Ew16%hЪO`ˎwPV y̫G5z"J4E 4@x?щϽ(^D@HMo:$/{!WG8Xdžqu kRQykS]N`" fp*ԉO4Nv󞥒*oxHw#4Ĉ)`8ݾo/ҜϙUV3͋ rEp'zR;E\}"]uft9D +BBl0{`yi'-tJ2{'uoCC o<[ǂdA}6^=2A-7A4-R9NҮ'g :Nz_Fđ$|ɦ_$Q8\_&:S֯DpdضPB5N1+4KFkʥЉhh}mĺZjtwgL'*Pef<@)*tSlb~chcS'`< (,isp{;$43rsO%{l1?7Bf _nxo#NsyH<.[8 XqE֊;6ۂn=4u[ !Ps YUeS73.Kϓ6Ahw1c|C !pfߞ*$al>ߐ r6M멨,_dϨH?N c i1Vj/ /./S*2VaǛ֋Ǧ%iz&և<#%Ói 8gE޿5.!fR[oJ) EcUM|¡/ѳ7lŹ=V uR^Km7o9؍ozׁ~-w+;cmj`_[ AsM>eڋPRҠ^ 7FM&HLO ɥIvjUسˆ-?Q qqaau; ن1/u:hXZKnDثeJrqN0K'j,HXZd4SC.ETyn)ko`s})aƋzQ {ˊz2pZUz+ tveVBGl$q3k'(VZSFj0DXTGު𒹖h]/xXF$"k_H#NnĄkQ竳 Z2/]f-m6v}H-0%"V^M>Z&;n;rZV !)1B@h"Usgγ-+LSx  S!2י3 jdt TQrʃ{p9uD.LV\R2'foU6ʆX3Xf!\#hwu$(# k3nV|%H1V=&L:DsЅ4DFD?#]V1aGr{ao(jx`JpCX/dGdp'ueF,YQ}uh$b[,9jT(nK?AXl`uF=aSQMevIE)U͜ΛyCA VxioJv81>ITԍңg`vK^kEj>Q(na(q<L>g8s7?*ߵylߐ0~UpzDƙ5oƭ3K ؤ?#Obk \ U |M{B@pa7~T3|Z;fAy jHtm~s_Ϩ?$Ń`ryF]qڔ'ΑZc(4ϗY4NZ:q{Ko$R;Jr;Be а;ctQ L2չ}!<OGEQ+P<rh\_1]`-M]^25(;՟y̽ v.nV&婿Ola5dEUdD h~$־dTRBT"TwiQa}aTkYvR Wd|kwU/1|`ic ! lYK?;@[Qw˙ L-'bam6P9[bt5C7s 5hN}ʅw ѩ꿯wڽBo -=>/~uLk<ܪ ES +$dd@p:~%bk<@M۲KPc|mnG9M.~LʎrEXHV  Wzygw[/扽:VQ~T!8~ 򛈂BpyC ݺʛ@aPX@|%84te{.ajAqrl߰RkM<P$[z6to#C7Qu59aLbEt&ר.&t$urY2b 9>[]pb,>'(%}$*6K ʎDAq'oc͋]Q*W4F~J*J~G!K?u>KNbC1m9#[euh:+mX@bwWiQwLz/+]Ot,򠋽7z1E.pEdL(uDj"~lܶ)E" h.{|aKuM,85-BʔX̃1VC0]2H]IK0T:|%3-wAMzVq;$~1򇙁D~,?]KQ9vx6DDD(Wv5gb)c-, p;(bM^U7;T.s3b.!I ?vϴq>x}Xɾ&&@AJ,De P/CPda 05_0ZIUF^q^.M7eٶ<m*"f~ 0%@< dCxpK[H*r}ArPKd{x!*כjaoXKɣ\asb {mkoJ#@)Yxy{RyNƀ$Fq<<&+Z7a睵d?T=02UvJlaF}9Ic ;es~a"VbFCق.6"^հiJ+KJY,jc!"`Twi/',)q?օBCv!:8O?X֠j? o=/ЊAr~]5t\\"xcE7 #1sv\{ &Tw`Tf !G U5İ1X,GM(C(HF,q]B#?;as ^9HDeֺڂIφW֬!tH[wzb `)DԮx~]|g$vEЬ::odq܀\Ip5cEV-n{}|u*KY(ZK7㩥ۀuw uCR c] ֖G2A' ?477$scָb:|F !\ {2^ۉZp7,"lf ħ")JA~u\uR,o fPH/ʱ)Q>xh 嫦rnJIM|6`y@fG޷׶1-hTS(aOlXO`<+Q8>;šAFTҋS:%sS:ScK~F/jLbNH 4R'uN "ٚtNo;.CQ1/p'y EY[1r7zqdZ 騁HNҹH;E'څZ-äE\ymȁd9MҚb K?Z$`e]t #q+Iqy(> !a}7d5Y4ƈs^xw9_k+[zY^7GxT<\U2D7& f#1?HW*LSZ{v0*Qr8KYi"C ZM Ҁh M}]:z\# M_Τ ] 0zp2|D4Z\]1xfr+%fgsr0D xbf2z ! I/;iҡ %[wh3iRbvu.Cu3Rm I|# Q!Y?0z1u` `Lw%~r2A (S bGG&"`%h`$$Xƥ-v!r$؜ʽ ڤqC]]_m'bez}~}w0*a If&a ,R,$='qѺ`gESnM$l5t'yh+%'ODЅ=>&@;k0E!`>|z\WlQ-- )T}_ )IHc-Hce E>`]ب Wz껥!xT_Z;wT,PU:ղ%5I)8$z9qI (mO?$- "wYGfE8kh>dUz/ni=@_a. BMN*9'9R$%#Bm4dmg#<d[z[™+ߛMM`䇚_/fϨm Vg8ġf*\ >o0KH%ŇGaH! 49b5?ʆs7Gwk{X I[I&/!:] 7~0|4`"7ҥ, {.쉟B-(l<:Kxi){ kJ9ޡokKQ[uˎg(J6(oYSTLKMPZ"4ځ]u&CAkު0?f½kҪ{|t&ReLe=H,wSMp@ 9/Tc 3>IwNcT#B XBє2دDC>a9Jj#fHg[ءu'n xyIIRE8Y%06@nl=yMR]MY'm~=~C6b!kP@[)v57=nW q W}Zf2S,T)UBҏc 1k=iKL}7|E^TI7ɃiRBp\()cYփAXBs)ݹ%PXFнK3=W1n8α8#lEMSdG8Nb+Ei90ݰ tXDRkh2JH/+Ay15~|V\ _kp0Ŷ#m@M2O~|^'6?L*(ox^mpɀۜceT/-76JӖ,&%t]O%k?K>< ̕-0,/ gY_ыNQՆ'q`o5&b@#6a4*6`" ЕڌRTܸ eɘB_f&2izdݑZ鲆*{WKN8͛d`bԭ=Yi#dބF<χH 3 {jYbά;zԾ`FSWs0OE)ʭߞUpE%uPIH&],M i3vq2z n_'uš#Zb%H}P]62{z}o{"f{c|\PAc?{ [^Ɨ45v ^ -+t %3g">7xQ9 :NFTꠟn]lB[]T@heGQvk:=UXx9Lq?\ZbFNW:Mv [9?ބ䕻HScc(j)I&TqV$7LӎIX0X!o8D߲ >3?70L(w?NRyO^e.}qbTCJv2Z\@L Q-KPǓ\ ڬ2 բڪ*GsLy0)MV!ʯ Y0 /cһ mVrYI2Ǚ|TʉpxJW[{P:Nrs綠^K~"贏yN]h+`J܈"I%^0`tItqcT?@SSJ8wk62f1w_D >QR0A_4L5ڀ[dZDh!,wEʋG~ɜ^dwZ ix_&(vA`zAϾJ6X.>{kttuDwgWBƿTsr{|."dyvvpkr]d2Mn\a\& tǐe#n* 57Z ]TEԢ#Dc`EϾQ! EQik7C梖 Xn%I~8F;VLUL',%X$D6~B(a'ܬа{Ú780qW|Z\ 5a ab'q +~/ӊMX[0JH|@=R3<卵]<$7Pް #f3?h ؐ\ƙcsnn]:{2.UxGo9GQӈҩ4) R;D<%uN3hѴOF> 0'xU< 35m** יLʮCl4~D/2Ӻ*Ȓc _5TX27Ra;ULڪ_ H]:֫/=]r)D6_!w~_ְpGaо3.g@k{}L ڟyݮ4s10I4 *epn@O'wb=93eJ3­$HQa!~w%IՓD:`gTw^5.֖VGO?Z@#A"I16oMT'zfG]~DpӔ_HXhZ)_#9>U~RJtB|*R[ r jԊqݎ K 7tX'M,ľX,hF4o v;"i=UZäqϔQ;SREr$C5(.{ tƙt 0`6jI* ύ"=lhىD K(Gw;C _KOP"JWaQ; !8E69yy:j薵Fԛ$Z( Z/CFUm ]'>5)\za.Ȟ{a#L,K?{Jd~(9 Xw h $&lab廆x)Jd)ۮv&1)59CP9pi\*vh?<"!8`WL<,UBE9^ysJw 8Ms =.ԥ+c&A?c1ŅrSFq5yuXΊLŶM`M.EaD -ND:$kF!2w.eO4dF?I1Hl%Ú{_*&c]}щaz%cg3tT+hR_iRbآ坍}}/M&_W~2fV8LVGBśn(+ =!c;b Aa *WkLܠ٧â= F:]tim>#9D'AlBqȭ'Fc;Rpc^1< ̏ Әkrt?$KsTXyS#0k#*ҲUX}8 _9W ?~'D=v}ZP(!o\ME%!gX+ZSnz$R0vVWO9Գ8`fVV8@w}]gy [^/")\h 6u&v#<u.xzz:Q2 e *^;SA):}Lǫ k3ckwCY79%'v7kуF}9v:g'E2~ڰj}dB 4Oṙp27WOF1|Ft!$$tȚ Ļt&Cׂ %J􊖡lݚDU%_FNեyߨx)62G:38T4t͆/x]5 a]d~CQ68Sut;gkW.-Q7DΠ۱<:%QYWbөf'7fPp.VÜˮ%m:'s_Ao塽MG HvoH ~7E'R x+{E߰wwnlS+/PB7z^g;5Bcg (FDQ &@K)q/xQ )qPѿ@1 Rkq?`_ .o5 $m<'8?'wLg23PȢcb%Ir1 0&Zヒ-^_N4L9V^ݼ!_fI'}v4^K5+B2_AoCr=:)WmD4V yzNY⠭lw߲jE²7'Hjm#\Յfiu{@UOٳ3?;lR }^[+h|zGyw2;68?L&^?YūF/1ʥHrX"YrSNwSJNj xO FH 9JKпU|n=K<3?$ܼ(t=Q\Ҋ%z ` Kr~"aK-;\S$œb$H j&3I#Ǿ@I?z2$}pæCz;`P-o-6z8Fe®iG(HNI$Aly/xr.cyք; 7r)7iXo:E} ;bB1Idm-p'3ŁYJ]gL1;PA {b9bƙFl-Djq=qӝ U6Zsmh !2R qD.Tq')껰hGZ{ #_ي DU7ŸWPgX]Y%vQ(̈Rg\ hVɨ,H!I5F=;!"z&ecnO*3'x&`tw4"{9c{j@ y ' p,wpBBÃJ"]mULBD'SeDe%N)= ceoI-OgfOb6c)Xڵ@U(Y*Bg@` J '$Gdž:k`C$+ڝ&k잜%GΧiS#0q6s4PD9'GeX`?x]R1 {fn~^]U>.1-ecv*[MNs9gîQE9sP9\XmRY QvvRj3$„Jwk@H MJJo;dIpLgGՠ_ߍ$u>{i3E2.ʣu$>c+,x d踭5$=))|tx1&vұR I~+&CY[D|VFi`s{Z" ̄$cŷ(#odĭ5lh``E ,Y09E(6tiݹ+&eMP/hR\qѷ+QwWY'"r(*2HL `^o/8xSyoZe^qTJaB *ه]hvhs9jOpJ7q)Ղj7rzw-zbYa0O9 )[L223@J KŽvҒjEb Ok :[5- ]] 爺F_a, b0h [ٕʽ{y )3A%3¦܋c Z 5Чiا3FdP35.%ZaCV]:ʭ(ƷulG" o\'jS4@:_A+0tGmL>hc)=ĖXH*k[LYH3R[y'KP ~H!y\ 1K/w.9b ɣ7 fPXq=NVo ldHrlD)tB1\zu4;SV {E$eW>o~ nG(Gc=sZK:)&,E#} QaϷ'zjzzw>܉}֋ ~Ti?n9$ vƲz1yh=>V)}t̆ Q0@*XvTBz|@[D;PgoRP\xNz&) 1<><VYE4p* ;Pc |Y[htDqt?h{ao&񞴈[m eK S'w>„4cl{ltS7Kl)ۧ 4q+k4ܐUTaQ0zݣh' aZps)]ZU0M:{Iy11Ǝ wF3Ŷ,h2ވZZ.B5m> ya+5<F" Y M%@7SԙrS+Uxn]<]q]C^h*]FA!$n]!k%=ZDlDawD@3X,1 | ?K4$咼|KgSc V+̙r}fmBiqUj/l/ C~tr:{vGj6+FDo7_fҟV5E8Io,IPWo[!MΕ>!KFk&ܬ'-s#6} 蝳NARK\m_dd |&v²/?%6ES5j$&C15Q?cm bz

U@ŷ=y4u7[9E4:(+fIV93)DKb"88~!: Z!i<%.emL+avlfɊuM0+l-$C+i,U>'"ǥa2?*;ߧ'H-jAP](ʁf@lYg@⟙f]GH=c]ӽye~򓕏3]amхh/Chdȅc+`WxwߜA_>/BZݯ7!aɎz<8y54nO< |TUK#،)qs3ލPs P@ɤ,/^~mk6\-y-Sn:4 &j\2A앦|*^>t*͢ϝokMGKVÌ4XV/pJ(rPE)r%tjľ05GCuCV?,f ɭ7u;Ld"Y^]`,pO~&`YՕWvfK$1qBhx %YV`ڿYyY纐p)\P*UA\K6̵24]NM6f^UԁPX"~jDUt{wy-cQI0s3W\.Gfh*$"بiYT|1dq3׮M~0" ^{.>{|$ѶE1e\4zYnrg'E\@ }vsۖB[pzL=7DXmemwB`-]uBN\ܡ.sI%^IbK=y 0{B3.^^m3(Q(&F}š?6bD,Y p0x(]ս |UE3/YL.Q0a4>VϯL{ =p2y#XBO<{"ȄMS($ɑ#8 [.Q?)&#t_0AFai]Yˋ;f7,AeqYejț ьT\].Ϊ ͚U?+XJ:Q;Cﻣ6'9)25Uh06&K7 ě?Փ55ɍՆIdnu aՏdW=GE<}֋,U*:RZ`γqq]gtu& $>TwAXRҴa1yՑ8ԏ"׿ &Gq.S˜+ZQ.@V9ᅵE*Ι4@ɭ e,re5iH̔p~xj.NjMd{Ϭ)m lU7d ŧVBF.335òv Y9ʰ\FhB/taDAcOD&K0`9d%[LbUz4~,05Á㗑-gϥ̿X?8jVE+K2趏KsؿzRr$vcV\l n'9C e ÈblHj%lqTh`D>Rwa:mnyj3|ZbK]YE#<jLjx!X}:g쬭2(.ڰg,,MsIH]!Er-0dmN%- ]m `TG S=vssx D#ݞ_ko]hvG2ql.(q6OQSKxH w-V-R.m`w`{c" Pf:?N 4 )U;`.;ЗbqZHz@"3;Lăj:y'_V/ m &:Rf0lIF^NG EjQj"c9 L+ę ؞u.ی_8AZny{R/fU#9|ZTG? bF 6a2xbzNp#O+KDO-wy͝n[&KBcywoWTT'd}1pմ_J"edt"(Qk>Glyl(0z˻xߎn7[J (4Bů16a=e4KLEeS'l^zo6[ͺX3#iCGxҫǤ0=f,GQ0!s}νuxe \3QU )5K3j>vzZ0a"j] Sa ޽'6K9Q$hn7r[~sB*_uHpka6wEq-sW횕93G?W:, H9:7ǔ64\[U5$'aBR2RbdX̮F@KO`H~Bog*<9gAev.\7EP^a~bqx(XĂqL A0[WIr'a쟗5c҆һZqH 4I3L_X$,L)~ S+ ƔYYٛP_3^\ - 'if+`O{^7l,eU\c(Ú)Awn9u @}7<H0&9:+ItIBCU{bAkY#wFنP۠(PEc0/i`iaMZ&c^H| `q2r,M6wop|{ (TzhQq)Ģ紀B|˻)9< ux(mUsPǐOh%0T fgE'1BSk:d0ŷ 9d<-t; K>ňS~WԾS BI<ㅿm9L:ʵ匋" +n׫)׾F`eN]շv 8_v ÆyQFYN ;qYODπRػul=5+^qn0E6<_1DE/V{f$k/cMηkI ^W9"J]d?ahy -ObkNޯZyKDb"ˌƫ9m"gO%%uAt'2ëjx l͗39X+Fk9쁋keW7Jj֦p7ua[LT}W$i&@*#F )_T%q B`SЍc Y _W)s<Ja7AYa,[=XXN#EJ0aķXbZz[lu<=6.pSJ[ S:vL|)E9iեԽѹ7zwUדɱvpAgKhqPXw2PNj,M-.3DFgПԍ1ڜ9- 1Yn--`;PN}^3k1:ɍg& 7ǂ7Fg~*۠W!y^l:_8X] j\@[j?+/G> N~DJ#`x\G>%aWJ 28m_'[>1aYMhG5h`hEvUSU흮QQ>Riߘ29^ͯ#kft-gW@ ~MuLj9@g`͜\.wlpK`,]5*;:i/LSU Jpr ٹ>0a%@b)66jfvv-{ ! WИU87ȈkLʶa1m|O J r,{8 Ħ2a?2A9-?=%QōTf5f=콆# p2n t&1쓌<2c"p%P Ԓ'^Z*2HZxqJzpN>T%p^3ݬ+&| .;3% ~ϫP9ֹ«$ СPlmأ*ҶA!x7r÷ME(S/HF ۬T=T9vovMؔ3 R!}z/R;Ȳ}{اkE&0 UQ[gXTNTluQ6vi[wXG1UKQt6Ҁ N"NϪ5xvGU Y|2w Sgg?wqѕAj6Er%ݲt$V#B@g ^d9}ldYEz.[l!?ׁ9i_h^TY&>UZ)8peϙSMW I~g +]oBVѾoZ= Qk8,̏5qlP 7Mď.T[sY_S8l\J27(eڕ:9VGd942S|s9UhR1 Y2>xFbhbB ] 񔴎-Nx֟@㭲+u Գs]PnjUIgJ7fl@h|}UGe|\sc<ؐɠPBۡו.9߀Q2:"S fy!CaA>=hFV7Ir;#zhp[ŚRZ.&bX/'ǃI? m>4\ҟZriߖJIB76}5z9R2 xpE4u!۰bM|caxkr!ʍ7ywi0qT63_5,6NM<ᕏ\QJr 7cVfx}js ka?8u, L)=]_(/Mƺ ލ?*Ir]|=tN 7` _IIgn#{;$(tu3f`֠;G+ͼ(1&ywjz MѠw+9B+Սf+^iޙCr?c,֐#IK(w!hf8jR3 48tk5 ɨ  ϗ+}G lxSSLȋ?gWjyOUc;xTO-2?f֘5Wј~F1p7Su~9N\|f"æ@@>N~o ΌXO@Ձ?NZ5[TCPm ԿNd%a Iωw֏u%`XM[.8ȒsSSϹ#& cBm^vuoE8JΈ?=1[vmU= fxE(a%uhpxBCH+b+>|Ro>⨿O*Q*+?' PhP!tóO7;J- d-ܐ9Zsf/5X;(yzͩI^ɽ%^SńcQOxb1+j}RQ&J 먵9~ W ء7q3t(7Ea,pf]OsyVP[z9>~2-xbVu% g$|Z]Q|:OjHT2Z_fHgHݽ#cd3Nf; ?.1[X0N')XY2Dآ 03VV0/.xf,"6'$LB4a:[(7FqpmEIL/(iPK3[egRv("9Q3M J(Xj*rs5{(E0`ú uMA [sM4%Fdoa薭ۤ~d&4d^4Rx .~yMmkqzc o A $6αˀ98j`Rn_Q(I!W]jJ`,bκ2Usx؄]կ&m>VS0|mZ1HU ?ElB׃a@ #s)-|+`ͧID uuD r&c_U-_]Rv:2Rc7[fWZ '@BbVMg0S>k~]#ͶVL~N K[ E\1cgxxp5 a΋ a8=='+n9A fZ"Wa^-|7{KkU)#yߣߗ㯟A1TLP\(\0Bԯo>Z͔1v0}"ҨceYH޵t)<8[ 51S Csɫ7tDY.\,Z;2s慓vbs:?X9s[zH~roIki1iQC؀E N$ҕl`Q@gǟ;gI{5-̑I˧ՕdBHYBY2O{tK,[(,沎g̅Inط ͥ\Q>gB?H -q"/6'9h$l؈OMQW{f\밑NAqA}lyq Fp[ * ^i)ZʃM%Kbk|3Ʉzl/o!]IPō!aX zɍ3+=T0*jGeOXFj3n#7*rڴp ј@=䅽/h [9|R,d.׭qpOځufPHkrbt|-ڋL.d 宅M믔z\ٟ8f3[pǖd7|v R|U[ZԟD}I!4]g;q,B<;P[u)؁Ow-JK_Σ B%nK.9:s.hZKXk~D֓+Z5anGؼn+e|ʮX}}\<\v`DY 8'B! ¦TM%Jy,y;K"_5އdeh7% b_/n(ͯ?I3#Ɖ#'BPRLԡ!Q ^j5&B 18tC2cxnCMu4h9S;}.&L ag^xHe_h;$(FwbN&lKkE =&p Ecd-}b`I%ȏhxƞoe`);^D^c=vة-$AyUaʐ,z ϳ^)dB2r/s h^ՃSknxcvLԮʨ[C Ϋשj`\\Sg}^s]V ll︓GcFdu?mi?wXKFKz 1ekHu{(RY3Ƒ;Y:skP' IdTJab{y\Ð'!lKOifQ c9);RIW`qv/$g3AjKw,K%8ÅyO06BW.~gj4At-!+ωƪr:qvkH/!-G_:do5b8fIw̕O < 4Dl͉8'sd#½u:KtzP_DFsj? qPKhӹ$m_J(zçOg*7eOU`=,?gc~%EhH̵7qqs[L#uoU *)u xí^ww2ALdθmTVL[ҔPu8E#eBݨ\\̓šv&^c"hɇހ"+lrO13h7ɖGwtCk6"dަm~;<ڨ"Kz:[݂倰! |f W\M.ƇSdH8_[ߩjO>_\I7i].B:Gᎅ.]r!S ] s1Ul;|~ԉcYʯ뷙ieN #WAKU3vMe6[04ǞWrJ>h1jǷS8vDݞ&%/ca61\M4ce{\ ;\ȟ?S4Ƽϗ`7 QXAj:{#1 -75kt]-k"}Zj7bzqٷwБLE+M_XMji؛&cB\rй H6#J'3uGD}\5ݼH[H, O=᝟8nLԉ0q)趙ܫ̣O]"` tAU}4+V2a71iWzbp*7ZfrT=%^+iP'ʑgUݑ :y\Ż\I6`Eq<޴ee.+L`edfڂp8hxʙ{Y2y$VOݴRKL6z߿Du 0kKHoo ]zh$FvDͽKGB]{<ɣgs\Jt-K#sA=kt`!7 J;]PN7:}Q:oi(2} fx:%@u,]q؋x $R|4wE5'{yb 253+sJƪTyxe->]l)C#n6n2,ƥ v4^&pn GX;Bק')OP#0a0j";֣RJ9QsE)mR\5%84(X`VjÐjլXwr7삔 d?!R~{MUK~o ߀Xpxk %y }}[6M𰁮-xuD.bœY}ȎԤX?PꮲAxѐhvOiˆ~pNhNxAWU)seƏT3q2]I7,3 ȚcGX㕕KrTEȢ;3׸j0I>Y-RkBD1l$X9OV1S}"ALơxpV|-]Yz0$q~?JR] z'M/%:%~F.ԄO2i%APLϷL)/6r⇼{{_,*k)*vlvO71A3Y//pE'N(#+ x%ھpFOsrjaMPryDBDzMg n2Erw0}\狳*9 (wbH*CÓ/m$yZŭg? R]Ker{gP*ٓn O)puU|A,H#DڏNqh W i o3^.8RUҊ2xg ȥ**5@֜ÈD"fVr|fƆxӥV[~{8HKnic:q&H.wN*O{RGh/L[4h:t$2pO;&qؼ0 (h*m|m0h )z4E>^<$#2 u$x"Ņ\ {7cɓ+ӕ 9v6$X-:K$D³EAZ?Ih:e wlaQ%Uү1Nus)yC]k=[߾`Wkk]!qMюқR.(K]mX)BbOk ܽD[h㒺*әжITrc ,sLū̠22d@|Q8^&δ`;\:iͯPjqUz a M\fJ/;r/sd,  Q~w9W{:!1 oɓf;_'>KT$Y웧t"ۡi8Ӣ/c` 2E>{0^"XQ'/}i?\6'QSvoy^ꃁ4"D9( }+Xb}"GO~mƪIQE¥rVzx_x-qzW{U'G"ۜ =]÷wdlN>J B b~2\[x`S2b&7tK'UPq?{I93FZ͝U_]2%okg֒IO&p&CΞNbU3Xs$:ߴbrIuaIkP}u:'ffUEB"$rW̫bicZ')6vI x}F(RCC֢@>Ԟϳ.c'{ЩN9?&1\ǔ 4&^xOAXϸ_؞=DP$8T,{7t'"Tpa.:BN<*'Zy5׳XH"8#αZgY+/B S|83 B,nڮ*sq!$/8׮6$gF,l:/eI-Swe"|$QP?uNfW ]f-C1U(*1fEH[=UB-sOt'4Xj9)]Xp.- cI3P߄cKE(Rd\1?&u0EV+җp|<}*4{`t#a\?K=hͥ5#?yְk;ߐ{c-4y٥>sus) }4ŵ>gB5]̷iP}pNޭfJBc3Ew{~Gq0|wLlܝgi0sqTbDo64WlX®Q ɇXn-ݭQc 6)Xg4N:YH'UL֢P\ȴ5|k[MQR WQ(@yiaԸzh D$[&f }h$νsq:Ngg?b`Dl#yy9R\ @i2 (Q;ՔAΚc3M$~ kHUFC/)?+PnJW <Ɏ@wۮL :C(GE.=E bTS+@oq+#B) "lGȌ~o K->r0kW ax>aizH')ZO |U f Ӳb]qȮ6QRQnMXU,:=##BF2WnBDu >+ըWu?#+G[Zo:̈+s dH SvQcoL<''4 UZ88LBZwlg͌\v͜mBFߥ񳂂*k k1'u(w{Xxs~i,NMZnrZBABR0}O0EyZ2Mkpə"/N:dj!{D) A>X*S4sw)D:} Hjl~e;Aц26-hJH[.? nױqt3c0!7o.>_~#X^V. M%+Cc_ yGԹP9m,k@΢=K}[U4I|o :.!W3`nx2Qj+yj4ؠcNPWKvzx(Y\bz9,rv6 uUai‹Y #1pv+Z&~j cHWk'!%@Lw4ȋ&?頞AeL9֋ky>|go9w@*[b-F.M ҈ʺ^.<H50͖@2QVV1~o2=9ܮ|skE(k6= 0-ғ/?Ɖ#f7Q…%[}-̜aK=vqkDH chif/;sŦXݟ=iO E{+QW{ fӷ_;<ٻ!?0WjBهA^Cgsv毺}X+? #V\.̖>tvY1+5NwJ«dH}YX-C_fKh`cExLb"['6*u[&=u硛6"wьIWDVw;T^e%xȱtb D!/^ҫ.9˧{w&^9}ui^t^M\3,G&H"'e9>i~oemyLbOٖZpv"vm5E:n;ra'L!Q9mmc֞R P;؞:9OBٮPs,Y.;wJVTJ"Gg~R~Y~d,sC.}^E#5֏ 6s-$2Rxgch!E5bJ9h=>a< Pnyk8li dsg^ofB@HvfGl2]c"C5)̩v"&S)x O!66,HU.+53~pbsmze7nzNf%Ѣ'4b輄 S1 L.*Yj $k+F8Pyzz1LBZoR<*C6>ޟ . ԭ7 d3aYWiUUQevSŲ",?36#.a-C#-٤ g8< Ճn$۰G +FW!dɉ+RoL7]7֒TnC_P|eqaqI3nv!ߞZb(Df¨vg4QѦhSQ`@ٵI#$4؎S:}%5<^|8<=k)8_IcXZ::HJ%K͡7l%-Gkhw7E _"Sf?|QF)4ߵM))?&^ m$Te9/1;sB* L$}ЯMqg>jؚ9O&;+Y1\uEN ރ:$UDڳ/W~_@-@],0\=C{Ektn)1WeK5ۃy/] $˲P4EH "?#^о,6kZ66m~S5o^;߱ADp5y 4]%B 5B. z1W= ;gBT<p8 ut(\ߥ_03dXqقQA4Qp 0Sb8ldYK>u) O˹u%`Isl;_9&#aX}d/sW pl5թgp qkhhDfCϒcpqtw]$gف^ʑpE Cy!Vӑbc|o L vS?R`X~ &SQ[Hk%kiuX| Ŵ]m^rؒ1 YzjKRa/fRLxO[/QysDsc> /V$c:y}b;8mniD㢹nW ^MXrC"z[:E0I Ea-%O6z{gJ G1T@a OӨ2WoXƴ!pOsA^eJLh1cԾ :K{5}C@1?SD N1*Ytk@hg$F#Qnb^%cR+ zX7ط϶P#% nേTF )ގ1X\m&<}xbx6csQyZIprKHٰSβ٣aDl'ۉDB3Ho5Q`*~ i-u! OH%_  ٖ@<$Pb3V^lh;UD{]eåζSHgknJR6]Y@DKK79vV轑!hN GZCI4[ :H}@f1XvBZ;iOT:eS ;|{(§w;r\[lQ=)]J`'S[p0;E9=]k%γ^wOd@֢" 0=c 3( hl4/[[1@6&4ӊĐFōe9B$eD'@-+yOYc|1SJ"  ;i/p)?j(EsѤcؖ)$D. fh:u~kX3^UTPɍ~.{#.&: u@:_e2X,N6VVTǧwAIVfhw_ =ܵzOd4;98B)-2dш砽Ϣn|]O&D t?"P3sH^zgHeJ*VhשЇc!S9:T~}fh3(I1uk*zΣ gk{u%=3 uaղ!" ݳa l~"U$bԬD@pRCYY=X7ihłT0U"?PШH~,qWjPE.`M2 @P0^Õ[)7 !:_pE}CL= s-['r$wwyS3d aeP{i'q+LuQScm_a ^NWFV Ahc؅02ql1hp@Je5/~֩I=EQiI:r^Chwvqv.ȠAk%`F,3$v19 `el.\-B)L[ m;6[Z-!,UTXԏbs3wsU Z|A~^Q7? ZQ Vυ4{(5d٣1kCq4Ud_~ly:17'vnCUBM9·{dWO'}aOevVR=li1_ rG,mN7Vx]kU>LRRvesJ[۬QT yg=r*E[[>'oA<õ/ F4D`i:B&8MxnM<1# Hz>7uzCf*ᢵ+ B͗Z?$EPmX=0;9 Z8ױXr>j2Gl/4`S|K(xhD99E@(NpZ"p (HV*2Ir xBz*#d\IMLn.lO4lG@ ͳ B& ď%;-s4ʍWk.@~UITzq~ױRGut!چxϖv3h_XDJ"?-eR1E;\~)kp41ן6j4}`ӠX=Q+ڍEWבrPN!{/dD{e!M =Ԫ7-8UV`tKs,NѾTrЄ{nqS cRyޞ zIdڶQ~* Xӝj+%}9h7'Č+/[icL-6zXPǶ׌B z\vHO?}@~# C]+p\D Ds7.PwV"cKIm>v:  釭 o {IPH/&1a@r ϐza' gf T*zP a&M2[kي 8ȏ\% ؓ:1.pltGM 0KA10 byօڀl QX~NhXﯘ. v_^,St&-l7&jAb%Kc +In+8*/$#.lʆK?!,@D gyW}v1k0Ԕ`8gNV Wm-Jp2B{s%uW3.arЋ_wؕ*!wz%؟H0Ÿ#Jz UVបu4(s #8 U4,`T_*:0mQc@*66h[m5 @*ftxO 6߭hB"DP&<ZsF"S79$VɯtSX3:;jӪEtn=y) /t˯h xoL(LIH| R7fy=-i)@Bs.4 JiՋ<!ħ~1 S$r,qHRo.L woe|W5{7XKh͋`ڇ$a .D3(j;5I9磃jvstPIC ^:ZWYqe_o/hTOQ38٪*O?0=qz`?[ a5LïwU;TV#TTC޿b0_2:I5M]k3{]sQ4-Nu%\To)kϐm^9=zș%.kHO"9~fpdSp$ih/|KF05O+_ R6Mr)*<0Kh!Bw`"g,_`ԝcQ3ti햮R/bWEN!4]d ?G pPjiuw֑@eCKd?X-i7 ܟ6-E@|7@! ڋQfr