From 9f34eb6c316177c4e44fce3b302adc4c8ec52e3a Mon Sep 17 00:00:00 2001 From: Sum1Dream <418471657@qq.com> Date: Fri, 22 Dec 2023 10:47:04 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api-mer-order-list.component.html | 236 ++++++++++++++++++ .../api-mer-order-list.component.scss | 3 + .../api-mer-order-list.component.ts | 152 +++++++++++ .../order-manage-routing.module.ts | 2 + .../admin/order-manage/order-manage.module.ts | 3 +- src/app/services/Interceptor.service.ts | 2 - .../services/order/order-api-mer.service.ts | 43 ++++ src/favicon.ico | Bin 7755 -> 0 bytes src/index.html | 2 +- 9 files changed, 439 insertions(+), 4 deletions(-) create mode 100644 src/app/admin/order-manage/api-mer-order-list/api-mer-order-list.component.html create mode 100644 src/app/admin/order-manage/api-mer-order-list/api-mer-order-list.component.scss create mode 100644 src/app/admin/order-manage/api-mer-order-list/api-mer-order-list.component.ts create mode 100644 src/app/services/order/order-api-mer.service.ts delete mode 100644 src/favicon.ico diff --git a/src/app/admin/order-manage/api-mer-order-list/api-mer-order-list.component.html b/src/app/admin/order-manage/api-mer-order-list/api-mer-order-list.component.html new file mode 100644 index 0000000..4b54738 --- /dev/null +++ b/src/app/admin/order-manage/api-mer-order-list/api-mer-order-list.component.html @@ -0,0 +1,236 @@ + + + + + + +
+
+
+
+ +
+ + 交易单号 + + + + +
+ +
+ + 客户电话 + + + + +
+
+ + 交易状态 + + + + + + +
+
+ +
+
+ + 分公司 + + + + + + +
+ +
+ + 支付方式 + + + + + + + + + + + + +
+
+ + 支付卡号 + + + + +
+
+ + 支付时间 + + + + +
+ +
+ + 创建时间 + + + + +
+ +
+ + 退款时间 + + + + +
+
+
+ +
+
+
+
+ + + +
+ 共计 {{total?total:0}} 条数据 + + + + + + + 交易单号 + 客户电话 + 订单名称 + 订单金额 + 支付金额 + 支付方式 + 订单状态 + 创建时间 + 操作 + + + + + {{data.orderNo}} + {{data.memPhone}} + {{data.title}} + ¥{{data.totalPrice}} + ¥{{data.payPrice}} + {{data.orderStatus == 1 || data.orderStatus == 5 ? '未支付' : data.payType | orderPayType}} + {{data.orderStatus | orderStatus}} + {{data.createTime | date : 'yyyy-MM-dd HH:mm:ss'}} + + 操作列表 + + + + + + + +
+
+ + + + + + + {{orderDetailObject.tradeOrder.orderNo}} + {{orderDetailObject.tradeOrder.paySerialNo!=null?orderDetailObject.tradeOrder.paySerialNo:'无'}} + {{orderDetailObject.tradeOrder.memPhone}} + {{orderDetailObject.tradeOrder.orderStatus | orderStatus}} + {{orderDetailObject.tradeOrder.payType | orderPayType}} + + {{orderDetailObject.tradeOrder.memCardNo}} + + {{orderDetailObject.tradeOrder.memDiscountName?orderDetailObject.tradeOrder.memDiscountName:'无'}} + {{orderDetailObject.tradeOrder.whetherRebate?'是':'否'}} + {{orderDetailObject.tradeOrder.remarks}} + + + + + {{orderDetailObject.tradeOrder.totalPrice}} 元 + {{orderDetailObject.tradeOrder.totalDeductionPrice}} 元 + {{orderDetailObject.tradeOrder.deductionProductPrice}} 元 + {{orderDetailObject.tradeOrder.deductionCouponPrice}} 元 + {{orderDetailObject.tradeOrder.payablePrice}} 元 + {{orderDetailObject.tradeOrder.payGold / 100}} 元 + + {{orderDetailObject.tradeOrder.payRealPrice!=null?orderDetailObject.tradeOrder.payRealPrice+' 元':'未支付'}} + + + + + + + +

创建时间:{{orderDetailObject.tradeOrder.createTime | date : 'yyyy-MM-dd HH:mm:ss'}}

+

备注:{{orderDetailObject.tradeOrder.remarks?orderDetailObject.tradeOrder.remarks:'无'}}

+
+ +

取消时间:{{orderDetailObject.tradeOrder.cancelTime | date : 'yyyy-MM-dd HH:mm:ss'}}

+

备注:{{orderDetailObject.tradeOrder.cancelRemarks?orderDetailObject.tradeOrder.cancelRemarks:'无'}}

+
+ 支付时间:{{orderDetailObject.tradeOrder.payTime | date : 'yyyy-MM-dd HH:mm:ss'}} + 完成时间:{{orderDetailObject.tradeOrder.finishTime | date : 'yyyy-MM-dd HH:mm:ss'}} + 退款时间:{{orderDetailObject.tradeOrder.refundTime | date : 'yyyy-MM-dd HH:mm:ss'}} +
+
+
+
+
+
diff --git a/src/app/admin/order-manage/api-mer-order-list/api-mer-order-list.component.scss b/src/app/admin/order-manage/api-mer-order-list/api-mer-order-list.component.scss new file mode 100644 index 0000000..363c972 --- /dev/null +++ b/src/app/admin/order-manage/api-mer-order-list/api-mer-order-list.component.scss @@ -0,0 +1,3 @@ +img { + width: 60px; +} diff --git a/src/app/admin/order-manage/api-mer-order-list/api-mer-order-list.component.ts b/src/app/admin/order-manage/api-mer-order-list/api-mer-order-list.component.ts new file mode 100644 index 0000000..cc94abb --- /dev/null +++ b/src/app/admin/order-manage/api-mer-order-list/api-mer-order-list.component.ts @@ -0,0 +1,152 @@ +import { Component, OnInit } from '@angular/core'; +import {FormBuilder, FormGroup} from "@angular/forms"; +import {environment} from "../../../../environments/environment"; +import {LocalStorageService} from "../../../services/local-storage.service"; +import {NzMessageService} from "ng-zorro-antd"; +import {HltOrderService} from "../../../services/order/hlt-order.service"; +import {CompanyService} from "../../../services/company.service"; +import {CommonsService} from "../../../services/commons.service"; +import {ADMIN_INFO_OBJECT} from "../../../services/local-storage.namespace"; +import {animate, state, style, transition, trigger} from "@angular/animations"; +import {OrderApiMerService} from "../../../services/order/order-api-mer.service"; + +@Component({ + selector: 'app-api-mer-order-list', + animations: [ + trigger('openClose', [ + state('open', style({ + height: '260px', + opacity: 1, + backgroundColor: 'white' + })), + state('closed', style({ + opacity: 1, + backgroundColor: 'white' + })), + transition('open => closed', [ + animate('0.3s') + ]), + transition('closed => open', [ + animate('0.3s') + ]), + ]), + ], + templateUrl: './api-mer-order-list.component.html', + styleUrls: ['./api-mer-order-list.component.scss'] +}) +export class ApiMerOrderListComponent implements OnInit { + + + + // 搜索框 + searchForm: FormGroup; + // 搜索框折叠 + isCollapse = false; + // 订单状态数据 + orderStatusArray = []; + // 公司数据 + companyArray = []; + // 角色类型 + roleType: number; + // 列表相关参数 + // 总条数 + total: number; + // 页码 + pageNum = 1; + // 条码 + pageSize = 10; + // 列表数据 + requestData = []; + // 列表加载 + loading = true; + // 订单详情相关参数 + // 详情模态框 + orderDetailModal = false; + // 详情模态框数据等待 + orderDetailModalLoading = false; + // 订单详情数据 + orderDetailObject: any = { + tradeOrder: {}, + }; + // 数据加载中参数 + loadingObject = { + title: '加载中...', + status: false, + }; + // 请求地址参数 + FILE_URL = environment.imageUrl; + mchId: string ; + constructor( + private form: FormBuilder, + private store: LocalStorageService, + private message: NzMessageService, + private apiMerOrderService: OrderApiMerService, + private companyService: CompanyService, + private commonsService: CommonsService, + ) { } + + ngOnInit(): void { + // 搜索表单初始化 + this.searchForm = this.form.group({ + orderNo: [null], + memPhone: [null], + payTimeArray: [null], + orderStatus: [null], + createTimeArray: [null], + refundTimeArray: [null], + companyId: [null], + payType: [null], + memCardNo: [null], + }); + // 角色类型初始化 + this.roleType = Number(this.store.get(ADMIN_INFO_OBJECT)['secRole'].roleType); + this.mchId = this.store.get(ADMIN_INFO_OBJECT)['apiMerchants'].mchId; + // 查询公司列表 + if (this.roleType === 0 || this.roleType === 1) { + this.companyService.selectCompanyList({ pageNum: 1, pageSize: 999 }, data => { + this.companyArray = data['return_data']['list']; + }); + } + // 查询订单状态数据 + this.commonsService.getDictionary('ORDER_STATUS', data => { + this.orderStatusArray = data['return_data']; + }); + this.getRequest(true, this.searchForm.value); + } + + // 查询列表 + public getRequest(reset: boolean = false, whereObject: object) { + this.loading = true; + if (reset) { + this.pageNum = 1; + } + whereObject['promoteCode'] = this.mchId; + whereObject['pageNum'] = this.pageNum; + whereObject['pageSize'] = this.pageSize; + this.apiMerOrderService.getOrderList(whereObject, data => { + this.loading = false; + if (data['return_code'] === '000000') { + this.requestData = data['return_data'].list; + this.total = data['return_data'].total; + } else { + this.message.error(data['return_msg']); + } + }); + } + + // 展示订单详情 + public showOrderDetail(orderNo: string) { + this.orderDetailModal = true; + this.orderDetailModalLoading = true; + this.apiMerOrderService.getOrderDetail(orderNo, data => { + if (data['return_code'] === '000000') { + this.orderDetailObject = data['return_data']; + } else { + this.message.error(data['return_msg']); + } + this.orderDetailModalLoading = false; + }); + + } + +} diff --git a/src/app/admin/order-manage/order-manage-routing.module.ts b/src/app/admin/order-manage/order-manage-routing.module.ts index 75eede6..b1fb09d 100644 --- a/src/app/admin/order-manage/order-manage-routing.module.ts +++ b/src/app/admin/order-manage/order-manage-routing.module.ts @@ -14,6 +14,7 @@ import {MobileRechargeOrderListComponent} from './mobile-recharge-order-list/mob import {HltChargeOrderComponent} from './hlt-charge-order/hlt-charge-order.component'; import {GoodsOrderComponent} from './goods-order/goods-order.component'; import {GoodsChildOrderComponent} from './goods-child-order/goods-child-order.component'; +import {ApiMerOrderListComponent} from "./api-mer-order-list/api-mer-order-list.component"; const routes: Routes = [ @@ -31,6 +32,7 @@ const routes: Routes = [ { path: 'hlt-order-list', component: HltChargeOrderComponent}, { path: 'goods-order', component: GoodsOrderComponent}, { path: 'goods-child-order', component: GoodsChildOrderComponent}, + { path: 'api-mer-order', component: ApiMerOrderListComponent}, ]; @NgModule({ diff --git a/src/app/admin/order-manage/order-manage.module.ts b/src/app/admin/order-manage/order-manage.module.ts index f22e652..d01212e 100644 --- a/src/app/admin/order-manage/order-manage.module.ts +++ b/src/app/admin/order-manage/order-manage.module.ts @@ -24,9 +24,10 @@ import { HltChargeOrderComponent } from './hlt-charge-order/hlt-charge-order.com import { GoodsOrderComponent } from './goods-order/goods-order.component'; import {PreviewImageModule} from "../../common/preview-image/preview-image.module"; import { GoodsChildOrderComponent } from './goods-child-order/goods-child-order.component'; +import { ApiMerOrderListComponent } from './api-mer-order-list/api-mer-order-list.component'; @NgModule({ - declarations: [OrderOilListComponent, OrderCouponListComponent, OrderIntegralRechargeComponent, OrderRefundListComponent, KfcOrderListComponent, StarbucksOrderListComponent, MemberChargeOrderListComponent, MobileRechargeOrderListComponent, PreOrderComponent,DicountPackageOrderListComponent, MemberChargeOrderListComponent, DiscountUseConditionListComponent, HltChargeOrderComponent, GoodsOrderComponent, GoodsChildOrderComponent], + declarations: [OrderOilListComponent, OrderCouponListComponent, OrderIntegralRechargeComponent, OrderRefundListComponent, KfcOrderListComponent, StarbucksOrderListComponent, MemberChargeOrderListComponent, MobileRechargeOrderListComponent, PreOrderComponent,DicountPackageOrderListComponent, MemberChargeOrderListComponent, DiscountUseConditionListComponent, HltChargeOrderComponent, GoodsOrderComponent, GoodsChildOrderComponent, ApiMerOrderListComponent], imports: [ CommonModule, OrderManageRoutingModule, diff --git a/src/app/services/Interceptor.service.ts b/src/app/services/Interceptor.service.ts index 957b29e..7ec7ac8 100644 --- a/src/app/services/Interceptor.service.ts +++ b/src/app/services/Interceptor.service.ts @@ -6,7 +6,6 @@ import {catchError, finalize} from 'rxjs/operators'; import {mergeMap} from 'rxjs/operators'; import {Observable} from 'rxjs'; import {NzMessageService} from 'ng-zorro-antd'; -import {Router} from '@angular/router'; import {LocalStorageService} from './local-storage.service'; import {TOKEN} from './local-storage.namespace'; @@ -14,7 +13,6 @@ import {TOKEN} from './local-storage.namespace'; export class InterceptorService implements HttpInterceptor { constructor( private message: NzMessageService, - private router: Router, private storage: LocalStorageService, ) { } diff --git a/src/app/services/order/order-api-mer.service.ts b/src/app/services/order/order-api-mer.service.ts new file mode 100644 index 0000000..7b2862a --- /dev/null +++ b/src/app/services/order/order-api-mer.service.ts @@ -0,0 +1,43 @@ +import { Injectable } from '@angular/core'; +import {CommonsService} from '../commons.service'; +import {environment} from '../../../environments/environment'; +import {HttpClient} from '@angular/common/http'; + +@Injectable({ + providedIn: 'root' +}) +export class OrderApiMerService { + + constructor( + private http: HttpClient, + private common: CommonsService + ) { } + + /** + * @Author Sum1Dream + * @methodName getOrderKfcList + * @Description // 查询肯德基订单 + * @Date 17:20 2022/10/27 + * @Param param + */ + public getOrderList(param: object, callBack) { + this.http.get(environment.orderUrl + 'apiMerOrder/getOrderList?' + this.common.getWhereCondition(param)).subscribe(data => { + callBack(data); + }); + } + + /** + * @Author Sum1Dream + * @methodName getOrderDetail + * @Description // 根据订单号查询订单详情 + * @Date 14:38 2022/10/28 + * @Param orderNo: string, callBack + */ + public getOrderDetail(orderNo: string, callBack) { + this.http.get(environment.orderUrl + 'apiMerOrder/getOrderDetail?orderNo=' + orderNo).subscribe(data => { + callBack(data); + }); + } + + +} diff --git a/src/favicon.ico b/src/favicon.ico deleted file mode 100644 index ba7c40ebe2db9a4f53030d235d5ff2b4305b903b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7755 zcmaKxWl$Wvx5gJ)WN~+=*y65*#T|+)Ufdmu`xY;<6ezC69g4O%6f0KT-5rV)X}P@b z+?oG}D>KQ-OeV=mCYj7R&o4$(T>%S34gvrGSW1erS}*O;KNSt-#a8RrCQaG_7FfI;#p&z3js~=6yh9 zB>`WRfBhNHV8}Vjs5m-1uY5cu!R+Jye~S(p-flzX8O1dfMksO}RreU62CvB*gQOs~cnGsHa8^1$>JQ9MLgbt6l%@aJUX84hQ6NWw`xj)r9BQvHCL9IORks69Zk*F0;A=eKLdX20WgAUc~$-N4~AEs!A+`ZS621_9K_#& zI{SI%B?!YS9e~cWVGAXe)MRy`yF|e2oqz~)n@>0acr}R#n$sN~Jl-J>QUTuG_q>?so{|SY_k~n~u zJmZi>ks);bg33DG_mWHl%D_Vfyf3n~;8D#kzqIliAlk9)WWXfQp#R~Z16;&3dw*c;=`Zy}D3qSp5m@ECTlMc|}{6F2r|LNYm;7sOs_`Kq(11!I# zGEesT=4io8_SJ`w+Tj0dY%ET2w3)m)_%6C?RLtM1=bLE+$EP66vu~(y5nd{0 z?FQtK(Lmwh7HAuh#7GqTKq170JC??`APHAzXde?)+CWTUt0JPO>-7(W;K1I2O-?AB zyAH;P>yWx!uW6xcc~M(yD{Foi!+OF!fC^Sbv>yc-cg;w7vHk9#IdHqU@_Q@M+Y9-+Efkkb;&RXDxq0HSHF%-+CViG>E_0g^o5w;p4W3}*qHK0x;Nl_1Yn|{ zI3%^w%Ni(U(@l>kD=J44F(R;6;Q6kLYG)~pj`q^{jnWmj`pLBx%9gylD5dr^JbD$p z3F33xiDl)eqUB+-L_9aJH1mocBGNV#jwM1sh>#O7S!gT6I@kY713u#1m{O$j&RYv# zwH4g5)8J!gmTk31WI?Kb)_W59+%euZMxfk`)Mf7puuP-{g(#9E?VB9sShlSHR5?_>8CvK7$QNtG9 z3Dxg#v)Ryl&iN`;8)DSK2(|pf6^^;V;9>WQu!q0UiQCVpgU15_Y^IVR( z3pVX_TvJxwlmIJAsoHOAF9(Mv3P}R8Ut^{Un9a<#0kz~5O20;ExyeUvzH8Z@d%!EI z@w$kxm4tnexhbd-XffQ7(MvC@1#uqs5ntRO$x)s{%Xn4lyBz(7ijX5efS3c43+St8 z5omW?&4(#k9e>`1c}AJ@?`{wh#SU_H8_ysojRBg0$HvUEqF5qAsJ0u3Yiq3(G^?$I zrc1wayXOn-h^i@dp!kut>Px?Wq{V){d(TQmNsZn;AX4f+cx0Di|JC={iyjYRIb@4U&|VVMImZp>-_XYn zhr7vN!CBFh$~~S9>FQcmj2SM5saR)<`l_kd1IK!MKD7I%eCTIEvrb)a8|mkGYckbK zj#qJ=RYx=_P~}!-wAnT-NG)OUxg)?~^JqxO!k%+mfRfcG435Z~70D~{eW-+v&t6Jv z`#WhdZjZ}VE(cSyK-3ps9B*OY>$-UQmaMdRSr)Vii4bQ6P)jY}H3*+57I&wD>akv7J4kSx+$js4(O32IFfdOWuylG)h6<&H|%P5qnLvtImJ>bB7iXTte-K90k z1w2Jt&j+pXgNaM^=R+!@^@$cq)Bb~zSF;Qpl_bAMXUmn03??u~dxT88s0U}Ev__~4 zF5vq|ghhL#XNO>f?9T;4hpWaIhHJ0P8#($u8nJjF*Da!AC5u}anp)_XURwpzH{ zd!_FrGZlx_jtvwj(Mu=NtfMF>1^WMD(4W5m%_!zU(d3jMq8~CMhh{bljpI?@29Z!Z zb>Q_umwc!#tUu3`%w{{aHeE_;Ec&+2Dy#l*n2KqF!3ms4C&?8o-R%&EtUwlG_!^X5 zT2VnEUSHzn+NRyEkTkvVq?Ly%DE;O5s2u_*I&U7ZNZD-y_d`jN9(S+_j%C=MGlC;( zsp{N8`O?Vlg>#YcCms_LQePY-Sy^FO&9 zu4_}~8_2_r4b7aBWm6G$nCssE%z0pD^Kn(*%mK%11{0w(r6y~R5wR}Z+Q?|= zukf2X01Hy11&8shse|S2nLuec#H)XoVHcD^5C8B45euK7J}kOY)#@gQNF^NLp;>-IBQ9 zSi}Sfmb$ItmnX*##7%tjsDpD3`p_n@HW<$nf{DQY$9IN&4@k zZLQj2L;kSzz7p*vSP}QlXD+1yGml^2=_0sZoA#3g>rDP^7*@sgx4%=Oa5e$GT-e%l zdZ9yC14D7&q7u_jA1>)e)4@Z?ZJ#$q*S#!+gj`*xL_H$fG-S3{?FS}@lakesz!;xe zbRi947q>p0i2RR_>%nY^UB2}P;EvMNy@@<7ddpUAqU2EyFjf_2eV)?FM(#C8T7u2g z@4K{7X)l+n&?TP==IYE1&Lg{cz|sJTYkBO`b@4|+kY-A613!>H%Xg>Iv`y;hw3L~T zbsGd8LXHFN$tFmkUm@8|HV+%e_IJA#|cz2jYw$Trhkmp@u)8vpQL!~3TO&DZ&~!89?fq{xXcf?_Ed8d+biD|?EI4{ zz);;%6!+{g)H@|A_4J@LmCD7!qSe(A^7oQjEa?o6u@awdvZ(OO%zwOmT>zUuwWuj4_}ND>JWJO!wv5Q5H4 zf6>2g*@W)Z1uo44~2Ip`E$;M#SkH_!Z#hDx5{zRS~MS~m4z;_{q?ST zHY=2QiSvwrf?6hMAB;N-Dy+f2%}}Z1dUs^cer=Oe6TGk=Kx+k(CWKSHP6(KjjG!Q< zxyo@B>;VrM(SESZ-ykNyCJaw_?9--fkhK%Yr*nlc@Wzwn7prght%C_U|JWk#i*jSq%9~lUzn-9T-G3J{461g7p#L)&TygUQ&eYJfLX*i6Y#p!5IIu{ zhigmb4i0KPh$Ea$*$*1r(#uB)Fxi)Hdrz{{?mq;>+PC169SI$>zTt89V7*duBE5HU z%A4L3TX%vH?Qpcl>pJu@E-VHc;dK8!&a0e~!6<yTK(LuJ0DQ+yIOvXIGKs@Jx?4_J}4-uCGN6-C9xjo<1AGdXv-C zPb}$bUWy#9bJK_M#^ieqZT^oa9sZNbmR6IjMi&b)RGq)ZnDikQkz~F7g}CqFn16DA zRbDnVFVh~Az($z}%YA?RG~}dkpv^j3-A+KV-oJUaUX>R2upprp@rXYU{5>o~|67|L zMaG)`Wg~pydiUhv?Zr&lvAo2Y%ulDy$CpEG%Vzu>QHr+L%CIE!=qd!AEKPLK|im!|CW5yKMW_md18wq<5QB4q{H@5p2%1iUDd~1!Qk6QHNe_BJ_Z?=yL5^ zE=T-)w*UNG!_VaNy4xcRws)+njcE3GRIe=NJ2dxjt0bS;tPz;7(B9K6D|pTFZKG34 zw_Rr_y>f7xN^kp{LXF&@X2<#Y&4745US&xxOp++&JpXhjc)_J7#Z|o;$Iuh1qz_?3 zzG?D_=RET)=U=kkGrX3+Tr+@r3$Z{>wH!rn<-y9Zw#0ab)iqzT zzwSDv(4T!|P?^|)oJ3rwUVn0Ck z-*oOy?p7v%!i6C?m#W`>b?U}b&Mo|rGi0QZ zUL_d(n~)+kvpS@f@n;?vlllptnmR@=K`yXj94)XMTYp#uiK1*(Fm9#8vB#xslbTdO zz!2Tac`j#jQVd`%=Jplkrh?u>H?%0VA4YoA8<5s@AU5w5M#LyTsalhdMA7SgjTe7Z zbv&k`J+VnNs|z2)(!8fXnNE9m-^Nq>vs#0hLY-8~oHXlb?IOpqxf_Jfpo+IrQ)_q>6*TX6MBjNmwsMCT`rFFUHx#%EJGN=wdaC-hwB3oyarI~pheWmPz8 z$>f*$9b?Lxl<=+uxwAqoId5`ggYz9qiV%AOH1Q46+12{4nY1r329Li{)XpW8un1QR z60VfIysI%bsFiSA@p z!5W_RfZID3mpFbx^^JnCnyH);`=BJUOWDqEt+#!J}PjcXS=lK>c1zmz=+;$Q}WjKX6oZKpY@8=Bhb%p zsB6rCBVnV~W}Hs2GUabJM67TRTF3qE`!&Z4R|Nw|I;j-)SF#I=pJ2tI+%u%KPumlB z>tW-gHqk4T^Xn{AQjVzf35)t%GXSh#ift=e%&@)3E9Z8J2eCefV~+g zUsOX_CqWEpbpj_%?<7ykuN|sw@4oRDHGeR0a>L-hNKh!c2;K z<1gtG0f)5ccdPry9sKx~;4^7FB=F(YONv6i?zh^z=9xep%dH*fjgAr)Tv;!AsaVQuIb=<^P2NweW`PsKa?>yu1Z6a zo*%bnE}?MQM_Nf;KT)9h$)mEnOLtFF%_2ejt1iYfMngy$dmkn)`Kx{Ip}CP%YAbmv z*t3`Dn#PRQ$8ZHmAyN3rLX(;{$?rGgp|?ocBZ4j9b^AE0l~7XyoF!*?IP2)*HQ<{GHqd90gF>Ht)@$vAaPJM ztHg`c&@2D0-zd0uGEGl-VY7drkxuT5YBpNpNFy<~OAY2>X91{UtsQcZ`a44ROLk_|;T9l;1#jf`U= zZ7q71@x+6|5m*4<55q{{EN5Zf@e%hL9k|T>9b{?s@FJaw`;88qB?~r`xZUjzfh6o| z@O@NaYMpDS^I5+yO3apNR=Qfs*58XTB?q@N|4oY42M^sNM7X}BrS59-luFE6FX5PD^OzVoW%Td9iV-A9 ztmtX_o*y@aU)@v~EN)I43zp-_A3CF+rj zO0jIG3Q7imhpe$*?d;h^VB5$FxU;k=NbFXU16|&lZ{<|RX(shg2PJUsD!quoX(9rw zVH&16Q-8M2OMCi0EF|$xj?~x5hr6IMm4!2_=CZ2S!HoAb12AqzPK>omw8B{r#=z~q z1LeLH5S<03u2C{hHWOPYt9PE8%rB(~q8;9-r-Wus1r3!9d(M}~u;TE&aFB_uiuMbj z0>!0+|BHruMey&aAUTt2xRpMH9=Ca>XlgRY20pCTForw=SrrYqpz@&QJ@gU-fk_@iyoj)3uWwebqO@*CCD@ z`gJtxtiD5G)2en#z-c%1K|9!YrkBCF`PT2_BnK%n6pjYJ2)V`s4e_%xCgvXMS0-n)-WHF;uyo1M9us{?RJzQ zOzxC_R5=^lza)=yCwGH-|A)cVg+vA_kTR`dDztqo1MzPB!=6ecM^@!@;oAR!PkyUD z;pSUvj2ZD2v;jf?jF+1D+fsuw4DtHsJ4&Pl`Dk#_$eKNdRhb#oiwi0M0`Kud220Wb&}RHXE>D z_hcK;x%)5RbMJxS&!3bi`>kc&yI>~*gtr23P;XdUqa0k9wV z4?Yw=e<6jrn4jW2ya7y+#7raYLM*B;KL2<-?jfRx7X o`7KkQ8d;<{>HkqUJpoTbjfTpzU7iLPFOV3ZB&RN0BW(uzFSz=W - +