From 8cef73671bbf2266a250172932ee1c836b5ea6de Mon Sep 17 00:00:00 2001 From: gongfuxiang Date: Sun, 20 Nov 2022 21:29:44 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=B4=A6=E5=8F=B7=E6=B3=A8?= =?UTF-8?q?=E9=94=80=E5=92=8C=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/admin/controller/Agreement.php | 4 ++ app/admin/view/default/agreement/logout.html | 33 +++++++++++ app/api/controller/Safety.php | 55 ++++++++++++++++++ app/index/controller/Safety.php | 40 ++++++++++++- app/index/view/default/safety/email_info.html | 4 +- app/index/view/default/safety/index.html | 14 ++--- .../view/default/safety/login_pwd_info.html | 4 +- .../view/default/safety/logout_info.html | 51 ++++++++++++++++ .../view/default/safety/mobile_info.html | 4 +- .../view/default/safety/new_email_info.html | 4 +- .../view/default/safety/new_mobile_info.html | 4 +- app/lang/zh-cn.php | 2 + app/service/ConfigService.php | 2 + app/service/NavigationService.php | 41 +++++++------ app/service/SafetyService.php | 52 ++++++++++++++++- app/service/SystemBaseService.php | 3 +- app/service/UserService.php | 9 +-- public/static/app/yellow/common/gear-icon.png | Bin 0 -> 1976 bytes .../app/yellow/common/notification-icon.png | Bin 0 -> 1049 bytes .../static/app/yellow/common/qrcode-icon.png | Bin 0 -> 856 bytes public/static/index/default/css/common.css | 1 + public/static/index/default/css/safety.css | 15 ++--- 22 files changed, 290 insertions(+), 52 deletions(-) create mode 100644 app/admin/view/default/agreement/logout.html create mode 100644 app/api/controller/Safety.php create mode 100644 app/index/view/default/safety/logout_info.html create mode 100644 public/static/app/yellow/common/gear-icon.png create mode 100644 public/static/app/yellow/common/notification-icon.png create mode 100644 public/static/app/yellow/common/qrcode-icon.png diff --git a/app/admin/controller/Agreement.php b/app/admin/controller/Agreement.php index 05960ea92..0772b8550 100644 --- a/app/admin/controller/Agreement.php +++ b/app/admin/controller/Agreement.php @@ -52,6 +52,10 @@ class Agreement extends Base [ 'name' => '用户隐私政策', 'type' => 'privacy', + ], + [ + 'name' => '账号注销协议', + 'type' => 'logout', ] ]; $assign['nav_data'] = $nav_data; diff --git a/app/admin/view/default/agreement/logout.html b/app/admin/view/default/agreement/logout.html new file mode 100644 index 000000000..4c943e44f --- /dev/null +++ b/app/admin/view/default/agreement/logout.html @@ -0,0 +1,33 @@ +{{include file="public/header" /}} + + +
+ + {{include file="agreement/nav" /}} + + +
+ +
+
+
+ + 查看详情 +
+ +
+
+ + + + +
+
+ +
+
+ + + +{{include file="public/footer" /}} + \ No newline at end of file diff --git a/app/api/controller/Safety.php b/app/api/controller/Safety.php new file mode 100644 index 000000000..0e37d6137 --- /dev/null +++ b/app/api/controller/Safety.php @@ -0,0 +1,55 @@ +IsLogin(); + } + + /** + * 账号注销 + * @author Devil + * @blog http://gong.gg/ + * @version 0.0.1 + * @datetime 2017-03-28T17:04:36+0800 + */ + public function Logout() + { + $params = $this->data_post; + $params['user'] = $this->user; + return ApiService::ApiDataReturn(SafetyService::AccountsLogout($params)); + } +} +?> \ No newline at end of file diff --git a/app/index/controller/Safety.php b/app/index/controller/Safety.php index f3af65e82..3d2f461f2 100755 --- a/app/index/controller/Safety.php +++ b/app/index/controller/Safety.php @@ -14,6 +14,7 @@ use app\service\ApiService; use app\service\SeoService; use app\service\SafetyService; use app\service\NavigationService; +use app\service\AgreementService; /** * 安全 @@ -155,6 +156,29 @@ class Safety extends Common return MyView(); } + /** + * 账号注销页面 + * @author Devil + * @blog http://gong.gg/ + * @version 0.0.1 + * @datetime 2017-03-28T10:12:20+0800 + */ + public function LogoutInfo() + { + // 协议 + $document = AgreementService::AgreementData(['document'=>'userlogout']); + + // 模板数据 + $assign = [ + // 协议内容 + 'document_data' => $document['data'], + // 浏览器名称 + 'home_seo_site_title' => SeoService::BrowserSeoTitle('账号注销 - 安全设置', 1), + ]; + MyViewAssign($assign); + return MyView(); + } + /** * 验证码显示 * @author Devil @@ -218,7 +242,7 @@ class Safety extends Common } /** - * 账户更新 + * 账号更新 * @author Devil * @blog http://gong.gg/ * @version 0.0.1 @@ -230,5 +254,19 @@ class Safety extends Common $params['user'] = $this->user; return ApiService::ApiDataReturn(SafetyService::AccountsUpdate($params)); } + + /** + * 账号注销 + * @author Devil + * @blog http://gong.gg/ + * @version 0.0.1 + * @datetime 2017-03-28T17:04:36+0800 + */ + public function Logout() + { + $params = $this->data_post; + $params['user'] = $this->user; + return ApiService::ApiDataReturn(SafetyService::AccountsLogout($params)); + } } ?> \ No newline at end of file diff --git a/app/index/view/default/safety/email_info.html b/app/index/view/default/safety/email_info.html index 99dfdec1e..1ce200a42 100755 --- a/app/index/view/default/safety/email_info.html +++ b/app/index/view/default/safety/email_info.html @@ -25,8 +25,8 @@
- 原电子邮箱校验 - 返回 + 原电子邮箱校验 + 返回
diff --git a/app/index/view/default/safety/index.html b/app/index/view/default/safety/index.html index d5a18f9ff..8779d301a 100755 --- a/app/index/view/default/safety/index.html +++ b/app/index/view/default/safety/index.html @@ -23,7 +23,7 @@
{{foreach $safety_panel_list as $v}} -
+

{{$v.title}}

@@ -33,9 +33,11 @@ {{$v.msg}} {{/if}} {{if empty($data[$v['type']]) and !empty($v['tips'])}} - {{$v.no_msg}} + {{if !empty($v['no_msg'])}} + {{$v.no_msg}} + {{/if}} {{else /}} - {{if !empty($data[$v['type']])}} + {{if !empty($v['ok_msg']) and !empty($data[$v['type']])}} {{:str_replace('#accounts#', $data[$v['type']], $v['ok_msg'])}} {{/if}} {{/if}} @@ -43,11 +45,7 @@

{{$v.tips}}

{{/if}}
- {{if empty($data[$v['type']]) and empty($v['msg'])}} - 绑定 - {{else /}} - 修改 - {{/if}} + {{if empty($v['submit_text'])}}{{if empty($data[$v['type']]) and empty($v['msg'])}}绑定{{else /}}修改{{/if}}{{else /}}{{$v.submit_text}}{{/if}}
{{/foreach}} diff --git a/app/index/view/default/safety/login_pwd_info.html b/app/index/view/default/safety/login_pwd_info.html index 737d22e39..4a40b6d4d 100755 --- a/app/index/view/default/safety/login_pwd_info.html +++ b/app/index/view/default/safety/login_pwd_info.html @@ -25,8 +25,8 @@ - 登录密码修改 - 返回 + 登录密码修改 + 返回
diff --git a/app/index/view/default/safety/logout_info.html b/app/index/view/default/safety/logout_info.html new file mode 100644 index 000000000..1dc63bb66 --- /dev/null +++ b/app/index/view/default/safety/logout_info.html @@ -0,0 +1,51 @@ +{{include file="public/header" /}} + + +{{include file="public/header_top_nav" /}} + + +{{include file="public/nav_search" /}} + + +{{include file="public/header_nav" /}} + + +{{include file="public/goods_category" /}} + + +
+ + + {{include file="public/user_menu" /}} + + + +
+
+ + 账号注销 + 返回 + + +
+

{{$document_data.name}}

+

{{$document_data.upd_time_time}}

+
+ +
+
{{$document_data.value|raw}}
+
+ +
+ + 取消 +
+
+
+ +
+ + +{{include file="public/footer" /}} + + \ No newline at end of file diff --git a/app/index/view/default/safety/mobile_info.html b/app/index/view/default/safety/mobile_info.html index da8f963ca..0d5c830d8 100755 --- a/app/index/view/default/safety/mobile_info.html +++ b/app/index/view/default/safety/mobile_info.html @@ -25,8 +25,8 @@ - 原手机号码校验 - 返回 + 原手机号码校验 + 返回
diff --git a/app/index/view/default/safety/new_email_info.html b/app/index/view/default/safety/new_email_info.html index b6c705f5c..8816ece93 100755 --- a/app/index/view/default/safety/new_email_info.html +++ b/app/index/view/default/safety/new_email_info.html @@ -25,8 +25,8 @@ - 新电子邮箱校验 - 返回 + 新电子邮箱校验 + 返回
diff --git a/app/index/view/default/safety/new_mobile_info.html b/app/index/view/default/safety/new_mobile_info.html index 982d0b7e4..a1ca269dd 100755 --- a/app/index/view/default/safety/new_mobile_info.html +++ b/app/index/view/default/safety/new_mobile_info.html @@ -25,8 +25,8 @@ - 新手机号码校验 - 返回 + 新手机号码校验 + 返回
diff --git a/app/lang/zh-cn.php b/app/lang/zh-cn.php index 226b5467b..401fa99ad 100755 --- a/app/lang/zh-cn.php +++ b/app/lang/zh-cn.php @@ -119,6 +119,8 @@ return [ 'loading_success' => '加载成功', 'request_fail' => '请求失败', 'request_success' => '请求成功', + 'logout_fail' => '注销失败', + 'logout_success' => '注销成功', 'no_data' => '没有相关数据', ], ]; diff --git a/app/service/ConfigService.php b/app/service/ConfigService.php index dcb526bdb..fa4e88e30 100755 --- a/app/service/ConfigService.php +++ b/app/service/ConfigService.php @@ -27,12 +27,14 @@ class ConfigService public static $not_cache_field_list = [ 'common_agreement_userregister', 'common_agreement_userprivacy', + 'common_agreement_userlogout', ]; // 富文本,不实例化的字段 public static $rich_text_list = [ 'common_agreement_userregister', 'common_agreement_userprivacy', + 'common_agreement_userlogout', 'common_email_currency_template', 'home_footer_info', 'home_email_user_reg', diff --git a/app/service/NavigationService.php b/app/service/NavigationService.php index b9abfb44e..615f2afc3 100755 --- a/app/service/NavigationService.php +++ b/app/service/NavigationService.php @@ -800,26 +800,33 @@ class NavigationService { $data = [ [ - 'title' => '登录密码', - 'msg' => '互联网存在被盗风险,建议您定期更改密码以保护安全。', - 'url' => MyUrl('index/safety/loginpwdinfo'), - 'type' => 'loginpwd', + 'title' => '登录密码', + 'msg' => '互联网存在被盗风险,建议您定期更改密码以保护安全。', + 'url' => MyUrl('index/safety/loginpwdinfo'), + 'type' => 'loginpwd', ], [ - 'title' => '手机号码', - 'no_msg' => '您还没有绑定手机号码', - 'ok_msg' => '已绑定手机 #accounts#', - 'tips' => '可用于登录,密码找回,账户安全管理校验,接受账户提醒通知。', - 'url' => MyUrl('index/safety/mobileinfo'), - 'type' => 'mobile', + 'title' => '手机号码', + 'no_msg' => '您还没有绑定手机号码', + 'ok_msg' => '已绑定手机 #accounts#', + 'tips' => '可用于登录,密码找回,账户安全管理校验,接受账户提醒通知。', + 'url' => MyUrl('index/safety/mobileinfo'), + 'type' => 'mobile', ], [ - 'title' => '电子邮箱', - 'no_msg' => '您还没有绑定电子邮箱', - 'ok_msg' => '已绑定电子邮箱 #accounts#', - 'tips' => '可用于登录,密码找回,账户安全管理校验,接受账户提醒邮件。', - 'url' => MyUrl('index/safety/emailinfo'), - 'type' => 'email', + 'title' => '电子邮箱', + 'no_msg' => '您还没有绑定电子邮箱', + 'ok_msg' => '已绑定电子邮箱 #accounts#', + 'tips' => '可用于登录,密码找回,账户安全管理校验,接受账户提醒邮件。', + 'url' => MyUrl('index/safety/emailinfo'), + 'type' => 'email', + ], + [ + 'title' => '账号注销', + 'tips' => '不可存在未完成的订单', + 'url' => MyUrl('index/safety/logoutinfo'), + 'type' => 'logout', + 'submit_text' => '注销', ], ]; @@ -937,7 +944,7 @@ class NavigationService [ 'name' => '安全设置', 'url' => MyUrl('index/safety/index'), - 'contains' => ['indexsafetyindex', 'indexsafetyloginpwdinfo', 'indexsafetymobileinfo', 'indexsafetynewmobileinfo', 'indexsafetyemailinfo', 'indexsafetynewemailinfo'], + 'contains' => ['indexsafetyindex', 'indexsafetyloginpwdinfo', 'indexsafetymobileinfo', 'indexsafetynewmobileinfo', 'indexsafetyemailinfo', 'indexsafetynewemailinfo', 'indexsafetylogoutinfo'], 'is_show' => 1, 'icon' => 'am-icon-user-secret', 'is_system' => 1, diff --git a/app/service/SafetyService.php b/app/service/SafetyService.php index 4dab45509..be4b4fea5 100755 --- a/app/service/SafetyService.php +++ b/app/service/SafetyService.php @@ -349,7 +349,7 @@ class SafetyService } /** - * 账户更新 + * 账号更新 * @author Devil * @blog http://gong.gg/ * @version 0.0.1 @@ -455,5 +455,55 @@ class SafetyService } return DataReturn(MyLang('common.operate_fail'), -100); } + + /** + * 账号注销 + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @date 2022-11-20 + * @desc description + * @param [array] $params [输入参数] + */ + public static function AccountsLogout($params = []) + { + // 数据验证 + $p = [ + [ + 'checked_type' => 'empty', + 'key_name' => 'user', + 'error_msg' => '用户信息有误', + ], + ]; + $ret = ParamsChecked($params, $p); + if($ret !== true) + { + return DataReturn($ret, -1); + } + + // 是否还有未完成的订单 + $where = [ + ['user_id', '=', $params['user']['id']], + ['status', '<=', 3] + ]; + $count = Db::name('Order')->where($where)->count(); + if($count > 0) + { + return DataReturn('存在'.$count.'个订单未完成', -1); + } + + // 账号注销 + $data = [ + 'status' => 2, + 'is_logout_time' => time(), + 'upd_time' => time(), + ]; + if(Db::name('User')->where(['id'=>$params['user']['id']])->update($data)) + { + UserService::Logout(); + return DataReturn(MyLang('common.logout_success'), 0); + } + return DataReturn(MyLang('common.logout_fail'), -1); + } } ?> \ No newline at end of file diff --git a/app/service/SystemBaseService.php b/app/service/SystemBaseService.php index a23c16820..5dd3616e9 100644 --- a/app/service/SystemBaseService.php +++ b/app/service/SystemBaseService.php @@ -45,9 +45,10 @@ class SystemBaseService 'common_site_type' => self::SiteTypeValue(), 'common_shop_notice' => MyC('common_shop_notice', null, true), - // 协议、注册协议、隐私协议 + // 协议、注册协议、隐私协议、注销协议 'agreement_userregister_url' => MyUrl('index/agreement/index', ['document'=>'userregister', 'is_content'=>1]), 'agreement_userprivacy_url' => MyUrl('index/agreement/index', ['document'=>'userprivacy', 'is_content'=>1]), + 'agreement_userlogout_url' => MyUrl('index/agreement/index', ['document'=>'userlogout', 'is_content'=>1]), // 手机端相关配置 'common_app_is_enable_search' => (int) MyC('common_app_is_enable_search', 1), diff --git a/app/service/UserService.php b/app/service/UserService.php index d571f8816..7b3bb22f5 100755 --- a/app/service/UserService.php +++ b/app/service/UserService.php @@ -2202,11 +2202,12 @@ class UserService { return ''; } - + $where = [ ['system_type', '=', SystemService::SystemTypeValue()], [$where_field, '=', $where_value], ['is_delete_time', '=', 0], + ['is_logout_time', '=', 0], ]; return Db::name('User')->where($where)->field($field)->find(); } @@ -2444,13 +2445,13 @@ class UserService // 手机号码格式 if(!CheckMobile($params['mobile'])) { - return DataReturn('手机号码格式错误', -2); + return DataReturn('手机号码格式错误', -2); } // 验证码校验 $verify_params = [ - 'key_prefix' => 'user_bind_'.md5($params['mobile']), - 'expire_time' => MyC('common_verify_expire_time') + 'key_prefix' => 'user_bind_'.md5($params['mobile']), + 'expire_time' => MyC('common_verify_expire_time') ]; $obj = new \base\Sms($verify_params); diff --git a/public/static/app/yellow/common/gear-icon.png b/public/static/app/yellow/common/gear-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0a21681d03cb5275754835f8553b3920de52f7c2 GIT binary patch literal 1976 zcmV;p2S@mcP)Px+a!Eu%RA@uRT4k(WMG!qF5Q678wqRv?m`f$U%|zXRA1 zz|P@kicH~Il51p6md?*-0PO5&Nml{bqcGQKk_R;*X#^r^6o530#w9D&wn&$e+%E%i z5r9UA8jM~^a_`#vDiBF|8a0S*91cnNG@;;du9uF9m(BFV~Ri|oeJRiWWWFjr%Opw2QVX(_m4#YB)@6fD!-RxP!Z6&$(VZ# zg5(>L76Wj52Idx$JLGfJfLtHqKI$Jy(mOOLk{lu%0XUK5OI@6==}1};z%>A_B6(pp zPYKLUByURfYCt^r5dcnumR|sD9aCvEAZZ$szfBB?rmKN=*k_lFyWj zTIxW_VV}P})2g2@g_;77_ zF9Jy~JSBfOCi!4t#Y{2oOrCE~^47{?Tah$J%k|72dZ>QE{;(R5KLC6P z;G^)bLuCkul5|?Q0NHk9GN|lkdYDfqnew}VA(CbZ1k&l;KQnd(GR)4C{Jd>tC3&U1 zVwMX@nhkUoNe=0Q!+-}#Hs19^dXIoo?pNHA#=?_&Dd{T!vxjFxh+G>YNjn0#G3b3w za*nn!VVB%HOOL}u1MxL>&M^51lDBnnBi3xsDIJ=dttihks)yChAtRR*$h-Z3yJhSKBDnLRfGxFN|B1$fTsc z(yv=Ii-cBZd@@k&D}xsb_i{G~EN_uCR~jNA zCFZHRS{Nneh0r$VE-~Q(MR^{8N#@4@T-`s9{o|%C%31(YGFNSJR+z6F5^h?UI9l92 zanmhrH28Uy0ZYnB<7Oo9EiGspjsFusq|ReVdNqquVZb%@_`J$|tsp6_{9llC+qEcd zKrR80W~>!RrcLP{qk##Zm$g?*6JH15uoB~q%7u%SS+AME1Odq_sA;tOTW*(DMUrdF zvf-*5Kj`?H>z~(3sMP6X*we_18_lfLoUillIhjAEp#UMy(Dw6bO)+e z2~W}l#2I3h#FL9iMuIoN4)!xpl53P38ByAAi0K59Mguq?dDbbU`f;)lN>k?{D{1LK zMdF3eS#X0=svfc<{wfvPmvOGazHbKhOaLnbIBF8KOqX}-)%X59bPFMNIZ3DG9;p>X z_f^wIaoWUo1wIA93W=q@o7f&JDSlrWk%lmUqrE$oCibZ$4Z0mjm?WnL2IF?mNdTs+ zgi+&Xg*ZmiJ^;L`OIGYSl#ecS;?E}O=R>65I?~TE7)3Je+jfapo`J5P`k%?C*OyW*fodIrGinKOR@xDvn}p^sMD?Mq4S-?WOY zKth=LE7eiKkZa5Nd6kv4DS#sZtQz#jll13_0SV;tt)zM2)aoz9PbNCk1GqYT8Hqk`T1SB}(1McRXbu(KNy(sR;L~)9ZosUKW7#42F{HxSNhgKI5Ve*9myxT#)?;cp2%}Ko@?jQRM zm6~X&FGDg~o1<;-Cn=DyE3XCC+cbBzv)|@$?fv8c^1uAYvwr};&<(;R3cdRP0000< KMNUMnLSTZ{9E^zo literal 0 HcmV?d00001 diff --git a/public/static/app/yellow/common/notification-icon.png b/public/static/app/yellow/common/notification-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..dd526dc7031d33b5c2d73aa178b62b8ba68971fa GIT binary patch literal 1049 zcmV+!1m^pRP)Px&(@8`@RA@u(noFo0MHGg=f8hf+iW?uGZWPf3S4uR|XcUA56%-5@UHV)YiD-gk zkz^ra5+a&~&!sV7KtY26L5;7dm{mv&q8k-_Y(zJraq-K+8mQa1XS%wlI}S1jE_3gl zs#E{h=hW%ysuuqf(-0iCZvZX^E=iv;%(uWd@hRzG-{bZIV*5Pc7T`MIHsH(#p}zxf z0UrbVCH*ul*i;}1-~r%1;QWqaegs|yUYrJ~Gl=bbfo%l<#}nXX4WI$EMbax>E=VU3 z+goGMngM?UBL6=GJ^_wMIuY$`p9)+7Tnk(e#5_8y#>X~E;lGu&1{nj^mvo6MiARkX(Ae@ zCucFSuk1P}ngpdeb2uyOf2OD$nbfxgEsAycXCXhV5KS;W;R74-`Y<~}2kbF%{>n4zQ zfYr&-VM$l@A+Xek?JuL$r}hUVt?4>PK1i$7=zmbss!|bsw6k42ep5t>9rYo+>SGQv z%@vtPWWp7gr`9~RhL|A#Zdepo&3XA9C;vUlFR5jFIq+$w@fk^v4y3u( zt?gaFhV07~k`C219$U3+zXsfuby_azvy%*R4Uh}pD`{OZi0ya=iD!|K?US_jWI~L_ zvK?Er`F83WNe8N0Y9nGhf1rv!tA;pbD!DM}^eb+RBddMDS_EP{(kaqvWbaG5sbtWh z+Sq;%xH0p;PSW0dygHDW;4#rh7Kb^rVEK8>AxSI7g4Bd@768U+Sdi`uB4Yb;;Mgpy z&$KO(^wsF^y40$c-C5*XRE8Tjv1gH@PE#)+w$F%-G)Z5#0k?fA5F3AgwCOhpi0#{f zHvMh=?`P9^h!@czS6%C#aTm-%`X&>1~IfTlQPjycdv>*Rs+ TPBY?800000NkvXXu0mjfxmD%V literal 0 HcmV?d00001 diff --git a/public/static/app/yellow/common/qrcode-icon.png b/public/static/app/yellow/common/qrcode-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1fdb28af8f5e3a6965add07ef502132ad5342098 GIT binary patch literal 856 zcmV-e1E>6nP)Px&5=lfsRA@u(TD__iF&I6kw6(VqMbXk;Z($+$1Qvpzh1lDA?|WF-DOihO^8Myah&{O&^AM5a2Hakd{5dvG3k;IM zJbNN;@MjH3_#u?c13TUd7{??}6vGmch9vw@*GPWxA4H@%2FZ>?_Y$pC$FTD9mOb$< zur@}LNbG+lq(tNvfcNg6Q6iNX8Xv)89f(Y1q}{ZLh^U+B!4ap;u zG|FA;K;+-@Wd-}eB4)8>v)2FYT7B7f!MjGV#~5=JKMr=SA->n@+&5*By&=*E=!zDJ zF-k3xm3~tene0-c9G_E1YB9=PtEA5=D2M@(1sGXG0<$jw$+1W+M!9RPL}WV_$(Xzk zPR)9$_d#l0xaXO|P~2e~?||kqM+U#aU#^h+W}3a`7{LzF5mAQs09;-&0A7=P zV!s!WmKfgwy!0Eil!`LhvS*U~Nb=9jo+Wdr^xsHs>@Nc%RimHb&HG10M9u@a1K?qU zg?$C!1If=O&@TXZ3gCK!@%<2ANj}yOR@Zt5;C4fhPXKQCSc%k?hA?<+P%#DqYXOT-q< zU_&)EmjjWRVmIqr0Mvc0`hTibI#N^y7I7N#O@ptU^k&u~4aJARwHy&oSm)KX_O6Yw zF%pRCiANJhJ4qz!%?9yuAhMQg#g7#dE3K|*%fMs?JF^(cBoaO+G(vWqY__RuP1cc= zMM$3J*0EhC(q*F>B5MhBr533sQY)T~$w5ts#JyP8!siskT+^C;$J#`!rlqi>1+i9h zsv%<6P1EflMiv*uwJZ|Vhz=&6czo2uwJ_Nh$vH5vM4-#+wW?Yaw}Wdgo&mT-Qg?BB zx?*cYtioODQK|n2hiXLRB7lw*fcpS`nG+Iy_gifdlXX@*=H#q$j^tbSJ`e*FZA<+7 iCUHcnOA33VYyAaN_TXTrdzv)>0000