From d029f2e1ed738bddde6e370a05a301d8b69382d7 Mon Sep 17 00:00:00 2001 From: xh-pan1 Date: Wed, 31 May 2023 23:56:41 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E4=BC=98=E5=8C=96=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/controller/extend/XsPayController.java | 14 +++++- .../app/pay/xs/service/impl/XsPayServiceImpl.java | 12 ++--- .../service/stock/impl/CrossStockServiceImpl.java | 38 +++++++++++----- .../com/shop/cereshop/app/utils/WechatUtil.java | 3 +- cereshop-app/src/main/resources/application.yml | 13 +++--- .../business/param/product/ProductImport.java | 31 +++++++++++++ .../src/main/resources/application.yml | 12 ++--- .../resources/static/导入商品模板表.xlsx | Bin 11048 -> 11236 bytes .../cereshop/commons/config/CrossStockConfig.java | 49 +++++++++++++++++++++ .../shop/cereshop/commons/config/XspayConfig.java | 7 +++ .../commons/exception/CoBusinessException.java | 5 +++ .../com/shop/cereshop/commons/utils/HttpUtils.java | 2 +- 12 files changed, 154 insertions(+), 32 deletions(-) diff --git a/cereshop-app/src/main/java/com/shop/cereshop/app/controller/extend/XsPayController.java b/cereshop-app/src/main/java/com/shop/cereshop/app/controller/extend/XsPayController.java index 9ffa185..f7fbd0d 100644 --- a/cereshop-app/src/main/java/com/shop/cereshop/app/controller/extend/XsPayController.java +++ b/cereshop-app/src/main/java/com/shop/cereshop/app/controller/extend/XsPayController.java @@ -73,7 +73,7 @@ public class XsPayController { } } - //TODO 如果不是跨境支付应该不调用改接口------pxh + //TODO 如果不是跨境支付应该不调用该接口------pxh if(StringUtils.equals(XspayConfig.DEFUALT_TRADE_TYPE, XsPayEnum.TRADE_TYPE_CROSS_BOARD_PAYMENT.getCode())){ // String payRequestBodyJson = xsPayService.getPayRequestBodyJson(merOrderId, new BigDecimal(Integer.parseInt(content.getString("orderAmount")) * 1.0f / 100), // XsPayEnum.TRADE_TYPE_CROSS_BOARD_PAYMENT.getCode(), content.getString("payType")); @@ -120,6 +120,18 @@ public class XsPayController { return "success"; } + @PostMapping("pay/paystockbaoguan") + public String payStockBaoGuan(@RequestParam(name = "msg") String msg) throws Exception { + try { + String orderNo = msg.split(",")[0]; + String payTransactionNo = msg.split(",")[1]; + crossStockService.ibOrder(orderNo, payTransactionNo); + } catch (Exception e) { + e.printStackTrace(); + } + return "success"; + } + /** * 退款通知回调 * @throws Exception diff --git a/cereshop-app/src/main/java/com/shop/cereshop/app/pay/xs/service/impl/XsPayServiceImpl.java b/cereshop-app/src/main/java/com/shop/cereshop/app/pay/xs/service/impl/XsPayServiceImpl.java index 13c5826..d6edc8c 100644 --- a/cereshop-app/src/main/java/com/shop/cereshop/app/pay/xs/service/impl/XsPayServiceImpl.java +++ b/cereshop-app/src/main/java/com/shop/cereshop/app/pay/xs/service/impl/XsPayServiceImpl.java @@ -86,7 +86,7 @@ public class XsPayServiceImpl implements XsPayService { String responeMsg = new String(Base64.getDecoder().decode(resMsg)); JSONObject jsonObject = JSONObject.parseObject(responeMsg); String payInfoStr = jsonObject.getJSONObject("content").getJSONObject("payInfo").getString("payInfo"); - payInfoStr = payInfoStr.substring(1, payInfoStr.length() - 2); + payInfoStr = payInfoStr.replace("{", "").replace("}", ""); String[] payInfoDetailArray = payInfoStr.split(","); Map resultMap = new HashMap<>(); for (String payInfoDetail : payInfoDetailArray) { @@ -94,8 +94,8 @@ public class XsPayServiceImpl implements XsPayService { int firstIndex = payInfoDetail.indexOf("="); String key = payInfoDetail.substring(0, firstIndex).trim(); String value = payInfoDetail.substring(firstIndex + 1).trim(); - if(StringUtils.equals(key, "signType")){ - value = "MD5"; + if( !StringUtils.isEmpty(XspayConfig.WX_SIGN_TYPE) && StringUtils.equals(key, "signType")){ + value = XspayConfig.WX_SIGN_TYPE; } resultMap.put(key, value); } @@ -285,13 +285,13 @@ public class XsPayServiceImpl implements XsPayService { CereBuyerUser user = cereBuyerUserService.selectByBuyerUserId(orderList.get(0).getBuyerUserId()); if(user == null){ - throw new CoBusinessException("10000","系统出错,请联系管理员"); + throw new CoBusinessException("10000","系统出错,请联系管理员", null); } if(StringUtils.isEmpty(user.getRealName())){ - throw new CoBusinessException("10000","用户需要先设置真实姓名后下单"); + throw new CoBusinessException("10000","用户需要先设置真实姓名后下单", null); } if(StringUtils.isEmpty(user.getIdCard())){ - throw new CoBusinessException("10000","用户需要先设置身份证信息后下单"); + throw new CoBusinessException("10000","用户需要先设置身份证信息后下单", null); } List cereOrderProductList = cereOrderProductDAO.findByOrderIds(orderList.stream().map(CereShopOrder::getOrderId).collect(Collectors.toList())); log.info("cereOrderProductList:" + new Gson().toJson(cereOrderProductList)); diff --git a/cereshop-app/src/main/java/com/shop/cereshop/app/service/stock/impl/CrossStockServiceImpl.java b/cereshop-app/src/main/java/com/shop/cereshop/app/service/stock/impl/CrossStockServiceImpl.java index d251ade..a6d8e36 100644 --- a/cereshop-app/src/main/java/com/shop/cereshop/app/service/stock/impl/CrossStockServiceImpl.java +++ b/cereshop-app/src/main/java/com/shop/cereshop/app/service/stock/impl/CrossStockServiceImpl.java @@ -6,6 +6,7 @@ package com.shop.cereshop.app.service.stock.impl; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.google.gson.Gson; import com.shop.cereshop.app.dao.order.CereOrderProductDAO; import com.shop.cereshop.app.dao.order.CereShopOrderDAO; @@ -21,6 +22,7 @@ import com.shop.cereshop.commons.domain.buyer.CereBuyerUser; import com.shop.cereshop.commons.domain.express.HttpResult; import com.shop.cereshop.commons.domain.order.CereOrderProduct; import com.shop.cereshop.commons.domain.order.CereShopOrder; +import com.shop.cereshop.commons.domain.shop.CereShopCrossDetail; import com.shop.cereshop.commons.exception.CoBusinessException; import com.shop.cereshop.commons.utils.HttpUtils; import com.shop.cereshop.commons.utils.StringUtils; @@ -63,10 +65,10 @@ public class CrossStockServiceImpl implements CrossStockService{ List cereShopOrderList = cereShopOrderDAO.findByFormid(orderFromId); CereShopOrder cereShopOrder = cereShopOrderList.get(0); //商家详细信息 -// CereShopCrossDetail cereShopCrossDetail = cereShopCrossDetailDAO.selectOne(Wrappers.lambdaQuery().eq(CereShopCrossDetail::getShopId, cereShopOrder.getShopId())); -// if(cereShopCrossDetail == null){ -// throw new CoBusinessException("10000","商家未设置跨境信息"); -// } + CereShopCrossDetail cereShopCrossDetail = cereShopCrossDetailDAO.selectOne(Wrappers.lambdaQuery().eq(CereShopCrossDetail::getShopId, cereShopOrder.getShopId())); + if(cereShopCrossDetail == null){ + throw new CoBusinessException("10000","商家未设置跨境信息"); + } log.info("firstOrder:" + new Gson().toJson(cereShopOrder)); @@ -106,11 +108,18 @@ public class CrossStockServiceImpl implements CrossStockService{ // private String consigneeidcard; bo.setConsigneetelephone(cereShopOrder.getReceivePhone()); -// bo.setEbpcode(cereShopCrossDetail.getEbpcode()); -// bo.setEbpname(cereShopCrossDetail.getEbpname()); - bo.setEbpcode("46016601J4"); - bo.setEbpname("得壹(海南)科技有限公司"); + + if(StringUtils.isEmpty(CrossStockConfig.DEFAULT_COMPANY_CODE) && + StringUtils.isEmpty(CrossStockConfig.DEFAULT_COMPANY_NAME)) { + bo.setEbpcode(cereShopCrossDetail.getEbpcode()); + bo.setEbpname(cereShopCrossDetail.getEbpname()); +// bo.setEbpcode("46016601J4"); +// bo.setEbpname("得壹(海南)科技有限公司"); + }else { + bo.setEbpcode(CrossStockConfig.DEFAULT_COMPANY_CODE); + bo.setEbpname(CrossStockConfig.DEFAULT_COMPANY_NAME); + } bo.setDiscount(cereShopOrder.getDiscountPrice()); bo.setFreight(cereShopOrder.getLogisticsPrice()); @@ -125,7 +134,11 @@ public class CrossStockServiceImpl implements CrossStockService{ IbOrderItemRequestBo item = new IbOrderItemRequestBo(); item.setPrice(cereOrderProduct.getProductPrice()); item.setQty(new BigDecimal(cereOrderProduct.getNumber())); - item.setSku(cereOrderProduct.getSKU()); + if(StringUtils.isEmpty(CrossStockConfig.DEFAULT_SKU)){ + item.setSku(cereOrderProduct.getSKU()); + }else { + item.setSku(CrossStockConfig.DEFAULT_SKU); + } items.add(item); taxtotal = taxtotal.add(cereOrderProduct.getProductPrice() @@ -139,8 +152,11 @@ public class CrossStockServiceImpl implements CrossStockService{ bo.setOrderno(cereShopOrder.getOrderFormid()); // - bo.setPaycode("460116287K"); - bo.setPayname("新生支付有限公司"); + + bo.setPaycode(CrossStockConfig.DEFAULT_PAY_COMPANY_CODE); + bo.setPayname(CrossStockConfig.DEFAULT_PAY_COMPANY_NAME); +// bo.setPaycode("460116287K"); +// bo.setPayname("新生支付有限公司"); bo.setPaytransactionid(payTransactionNo); bo.setStoreid("DY"); diff --git a/cereshop-app/src/main/java/com/shop/cereshop/app/utils/WechatUtil.java b/cereshop-app/src/main/java/com/shop/cereshop/app/utils/WechatUtil.java index 34db4e5..f98c6cb 100644 --- a/cereshop-app/src/main/java/com/shop/cereshop/app/utils/WechatUtil.java +++ b/cereshop-app/src/main/java/com/shop/cereshop/app/utils/WechatUtil.java @@ -434,7 +434,8 @@ public class WechatUtil { BufferedImage qrCodeImage = null; BufferedReader reader = null; try { - URL url = new URL("https://api.weixin.qq.com/wxa/getwxacode?access_token=" + accessToken); +// https://api.weixin.qq.com/wxa/getwxacode?access_token= + URL url = new URL("https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=" + accessToken); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setDoOutput(true); diff --git a/cereshop-app/src/main/resources/application.yml b/cereshop-app/src/main/resources/application.yml index 071261d..293c7c5 100644 --- a/cereshop-app/src/main/resources/application.yml +++ b/cereshop-app/src/main/resources/application.yml @@ -78,15 +78,16 @@ pay: xspay: url: https://uwebgate.hnapay.com/webgate/unifiedAPI.htm app_return_url: xx - app_notice_url: http://14.22.116.132:81/ceres-app-api/extend/xsPay/pay/notify - app_baoguan_notice_url: http://14.22.116.132:81/ceres-app-api/extend/xsPay/pay/baoguannotify + app_notice_url: https://wechat.hnthee.com/ceres-app-api/extend/xsPay/pay/notify + app_baoguan_notice_url: https://wechat.hnthee.com/ceres-app-api/extend/xsPay/pay/baoguannotify business_return_url: xx - business_notice_url: http://14.22.116.132:81/ceres-business-api/extend/xsPay/pay/notify - business_return_notice_url: http://14.22.116.132:81/ceres-business-api/extend/xsPay/refund/notify - mer_code: 5001626421847836001 + business_notice_url: https://wechat.hnthee.com/ceres-business-api/extend/xsPay/pay/notify + business_return_notice_url: https://wechat.hnthee.com/ceres-business-api/extend/xsPay/refund/notify + mer_code: 10000000589 sign_type: 1 rsa_private_key: MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIsNcvBCDUYCkEyHcuzYyGL9TOHV0kQWcAUJmQqgIIcn7devK2fCSgZs5N42tVm59m07VyUmYXfXrFzx80qwp0Db3bUrqAZqMDB1YnxjiM+Rrrm0pPAPGvGUR4XunPIEbqidezUe1pZCMavejql+TkouXrtHQhZVJJHOQwhTvO03AgMBAAECgYBaFKRZMPEYYaDJcxXoiaeHOUENLE/C/CYlnUofsAxigmN6Tmh4F02NTA4YRqjFL8uMh9y0nGCYGof2zmcmA7rVPSOaQwqwqmc+lHWq/Jy5Z6cAxlod1UeA+BEF9gc/d6YNJx+1UoywMJgr4o/59K9MCZofFLUPGhxoMTQzTB34wQJBAL49KvP5EktoEbloVrqoMNXalgXmGeETrUGkc29uTegT/K/29FllcY5mlSJhnL/uoW8aMuU2V8h7fv7RoJBX/DUCQQC7HqNbl0tmj4ffBUsggoTyuKQby2bNLqPJ6wHcQB5OAZhP2E4q+KC9MpS3eT0ljC27/6T+y4Qvry+THmiU1jk7AkB4bWJWhZKmN6AYvctBaB1aE4CrBUnWqM0h48fLf4lD4/svLWbrfINRQPEhjadb/OUm3u/fF/KkEEGJcAxzs68NAkAIqCo2mpFKdWl7z+rh3if4csJk5swiwf2h4dV8Mxsz0K8TQpabNlV5a1WmB13k1s9m2zTu9MtwyVISJF4CRMbxAkEAi88aKBXP1TO9AFZwyNE2Z9dVcSk2xruj9yLgfKvpcZF5eGm3/S9wGz9k+753rxe/KMkWfWd0eIK3VK0iYJ9K+Q== - newpay_public_key: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCSsyBgvE + newpay_public_key: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCSsyBgvE+lwHaiGWUTozg++a+1+wy5UulZtE8uFDIu3tyJECxiPUrw2NE5UBkVqgYsSJu0keb3vvv5/xwsU9/wPEdYb/lhzFMlYt5Z+cob/khek7WQtmdoxCV6+AdGpo5tho2BikbYHbvehNjE894GZGVI1y/rGKxXBltqYqwoEwIDAQAB + huaxun: url: https://bg.qdhuaxun.cn/index.php diff --git a/cereshop-business/src/main/java/com/shop/cereshop/business/param/product/ProductImport.java b/cereshop-business/src/main/java/com/shop/cereshop/business/param/product/ProductImport.java index 9e2350a..bc72be6 100644 --- a/cereshop-business/src/main/java/com/shop/cereshop/business/param/product/ProductImport.java +++ b/cereshop-business/src/main/java/com/shop/cereshop/business/param/product/ProductImport.java @@ -7,6 +7,7 @@ package com.shop.cereshop.business.param.product; import com.shop.cereshop.commons.poi.IsNeeded; import com.shop.cereshop.commons.utils.EmptyUtils; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; @@ -42,6 +43,12 @@ public class ProductImport { private String threeClassifyName; /** + * 商品分组名称 + */ + @IsNeeded + private Long shopGroupName; + + /** * 商品名称 */ @IsNeeded @@ -96,6 +103,30 @@ public class ProductImport { private Integer stockNumber; /** + * 税率 + */ + @IsNeeded + private BigDecimal rate; + + /** + * 仓库名称 + */ + @IsNeeded + private String storehouseName; + + /** + * 是否跨境 + */ + @IsNeeded + private String isCross; + + /** + * 国际条码 + */ + @IsNeeded + private String sku; + + /** * 重量 */ @IsNeeded diff --git a/cereshop-business/src/main/resources/application.yml b/cereshop-business/src/main/resources/application.yml index 4cca10e..46100f6 100644 --- a/cereshop-business/src/main/resources/application.yml +++ b/cereshop-business/src/main/resources/application.yml @@ -67,13 +67,13 @@ autoDeliveryTime: 604800000 xspay: url: https://uwebgate.hnapay.com/webgate/unifiedAPI.htm app_return_url: xx - app_notice_url: http://14.22.116.132:81/ceres-app-api/extend/xsPay/pay/notify - app_baoguan_notice_url: http://14.22.116.132:81/ceres-app-api/extend/xsPay/pay/baoguannotify + app_notice_url: https://wechat.hnthee.com/ceres-app-api/extend/xsPay/pay/notify + app_baoguan_notice_url: https://wechat.hnthee.com/ceres-app-api/extend/xsPay/pay/baoguannotify business_return_url: xx - business_notice_url: http://14.22.116.132:81/ceres-business-api/extend/xsPay/pay/notify - business_return_notice_url: http://14.22.116.132:81/ceres-business-api/extend/xsPay/refund/notify - mer_code: 5001626421847836001 + business_notice_url: https://wechat.hnthee.com/ceres-business-api/extend/xsPay/pay/notify + business_return_notice_url: https://wechat.hnthee.com/ceres-business-api/extend/xsPay/refund/notify + mer_code: 10000000589 sign_type: 1 rsa_private_key: MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIsNcvBCDUYCkEyHcuzYyGL9TOHV0kQWcAUJmQqgIIcn7devK2fCSgZs5N42tVm59m07VyUmYXfXrFzx80qwp0Db3bUrqAZqMDB1YnxjiM+Rrrm0pPAPGvGUR4XunPIEbqidezUe1pZCMavejql+TkouXrtHQhZVJJHOQwhTvO03AgMBAAECgYBaFKRZMPEYYaDJcxXoiaeHOUENLE/C/CYlnUofsAxigmN6Tmh4F02NTA4YRqjFL8uMh9y0nGCYGof2zmcmA7rVPSOaQwqwqmc+lHWq/Jy5Z6cAxlod1UeA+BEF9gc/d6YNJx+1UoywMJgr4o/59K9MCZofFLUPGhxoMTQzTB34wQJBAL49KvP5EktoEbloVrqoMNXalgXmGeETrUGkc29uTegT/K/29FllcY5mlSJhnL/uoW8aMuU2V8h7fv7RoJBX/DUCQQC7HqNbl0tmj4ffBUsggoTyuKQby2bNLqPJ6wHcQB5OAZhP2E4q+KC9MpS3eT0ljC27/6T+y4Qvry+THmiU1jk7AkB4bWJWhZKmN6AYvctBaB1aE4CrBUnWqM0h48fLf4lD4/svLWbrfINRQPEhjadb/OUm3u/fF/KkEEGJcAxzs68NAkAIqCo2mpFKdWl7z+rh3if4csJk5swiwf2h4dV8Mxsz0K8TQpabNlV5a1WmB13k1s9m2zTu9MtwyVISJF4CRMbxAkEAi88aKBXP1TO9AFZwyNE2Z9dVcSk2xruj9yLgfKvpcZF5eGm3/S9wGz9k+753rxe/KMkWfWd0eIK3VK0iYJ9K+Q== - newpay_public_key: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCSsyBgvE + newpay_public_key: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCSsyBgvE+lwHaiGWUTozg++a+1+wy5UulZtE8uFDIu3tyJECxiPUrw2NE5UBkVqgYsSJu0keb3vvv5/xwsU9/wPEdYb/lhzFMlYt5Z+cob/khek7WQtmdoxCV6+AdGpo5tho2BikbYHbvehNjE894GZGVI1y/rGKxXBltqYqwoEwIDAQAB diff --git a/cereshop-business/src/main/resources/static/导入商品模板表.xlsx b/cereshop-business/src/main/resources/static/导入商品模板表.xlsx index 79cedbfdc441ba800782c15082183fc7102c9cae..b8c9c5812dcc4936100a70cbb7fee49992d130e7 100644 GIT binary patch delta 6417 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 delta 6303 zcmds*^;2Bivd0IP!6n#0U~rexQKURoO^T+beL41QGxshYSD^0ssJO7b|Ty z7l=Ezm5ZAVmyeTUK%$OX7Y|7o9PLqVz(1odBLnD!&gSn%E3ES#IPlugX*|K&>ue^& z^K}-BtXZeX)ld`j&HIwwZIp^~%GbI4bS%i6l*T(X(pu#T?_NMpk==EpRd=L(;=f@*E$(GMO2#zd^^u$M~Z|}-+pO28`9orM)s|>&7m6Im^X-kt-;;6 z6vz^=feRmEI$`JJ$A#kY&PN8oZoZ@uOTOrdfsfXoVp!=aMI@VUeFXvfIViRswof{sw zjWj&&Yomc=Crg{4_(wDCB@!IZzb?2VV%p>2O)SSUSYjc$LFm3`R;M|)5QEU-J<@Nw z7?EDH%p&IiA}eCplIUW%Pcw0SKxHV@u_CpOAL)hcVRh>JD#}wL@TtYrtEARD-@< zt;*ko^BQ117-e&T2cbm7dvbUHgpr>abbO^VCb44!2!y;6aky=qDt}pcW>(X2owLA%fOWc4K4x0VkZk$ z9i{PU=VlT+WK`ueHk-jh;3dW)_2~;f22Njv9e_DuA#c%2hESJ~RT5>ZpECKJE}d02 zp2U8Gxco#U_o|1$dHdbv{YG^}A$TW*Cwn~aO1bFD{(OV%LuRyp6SP>5?v3)ss0sV$ zix1L@4(S9tXEDV*wd-IyY_lG=gtT01i%g;`# z83{iTqTLL6W)6fLShy0vWfMTtuh!2vdZMyeZy+Vf=0r*%YVCS~-LQ^g1M>|Ph_10M z(NrX5w`yb~+?qRB82X`Sv4_JT{%wCB@(sUHcWyqH1d)fxx!D>*V;-eNrZv`%D@TG};n112ATb~Kjue0AS>xKh8Oqih zdpl>8(HI8ZljJy7E9r%BE*9WDOA7v4>&i0QK{u)>Lg(n+iC^PM(Ic4N_UU)NIUAWa`0QvZdX#?N_x$* zNMLj+%jWrn4NAApMH$j+zn>GG_HSK-{cXPqz%0;&Rcd`+FVIQwu`~cj>1qN!lK#FC zX_ZCF4jLppo+BU)Iwk_?wX>23(wQjp}w25OUA@s$m)*zm=f z-F^kqh`$M`M(l$`?blL?jDzGC!u?P$4{yT6~@la&u(T;vH+GH;uQTwL_Q5q>8tGgA9Qv@Et5G6LTp`KOGj zenFtm@{LQR?ySp>asm<8cW~|{sRzp(1Uz%giNEi`H*zxzaSs!LUhnil5%0%E=1WlA zpkAR7h=JUN8Tks!ZED4oQ9sV--@u(qkHfXAY1N$yTXF1-`_Eh)t~YZbqxJ9KT`+Ey z`2-Uioh|8pAJA6hV{=}6o?E_Lu>}sV1Wr`Qaj(f@5wQo5)>&_bE5NA+D|5$w{Ifc* zzrQSOeyYrNC;$LC0Orh23ERRVKq`h^W0gUda&}&nU6NN7RVdQGwcFyFv3!WvdYKc9 zc)>ycU;!Z`+|O@n8~>P{w5UKZ3bY0FIeO5QAJl$?A$|RZHu@Gb^ewx}X_>MRWJ^Jx zpH0)X*>5wC^QMF}zGo8g8Q@mBjVhb z!bIh(jAq*{b#&g@0;7X66X+M*Q`+XI0_OH`$URQk9_zPl8!t~i5sHr=v-X$E&$DWR z?cS}K`+EIK%h4)K9WB}=we>F)j%M6jQyA5{&Qjm8 z?j;%zF|bce0O+T6r&X{2`RO`1od3DmW2hq^oX16Cz+Syy_6gr32uv91(egUB?;YHFtpvf)%mS+XoTpvTnI07dZypwHgDGFg-^MA z<&s7vpihCy*)ZWIK4V|nH!a=P{%}$0gd1Yj*X;YwI2f62K}JpjCj{|b)?!q$&hP8b z;+Y21>%zU8HUogm!-vk?Ba^QqL6{erA!Zx~*lo!NW%DM7RkoKQ!Q+?V&ZAK6*z2TD z$s0`!uHCZEI)OI4MmLk2O|5XV<6c8^$+z6!*bLh}H&jpRPs7&>o;wZSBn-GzLG=*x z4W!=*Zo;xgi?ccmD%t)FPmTW6^NY1>J6#rxK3h|}H^n@;y||G{F3!UG5L4IZdJ1$u zC+nPET-x>Hauh z^E!eP3fQ*_Vf4TczR#;|_N!GzWZ7@MR;-w7h95-1VDa zewA5kn1O}bG=E-}2ZJ&NY*@3u(T^C@P^G7FMhHE*?$f!Z9S3WUEQuQQ3-Uzrr#42| zeKB7epSXWuQ)&9TcN%)c8SZothrsS#XSXKB3do*_r(CV*Es@FUt{U4h-wFwiE+2N* zP|}VF#*n)QMvKPyD^P2Y?U4*t)OR}DVQKeYKG?5hL&et%9 z;--d|E^oWO$BdJGhW32d#xByU*Ptx%V6vLD7c3ko#mg5TuE*O79DW*?V@*JJhcW4k0_N|e^$_fXFiZow|Fi$ablP~14nH?Rxmg= z{2X~Dhl{r}l3F#=S)7|IIZm^jd|eQC7U)yg@_EE7`+ zZoisQERK1N+pi@@m+zpvjss&ZM@f^wHw^>Ro>WV(9Dm%DiWMbinHm)u+Fjg@RAXI! z@w~({T|V-9hu;l{N8T@|ES*khdYD-m{zRhDBSxk15n@_=bd9^~PPBV7NxWS8+X z>V;s(fXRN9uu&DmV@8l^a?=1!`s3`hWsG)j7cs<7UC=xb&7ZRr)DrZPA8w({Ww0u9LVv832~oSZujisNQVJw3AOm?nsyenP zOxO8*DWHC)M9M%?3(Y(tF$AfHcE7?W!>ab|}13EncRCZHMpu=Vupamy0 zrr*!ll<7mtkUrsgAsBr?s1l4R(QVHjg8ofe=U03*OUt=CMBuqTF!Q&H8a=sMf~sA) zUOkU}p<lG9Ensl6N zr3p=x&m=J@J4I!%cj9C3XJ+J0ScXVu$tx$3M%|00&5xluA1=f(>9|+6sXjYKh|R|; zQJri654zZu7Nec}<)~GvNr`rBiBaq7aBc7ur9Zh_-GzzRI{zipKH!g8{*ZUjL5~*G0;zcW>dom9bAjy3>d5%Z|L|FftZr_S62@-Owl?jMvjS5eqh#Sv+IY=T}M z_go9PMvtE0rzF*{luNY(Jo=!IP+GSXE^i2(-=z1m&%c>U%(Ep#11?tlVHD+H&%&y> z$BUU-*p(Fw?AhUjRTo7bETU*EsMP+qQ#3rXrs_MV4)NTkzS4ReQ;}o-L8HzN&c_IV(pQFh zl?%}u@sN+-a$E_I&6wP7w+u_-EeR7vc@&c)W2D-|5EE--AKTCdFRbNgx)qnxdlH*y~tm9b_GnjLe5;680YmEZ!S`Lp?p z&MU^}^j$?Wj2EFww%nbi{LbzLgTvkkXszmlYeoxkjHQwN?Ugyz5@K)g;W{Ct9fMuI z_sjP3Nk~CN0#O0fhV-YnUZ)K9L^@GBx2@o>LkPJ&#B1Fur6;Rfh34!ebSmAOC=6#Zd4#d z0BnoPS`oF8Qcfu1p!`ysNYiwhc0LqR*aRcTGo-Ki&f&D)4QZrI{Ax4T|2`aB?k*Qi zYhrY5_2duD^%S(a`D-5W!bd5`()$bVodWdH!_kJOX ztDro7&T|o(%sDvF+iUSJZr5QyoD_^n(qAe~@%9oLRCKrXo~aOA9YQfuC9$URw5xro9zgD!}-uo3Yyd<4EeL&@gXwZLr6 z6*RxkjhoLC`2!Df_xMjG;)IjC!tq4pP+{!PLC}}4UBmbUxUAY8#o+TPhC5Ct9O(YgAFBc=KD|@ea!0Gi83R94cnffuSiahToW9KlF_niTW zl?YVYK>=iyRFgUT#u%iP&maFm7d`5eFO$tgtGZOJ3CD;vVNQoi=(@+p*ihL$$8<7z zCV~{Ve2^8`L7kQv`?ve{m_Ua@b%#P09hGob-wtFBtzci!QkZ-s@0ene`rUe-3B#7H z;aOLUcV}M23S5=O%X|3wi*g^l0-@bUP%`tPzO?*jmw(>5HTSmCeJZ6!MB&V0DwsXHRbLZDF*o5Zq z^I;|Sd3;goTiik$w`jBCsqva_H;7SZ?^y6U*&yQ=9q9*Ebhj z+DJuFdL}AZ;$YOS%qRBPR>JDl>D)SaqwfK;8+UEFZaMk&v#h>Ct0r5Y#r9ZooR%K2iFXh-@=T4O+VtaKdgo<5t z3fxMvs*>QJ==5Xe7rt$^zo