From 8205238697bf9312d0d36771872e1f168768a059 Mon Sep 17 00:00:00 2001 From: lijia Date: Wed, 6 Mar 2024 10:19:12 +0800 Subject: [PATCH] =?UTF-8?q?tab=E8=BF=90=E5=8D=95=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 4 + app/src/main/AndroidManifest.xml | 1 + .../dahe/gldriver/adapter/WaybillAdapter.kt | 39 ++- .../gldriver/adapter/WaybillListAdapter.kt | 46 ++- .../gldriver/adapter/WaybillNodeAdapter.kt | 44 +++ .../java/com/dahe/gldriver/base/AppConfig.kt | 3 + .../java/com/dahe/gldriver/bean/OrderBean.kt | 61 ++-- .../com/dahe/gldriver/bean/OrderDetailBean.kt | 96 ++++++ .../java/com/dahe/gldriver/bean/UpPicBean.kt | 35 ++ .../gldriver/callback/OnSearchListener.kt | 14 + .../com/dahe/gldriver/event/OrderStauEvent.kt | 16 + .../main/java/com/dahe/gldriver/net/Api.kt | 41 +++ .../java/com/dahe/gldriver/ui/HomeActivity.kt | 48 ++- .../com/dahe/gldriver/ui/home/HomeFragment.kt | 126 +++++-- .../gldriver/ui/waybill/WaybillFragment.kt | 46 ++- .../waybill/activity/WaybillDetailActivity.kt | 206 +++++++++++- .../waybill/activity/WaybillLoadActivity.kt | 106 +++++- .../activity/WaybillUnlLoadActivity.kt | 104 +++++- .../waybill/activity/WaybillUpPicActivity.kt | 218 +++++++++--- .../ui/waybill/fragment/AllWaybillFragment.kt | 110 +++++- .../waybill/fragment/CancelWaybillFragment.kt | 113 +++++++ .../waybill/fragment/WaitAppraiseFragment.kt | 113 +++++++ .../ui/waybill/fragment/WaitLoadFragment.kt | 113 +++++++ .../ui/waybill/fragment/WaitUnLoadFragment.kt | 116 +++++++ .../com/dahe/gldriver/utils/CommonPopUtils.kt | 17 + .../dahe/gldriver/utils/GDLocationUtils.kt | 70 ++++ .../com/dahe/gldriver/utils/LocationUtils.kt | 67 ++++ .../com/dahe/gldriver/utils/OrderUtils.kt | 67 ++++ app/src/main/res/drawable-xxhdpi/cancel.png | Bin 0 -> 739 bytes .../res/drawable-xxhdpi/empty_content.png | Bin 0 -> 53870 bytes .../main/res/drawable-xxhdpi/icon_wabill.png | Bin 0 -> 1780 bytes app/src/main/res/drawable/shape_orange_2.xml | 8 + app/src/main/res/drawable/shape_orange_4.xml | 8 + app/src/main/res/drawable/shape_white_8.xml | 8 + .../res/layout/activity_waybill_detail.xml | 171 ++++++---- .../main/res/layout/activity_waybill_load.xml | 130 +++---- .../res/layout/activity_waybill_unload.xml | 69 +--- .../res/layout/activity_waybill_uppic.xml | 19 +- app/src/main/res/layout/empty_view.xml | 16 + app/src/main/res/layout/fragment_home.xml | 316 +++++++++--------- app/src/main/res/layout/fragment_waybill.xml | 14 + .../main/res/layout/fragment_waybill_list.xml | 6 +- app/src/main/res/layout/item_waybill.xml | 62 ++-- app/src/main/res/layout/item_waybill2.xml | 244 ++++++++++++++ app/src/main/res/layout/item_waybill_node.xml | 42 +++ mylibrary/build.gradle | 2 + .../com/dahe/mylibrary/base/BaseActivity.java | 13 + .../com/dahe/mylibrary/base/BaseFragment.java | 10 + .../com/dahe/mylibrary/pop/PopBottomPic.kt | 2 +- 49 files changed, 2636 insertions(+), 544 deletions(-) create mode 100644 app/src/main/java/com/dahe/gldriver/adapter/WaybillNodeAdapter.kt create mode 100644 app/src/main/java/com/dahe/gldriver/bean/OrderDetailBean.kt create mode 100644 app/src/main/java/com/dahe/gldriver/bean/UpPicBean.kt create mode 100644 app/src/main/java/com/dahe/gldriver/callback/OnSearchListener.kt create mode 100644 app/src/main/java/com/dahe/gldriver/event/OrderStauEvent.kt create mode 100644 app/src/main/java/com/dahe/gldriver/ui/waybill/fragment/CancelWaybillFragment.kt create mode 100644 app/src/main/java/com/dahe/gldriver/ui/waybill/fragment/WaitAppraiseFragment.kt create mode 100644 app/src/main/java/com/dahe/gldriver/ui/waybill/fragment/WaitLoadFragment.kt create mode 100644 app/src/main/java/com/dahe/gldriver/ui/waybill/fragment/WaitUnLoadFragment.kt create mode 100644 app/src/main/java/com/dahe/gldriver/utils/CommonPopUtils.kt create mode 100644 app/src/main/java/com/dahe/gldriver/utils/GDLocationUtils.kt create mode 100644 app/src/main/java/com/dahe/gldriver/utils/LocationUtils.kt create mode 100644 app/src/main/java/com/dahe/gldriver/utils/OrderUtils.kt create mode 100644 app/src/main/res/drawable-xxhdpi/cancel.png create mode 100644 app/src/main/res/drawable-xxhdpi/empty_content.png create mode 100644 app/src/main/res/drawable-xxhdpi/icon_wabill.png create mode 100644 app/src/main/res/drawable/shape_orange_2.xml create mode 100644 app/src/main/res/drawable/shape_orange_4.xml create mode 100644 app/src/main/res/drawable/shape_white_8.xml create mode 100644 app/src/main/res/layout/empty_view.xml create mode 100644 app/src/main/res/layout/item_waybill2.xml create mode 100644 app/src/main/res/layout/item_waybill_node.xml diff --git a/app/build.gradle b/app/build.gradle index ec713e1..a0fb45b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -138,4 +138,8 @@ dependencies { //高德地图 implementation 'com.amap.api:map2d:6.0.0' + + //定位功能 + implementation 'com.amap.api:location:6.4.2'//6.4.2 + implementation 'com.amap.api:search:9.7.0' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7a1f69e..4c9afde 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -25,6 +25,7 @@ + diff --git a/app/src/main/java/com/dahe/gldriver/adapter/WaybillAdapter.kt b/app/src/main/java/com/dahe/gldriver/adapter/WaybillAdapter.kt index 4926496..39017a2 100644 --- a/app/src/main/java/com/dahe/gldriver/adapter/WaybillAdapter.kt +++ b/app/src/main/java/com/dahe/gldriver/adapter/WaybillAdapter.kt @@ -3,10 +3,14 @@ package com.dahe.gldriver.adapter import android.content.Context import android.view.ViewGroup import android.widget.Button +import android.widget.ImageView import com.chad.library.adapter4.BaseQuickAdapter import com.chad.library.adapter4.viewholder.QuickViewHolder import com.dahe.gldriver.R +import com.dahe.gldriver.utils.OrderUtils +import com.dahe.glex.bean.OrderBean import com.dahe.glex.bean.WayBillBean +import com.dahe.mylibrary.utils.ImageLoader /** * @ClassName WaybillAdapter @@ -15,8 +19,39 @@ import com.dahe.glex.bean.WayBillBean * @Description TODO */ class WaybillAdapter : - BaseQuickAdapter() { - override fun onBindViewHolder(holder: QuickViewHolder, position: Int, item: WayBillBean?) { + BaseQuickAdapter() { + override fun onBindViewHolder(holder: QuickViewHolder, position: Int, item: OrderBean?) { + item?.run { + holder.run { + setText( + R.id.tvStart, + """${ + if (loadingCity.length > 1) loadingCity.substring(0, 2) else loadingCity + } ${if (loadingArea.length > 1) loadingArea.substring(0, 2) else loadingArea}""" + ) + setText( + R.id.tvEnd, """${ + if (receiverCity.length > 1) receiverCity.substring(0, 2) else receiverCity + } ${ + if (receiverArea.length > 1) receiverArea.substring(0, 2) else receiverArea + }""" + ) + setText(R.id.tvMoney, driverFreight) + setText(R.id.tvCom, realCompanyName) + setText(R.id.tvDis, """距离:${distance}KM""") + setText(R.id.tvCredit, """信用 ${shipperCreditRating}""") + setText( + R.id.tvRate, + """交易 ${shipperTransactionVolume} 好评率 ${shipperPositiveReviewRate}""" + ) + setText(R.id.tvProduct, """${vehicleLength}/${vehicleType}/""") + setText(R.id.tvModel, """${if (orderType == "0") "一装一卸" else "一装多卸"}""") + setText(R.id.btnOk, OrderUtils.getInstance().getOrderStatu(orderStatus)) + + ImageLoader.getInstance() + .loadRoundImage(context, avatar, 6, getView(R.id.imgHead)) + } + } } diff --git a/app/src/main/java/com/dahe/gldriver/adapter/WaybillListAdapter.kt b/app/src/main/java/com/dahe/gldriver/adapter/WaybillListAdapter.kt index 1c720f3..b39c93c 100644 --- a/app/src/main/java/com/dahe/gldriver/adapter/WaybillListAdapter.kt +++ b/app/src/main/java/com/dahe/gldriver/adapter/WaybillListAdapter.kt @@ -2,10 +2,13 @@ package com.dahe.gldriver.adapter import android.content.Context import android.view.ViewGroup +import android.widget.ImageView import com.chad.library.adapter4.BaseQuickAdapter import com.chad.library.adapter4.viewholder.QuickViewHolder import com.dahe.gldriver.R -import com.dahe.glex.bean.WayBillBean +import com.dahe.gldriver.utils.OrderUtils +import com.dahe.glex.bean.OrderBean +import com.dahe.mylibrary.utils.ImageLoader /** * @ClassName WaybillAdapter @@ -13,9 +16,42 @@ import com.dahe.glex.bean.WayBillBean * @Date 2024/1/23 16:27 * @Description TODO */ -class WaybillListAdapter() : - BaseQuickAdapter() { - override fun onBindViewHolder(holder: QuickViewHolder, position: Int, item: WayBillBean?) { +class WaybillListAdapter : + BaseQuickAdapter() { + override fun onBindViewHolder(holder: QuickViewHolder, position: Int, item: OrderBean?) { + item?.let { + holder.run { + setText(R.id.tvWaybillId,it.orderNum) + setText(R.id.tvStatu,OrderUtils.getInstance().getOrderStatu(it.orderStatus)) + setText(R.id.tvType,"""${if (it.orderType == "0") "一装一卸" else "一装多卸"}""") + setText(R.id.tvTime,"""${it.loadingDeadline}装货""") + setText(R.id.tvDis,"""${it.distance}km""") + setText(R.id.tvCarNum,it.vehicleNum) + setText(R.id.tvGood,"""${it.goodItemGrossWeight}吨/${it.goodName}""") + setText(R.id.tvMoney,it.driverFreight) + setText(R.id.tvComName,it.realCompanyName) + setText(R.id.btnOk,OrderUtils.getInstance().getNextByStatu(it.orderStatus)) + + + ImageLoader.getInstance() + .loadRoundImage(context, it.avatar, 6, getView(R.id.ivHead)) + + setText( + R.id.tvStart, + """${ + if (it.loadingCity.length > 1) it.loadingCity.substring(0, 2) else it.loadingCity + } ${if (it.loadingArea.length > 1) it.loadingArea.substring(0, 2) else it.loadingArea}""" + ) + setText( + R.id.tvEnd, """${ + if (it.receiverCity.length > 1) it.receiverCity.substring(0, 2) else it.receiverCity + } ${ + if (it.receiverArea.length > 1) it.receiverArea.substring(0, 2) else it.receiverArea + }""" + ) + } + } + } override fun onCreateViewHolder( @@ -24,7 +60,7 @@ class WaybillListAdapter() : viewType: Int ): QuickViewHolder { // 返回一个 ViewHolder - return QuickViewHolder(R.layout.item_waybill, parent) + return QuickViewHolder(R.layout.item_waybill2, parent) } } \ No newline at end of file diff --git a/app/src/main/java/com/dahe/gldriver/adapter/WaybillNodeAdapter.kt b/app/src/main/java/com/dahe/gldriver/adapter/WaybillNodeAdapter.kt new file mode 100644 index 0000000..d9bb06a --- /dev/null +++ b/app/src/main/java/com/dahe/gldriver/adapter/WaybillNodeAdapter.kt @@ -0,0 +1,44 @@ +package com.dahe.gldriver.adapter + +import android.content.Context +import android.view.ViewGroup +import android.widget.Button +import android.widget.ImageView +import com.chad.library.adapter4.BaseQuickAdapter +import com.chad.library.adapter4.viewholder.QuickViewHolder +import com.dahe.gldriver.R +import com.dahe.gldriver.bean.OrderChild +import com.dahe.gldriver.utils.OrderUtils +import com.dahe.glex.bean.OrderBean +import com.dahe.glex.bean.WayBillBean +import com.dahe.mylibrary.utils.ImageLoader + +/** + * @ClassName WaybillAdapter + * @Author 用户 + * @Date 2024/3/5 16:27 + * @Description TODO + */ +class WaybillNodeAdapter : + BaseQuickAdapter() { + override fun onBindViewHolder(holder: QuickViewHolder, position: Int, item: OrderChild?) { + item?.run { + holder.run { + setText(R.id.tvLoad, item?.city+item?.area+item?.address) + setText(R.id.tvPhone, """${item?.name} ${item?.phone}""") + setBackgroundResource(R.id.ivLoad,if (item.type == "1") R.drawable.icon_load else R.drawable.icon_unload) + + } + } + + } + + override fun onCreateViewHolder( + context: Context, + parent: ViewGroup, + viewType: Int + ): QuickViewHolder { + // 返回一个 ViewHolder + return QuickViewHolder(R.layout.item_waybill_node, parent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/dahe/gldriver/base/AppConfig.kt b/app/src/main/java/com/dahe/gldriver/base/AppConfig.kt index d1dc32b..68a4e20 100644 --- a/app/src/main/java/com/dahe/gldriver/base/AppConfig.kt +++ b/app/src/main/java/com/dahe/gldriver/base/AppConfig.kt @@ -11,6 +11,9 @@ object AppConfig { const val TIME = "DA_HE_TIME" const val ID = "DA_HE_ID" const val PHONE = "DA_HE_PHONE" + const val ORDER_ID = "DA_HE_ORDER_ID" + const val WAYBILL_ID = "DA_HE_WAYBILL_ID" + const val CHILDRE_ID = "DA_HE_CHILDRE_ID" const val CODE = "DA_HE_PHONE" const val SUCCESS_TYPE = "DA_HE_SUCCESS_TYPE" diff --git a/app/src/main/java/com/dahe/gldriver/bean/OrderBean.kt b/app/src/main/java/com/dahe/gldriver/bean/OrderBean.kt index cd9342f..db78075 100644 --- a/app/src/main/java/com/dahe/gldriver/bean/OrderBean.kt +++ b/app/src/main/java/com/dahe/gldriver/bean/OrderBean.kt @@ -7,35 +7,38 @@ package com.dahe.glex.bean * @Description TODO */ data class OrderBean( - val avatar: String, - val distance: String, - val driverFreight: Double, - val goodsList: List, - val loadingArea: String, - val loadingAreaCode: String, - val loadingCity: String, - val loadingCityCode: String, - val loadingDeadline: String, - val loadingProvince: String, - val loadingProvinceCode: String, - val orderId: String, - val orderNum: String, - val orderStatus: Int, - val orderType: String, - val passingPointsNum: String, - val realCompanyName: String, - val receiverArea: String, - val receiverAreaCode: String, - val receiverCity: String, - val receiverCityCode: String, - val receiverProvince: String, - val receiverProvinceCode: String, - val requirement: String, - val shipperCreditRating: String, - val shipperPositiveReviewRate: String, - val shipperTransactionVolume: String, - val vehicleLength: String, - val vehicleType: String + val avatar: String= "", + val distance: String= "", + val driverFreight: String= "", + val goodsList: List = mutableListOf(), + val loadingArea: String= "", + val loadingAreaCode: String= "", + val loadingCity: String= "", + val loadingCityCode: String= "", + val loadingDeadline: String= "", + val loadingProvince: String= "", + val loadingProvinceCode: String= "", + val orderId: String= "", + val orderNum: String= "", + val orderStatus: String= "", + val orderType: String= "", + val passingPointsNum: String= "", + val realCompanyName: String= "", + val receiverArea: String= "", + val receiverAreaCode: String= "", + val receiverCity: String= "", + val receiverCityCode: String= "", + val receiverProvince: String= "", + val receiverProvinceCode: String= "", + val requirement: String= "", + val shipperCreditRating: String= "", + val shipperPositiveReviewRate: String= "", + val shipperTransactionVolume: String= "", + val vehicleLength: String= "", + val vehicleType: String = "", + val goodItemGrossWeight: String = "", + val goodName: String = "", + val vehicleNum: String = "" ) data class Goods( diff --git a/app/src/main/java/com/dahe/gldriver/bean/OrderDetailBean.kt b/app/src/main/java/com/dahe/gldriver/bean/OrderDetailBean.kt new file mode 100644 index 0000000..32aa9f1 --- /dev/null +++ b/app/src/main/java/com/dahe/gldriver/bean/OrderDetailBean.kt @@ -0,0 +1,96 @@ +package com.dahe.gldriver.bean + +/** + * @ClassName OrderDetailBean + * @Author john + * @Date 2024/3/4 10:36 + * @Description TODO + */ +data class OrderDetailBean( + val avatar: String, + val captainInfo: CaptainInfo, + val distance: String, + val driverFreight: String, + val goodsList: List, + val loadingDeadline: String, + val orderChildList: List, + val orderId: String, + val orderNum: String, + val orderStatus: String, + val orderType: String, + val passingPoStringsNum: String, + val realCompanyName: String, + val receiverBusinessCode: String, + val receiverBusinessName: String, + val receiverDeadline: String, + val requirement: String, + val shipperContactName: String, + val shipperContactPhone: String, + val vehicleLength: String, + val vehicleType: String, + val waybillId: String, + val waybillInfo: WaybillInfo +) + +data class CaptainInfo( + val avatar: String, + val captainId: String, + val captainName: String, + val captaStringype: String, + val contactName: String, + val contactPhone: String, + val status: String +) + +data class Goods( + val goodCube: String, + val goodItemGrossWeight: String, + val goodName: String, + val goodNum: String, + val orderGoodsId: String +) + +data class OrderChild( + val address: String, + val area: String, + val areaCode: String, + val businessCode: String, + val businessName: String, + val city: String, + val cityCode: String, + val cost: String, + val displayOrder: String, + val isPassingPoStrings: String, + val latitude: String, + val longitude: String, + val name: String, + val orderChildreId: String, + val orderId: String, + val phone: String, + val province: String, + val provinceCityArea: String, + val provinceCode: String, + val sortValue: String, + val status: String, + val totalAmount: String, + val type: String +) + +data class WaybillInfo( + val captainId: String, + val carId: String, + val carUrl: String, + val contactName: String, + val contactPhone: String, + val driverId: String, + val idcardName: String, + val idcardSex: String, + val isRealName: String, + val loadTime: String, + val receivingOrderTime: String, + val trailerId: String, + val trailerVehicleNum: String, + val unloadTime: String, + val vehicleNum: String, + val waybillId: String +) \ No newline at end of file diff --git a/app/src/main/java/com/dahe/gldriver/bean/UpPicBean.kt b/app/src/main/java/com/dahe/gldriver/bean/UpPicBean.kt new file mode 100644 index 0000000..8cba551 --- /dev/null +++ b/app/src/main/java/com/dahe/gldriver/bean/UpPicBean.kt @@ -0,0 +1,35 @@ +package com.dahe.gldriver.bean + +/** + * @ClassName UpPicBean + * @Author john + * @Date 2024/3/4 16:25 + * @Description TODO + */ +data class UpPicBean( + var address: String = "", + var area: String= "", + var areaCode: String= "", + var city: String= "", + var cityCode: String= "", + var latitude: String= "", + var longitude: String= "", + var orderChildreId: String= "", + var orderId: String= "", + var province: String= "", + var provinceCityArea: String= "", + var provinceCode: String= "", + var type: String= "", + var waybillId: String= "", + var waybillPhotoList: MutableList = mutableListOf() +) + +data class WaybillPhoto( + var latitude: String= "", + var location: String= "", + var longitude: String= "", + var photoUrl: String= "", + var receiptType: String= "", + var sortvarue: String= "", + var type: String= "" +) \ No newline at end of file diff --git a/app/src/main/java/com/dahe/gldriver/callback/OnSearchListener.kt b/app/src/main/java/com/dahe/gldriver/callback/OnSearchListener.kt new file mode 100644 index 0000000..317f74c --- /dev/null +++ b/app/src/main/java/com/dahe/gldriver/callback/OnSearchListener.kt @@ -0,0 +1,14 @@ +package com.dahe.gldriver.callback + +import com.dahe.gldriver.bean.OcrPersonBean +import com.luck.picture.lib.entity.LocalMedia + +/** + * @ClassName OnOcrPicResultListener + * @Author john + * @Date 2024/2/28 17:18 + * @Description TODO + */ +fun interface OnSearchListener { + fun onSearchClick(search: String) +} diff --git a/app/src/main/java/com/dahe/gldriver/event/OrderStauEvent.kt b/app/src/main/java/com/dahe/gldriver/event/OrderStauEvent.kt new file mode 100644 index 0000000..84b0847 --- /dev/null +++ b/app/src/main/java/com/dahe/gldriver/event/OrderStauEvent.kt @@ -0,0 +1,16 @@ +package com.dahe.gldriver.event + +/** + * @ClassName OrderStauEvent + * @Author john + * @Date 2024/3/5 15:51 + * @Description statu: 1 刷新 + */ +class OrderStauEvent constructor(statu: Int) { + + var statu: Int = 0 + + init { + this.statu = statu + } +} \ No newline at end of file diff --git a/app/src/main/java/com/dahe/gldriver/net/Api.kt b/app/src/main/java/com/dahe/gldriver/net/Api.kt index d77081c..72f7351 100644 --- a/app/src/main/java/com/dahe/gldriver/net/Api.kt +++ b/app/src/main/java/com/dahe/gldriver/net/Api.kt @@ -1,11 +1,14 @@ package com.dahe.gldriver.net + import com.dahe.gldriver.BuildConfig import com.dahe.gldriver.bean.AuthTeamBean import com.dahe.gldriver.bean.OcrPersonBean +import com.dahe.gldriver.bean.OrderDetailBean import com.dahe.gldriver.bean.OssBean import com.dahe.gldriver.bean.UpBankInfoBean import com.dahe.gldriver.bean.UpDriverInfoBean import com.dahe.gldriver.bean.UpPersonInfoBean +import com.dahe.gldriver.bean.UpPicBean import com.dahe.gldriver.bean.UpQualiInfoBean import com.dahe.glex.bean.* import com.dahe.mylibrary.net.CommonResponseBean @@ -128,9 +131,47 @@ interface Api { fun authenticationCaptain(@Body bankBean: AuthTeamBean): Observable> + /** + * 货源列表 + * */ @GET(BASE_URL + "driver/order/list") fun orderList(): Observable>> + /** + * 运单列表 + * */ + @GET(BASE_URL + "driver/driverWaybill/selectMyWaybillList") + fun selectMyWaybillList( + @Query("pageNum") pageNum: Int = 1, + @Query("pageSize") pageSize: Int = 20, + @Query("waybillStatus") waybillStatus: String ="", + @Query("searchValue") searchValue: String = "" + ): Observable>> + + + /** + * 货源详情 + * */ + @GET(BASE_URL + "driver/order/detail") + fun orderDetail(@Query("orderId") orderId: String): Observable> + + /** + * 司机接单 + * */ + @GET(BASE_URL + "driver/driverWaybill/receivingOrders") + fun receivingOrders( + @Query("orderId") orderId: String, + @Query("carId") carId: String + ): Observable> + + /** + * 司机装卸货 + * */ + @POST(BASE_URL + "driver/driverWaybill/driverLoadOrUnload") + fun driverLoadOrUnload( + @Body upPicBean: UpPicBean + ): Observable> + @GET(BASE_URL + "driver/driver/setUpDriverRole") fun setUpDriverRole(@Query("role") role: String): Observable> diff --git a/app/src/main/java/com/dahe/gldriver/ui/HomeActivity.kt b/app/src/main/java/com/dahe/gldriver/ui/HomeActivity.kt index 1449161..8b6a970 100644 --- a/app/src/main/java/com/dahe/gldriver/ui/HomeActivity.kt +++ b/app/src/main/java/com/dahe/gldriver/ui/HomeActivity.kt @@ -5,7 +5,10 @@ import android.os.Build import android.os.Bundle import android.widget.Toast import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentStatePagerAdapter import androidx.viewpager.widget.ViewPager +import com.amap.api.location.AMapLocationClient.updatePrivacyAgree +import com.amap.api.location.AMapLocationClient.updatePrivacyShow import com.dahe.gldriver.R import com.dahe.gldriver.adapter.MyHomePagerAdapter import com.dahe.gldriver.bean.TabBean @@ -27,7 +30,7 @@ import java.util.TimerTask * @Date 2023/12/27 17:12 * @Description TODO */ -class HomeActivity: BaseActivity(), OnTabSelectListener, +class HomeActivity : BaseActivity(), OnTabSelectListener, ViewPager.OnPageChangeListener { private val mNormalRes = mutableListOf( @@ -44,24 +47,33 @@ class HomeActivity: BaseActivity(), OnTabSelectListener, R.drawable.tab_waybill_press, R.drawable.tab_mine_press ) - private var mTitles = arrayOf("首页","消息","运单","我的") + private var mTitles = arrayOf("首页", "消息", "运单", "我的") private var mTabEntities = arrayListOf( - TabBean(mTitles[0],mSelectRes[0],mNormalRes[0]), - TabBean(mTitles[1],mSelectRes[1],mNormalRes[1]), - TabBean(mTitles[2],mSelectRes[2],mNormalRes[2]), - TabBean(mTitles[3],mSelectRes[3],mNormalRes[3])) - private var mFragments = arrayListOf(HomeFragment(),MessageFragment(), WaybillFragment(),MineFragment()) + TabBean(mTitles[0], mSelectRes[0], mNormalRes[0]), + TabBean(mTitles[1], mSelectRes[1], mNormalRes[1]), + TabBean(mTitles[2], mSelectRes[2], mNormalRes[2]), + TabBean(mTitles[3], mSelectRes[3], mNormalRes[3]) + ) + private var mFragments = arrayListOf(HomeFragment().setListener { + binding.homeTabLayout.currentTab = it + binding.homeNoScrollViewPager.currentItem = it + }, MessageFragment(), WaybillFragment(), MineFragment()) override fun initView(savedInstanceState: Bundle?) { + updatePrivacyShow(mContext,true,true) + updatePrivacyAgree(mContext,true) + binding.homeTabLayout.run { setTabData(mTabEntities) setOnTabSelectListener(this@HomeActivity) - currentTab=0 + currentTab = 0 } + binding.homeNoScrollViewPager.run { - adapter = MyHomePagerAdapter(this@HomeActivity.supportFragmentManager, mTitles, mFragments) + adapter = + MyHomePagerAdapter(this@HomeActivity.supportFragmentManager, mTitles, mFragments) addOnPageChangeListener(this@HomeActivity) offscreenPageLimit = 3 } @@ -78,12 +90,18 @@ class HomeActivity: BaseActivity(), OnTabSelectListener, private fun getPermissions() { PermissionX.init(this) .permissions( - Manifest.permission.CAMERA) + Manifest.permission.CAMERA, + Manifest.permission.ACCESS_FINE_LOCATION, + ) .request { allGranted, grantedList, deniedList -> if (allGranted) { } else { - Toast.makeText(mContext, "开启权限失败,请在应用设置-权限-定位-始终允许", Toast.LENGTH_SHORT).show() + Toast.makeText( + mContext, + "开启权限失败,请在应用设置-权限-定位-始终允许", + Toast.LENGTH_SHORT + ).show() } } } @@ -106,6 +124,14 @@ class HomeActivity: BaseActivity(), OnTabSelectListener, } } + +// fun getFragment(){ +// var adapter : MyHomePagerAdapter = binding.homeNoScrollViewPager.adapter as MyHomePagerAdapter +// +// adapter.instantiateItem(binding.homeNoScrollViewPager,0) +// } + + override fun onTabSelect(position: Int) { binding.homeNoScrollViewPager.setCurrentItem(position) } diff --git a/app/src/main/java/com/dahe/gldriver/ui/home/HomeFragment.kt b/app/src/main/java/com/dahe/gldriver/ui/home/HomeFragment.kt index f7e388e..4c2e756 100644 --- a/app/src/main/java/com/dahe/gldriver/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/dahe/gldriver/ui/home/HomeFragment.kt @@ -1,34 +1,36 @@ package com.dahe.gldriver.ui.home import android.graphics.Color +import android.os.Bundle import android.widget.LinearLayout import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import com.chad.library.adapter4.BaseQuickAdapter +import com.amap.api.services.route.DistanceSearch import com.dahe.gldriver.R import com.dahe.gldriver.adapter.GridItemAdapter import com.dahe.gldriver.adapter.WaybillAdapter -import com.dahe.gldriver.bean.AuthTeamBean +import com.dahe.gldriver.base.AppConfig import com.dahe.gldriver.bean.GridBean import com.dahe.gldriver.databinding.FragmentHomeBinding +import com.dahe.gldriver.event.OrderStauEvent import com.dahe.gldriver.net.BaseObserver import com.dahe.gldriver.net.DataManager import com.dahe.gldriver.net.RxHttpCallBack -import com.dahe.gldriver.ui.HomeActivity import com.dahe.gldriver.ui.waybill.activity.WaybillDetailActivity +import com.dahe.gldriver.ui.waybill.activity.WaybillLoadActivity +import com.dahe.gldriver.ui.waybill.activity.WaybillUnlLoadActivity import com.dahe.glex.bean.OrderBean -import com.dahe.glex.bean.WayBillBean import com.dahe.mylibrary.base.BaseFragment import com.dahe.mylibrary.callback.RefreshCallBack import com.dahe.mylibrary.net.CommonResponseBean import com.dahe.mylibrary.recycleviewswipe.RecycleViewDivider import com.dahe.mylibrary.utils.ActivityUtils import com.dahe.mylibrary.utils.ConvertUtils -import com.dahe.mylibrary.utils.ToastUtils -import com.flyco.tablayout.listener.OnTabSelectListener +import com.flyco.tablayout.CommonTabLayout import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.schedulers.Schedulers -import okhttp3.internal.wait +import org.greenrobot.eventbus.EventBus +import org.greenrobot.eventbus.Subscribe /** * @ClassName HomeFragment @@ -37,6 +39,9 @@ import okhttp3.internal.wait * @Description TODO */ class HomeFragment : BaseFragment(), RefreshCallBack { + + var adapter: WaybillAdapter? = null + private val gridDatas = mutableListOf( GridBean("司机之家", R.drawable.home_driver), GridBean("咨询客服", R.drawable.home_ask), @@ -50,50 +55,75 @@ class HomeFragment : BaseFragment(), RefreshCallBack { } + lateinit var mListener: ((Int) -> Unit) + + fun setListener(listener: (Int) -> Unit): HomeFragment { + this.mListener = listener + return this + } + + override fun onFragmentFirstVisible() { initRecy() - binding.gridView.run { - adapter = activity?.let { GridItemAdapter(it, gridDatas) } - setOnItemClickListener { adapterView, view, i, l -> -// println(i) + setRefresh(binding.refresh, this) + binding.run { + gridView.run { + adapter = activity?.let { GridItemAdapter(it, gridDatas) } + setOnItemClickListener { adapterView, view, i, l -> + + } + } + tvMar.isSelected = true + + ivMyWaybill.setOnClickListener { + if (this@HomeFragment.mListener != null) + this@HomeFragment?.mListener?.invoke(2) } } - - binding.tvMar.isSelected = true - - DataManager.getInstance().orderList() - .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) - .subscribe(BaseObserver(mContext,object : RxHttpCallBack>(){ - override fun onSuccess(t: CommonResponseBean>) { - super.onSuccess(t) - } - })) - + initData() } override fun getRefreshDate(stat: Int, page: Int, count: Int) { + initData() + } + private fun initData() { + DataManager.getInstance().orderList() + .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) + .subscribe(BaseObserver(mContext, object : RxHttpCallBack>() { + override fun onSuccess(t: CommonResponseBean>) { + super.onSuccess(t) + + if (mRefreshPage === 1) { + adapter?.submitList(t.data) + } else { + adapter?.addAll(t.data) + } + setFinishRefresh( + binding.refresh, + t.total > mRefreshPage * mRefreshCount + ) + } + })) + } + + + @Subscribe + fun eventStatu(orderStauEvent: OrderStauEvent) { + if (orderStauEvent.statu == 1) { + initData() + } } private fun initRecy() { - var datas = mutableListOf( - WayBillBean(), - WayBillBean(), - WayBillBean(), - WayBillBean(), - WayBillBean(), - WayBillBean(), - WayBillBean(), - WayBillBean() - ) - var adapter = binding.recyclerView.run { + adapter = binding.recyclerView.run { layoutManager = LinearLayoutManager(mContext, RecyclerView.VERTICAL, false) setHasFixedSize(true) addItemDecoration( RecycleViewDivider( LinearLayout.VERTICAL, - ConvertUtils.dp2px(16.0f), + ConvertUtils.dp2px(10.0f), Color.TRANSPARENT ) ) @@ -101,14 +131,36 @@ class HomeFragment : BaseFragment(), RefreshCallBack { adapter as WaybillAdapter }.apply { setOnItemClickListener { _, _, position -> - ToastUtils.showToast(mContext, position.toString()) + ActivityUtils.startActivity( + mContext, + WaybillDetailActivity::class.java, + Bundle().apply { putString(AppConfig.ORDER_ID, items[position].orderId) }) + + +// ActivityUtils.startActivity( +// mContext, +// WaybillDetailActivity::class.java, +// Bundle().apply { putString(AppConfig.ORDER_ID, items[position].orderId) }) } addOnItemChildClickListener(R.id.btnOk) { adapter, view, position -> - ActivityUtils.startActivity(mContext, WaybillDetailActivity::class.java) + + ActivityUtils.startActivity( + mContext, + WaybillDetailActivity::class.java, + Bundle().apply { putString(AppConfig.ORDER_ID, items[position].orderId) }) +// ActivityUtils.startActivity(mContext, WaybillDetailActivity::class.java) } } - adapter.submitList(datas) } + override fun onStart() { + super.onStart() + EventBus.getDefault().register(this); + } + + override fun onStop() { + super.onStop() + EventBus.getDefault().unregister(this); + } } \ No newline at end of file diff --git a/app/src/main/java/com/dahe/gldriver/ui/waybill/WaybillFragment.kt b/app/src/main/java/com/dahe/gldriver/ui/waybill/WaybillFragment.kt index 3f6a9e0..4cc267c 100644 --- a/app/src/main/java/com/dahe/gldriver/ui/waybill/WaybillFragment.kt +++ b/app/src/main/java/com/dahe/gldriver/ui/waybill/WaybillFragment.kt @@ -2,10 +2,17 @@ package com.dahe.gldriver.ui.waybill import android.content.Context import android.graphics.Color +import android.view.View +import androidx.core.widget.addTextChangedListener import androidx.fragment.app.Fragment import com.dahe.gldriver.R +import com.dahe.gldriver.callback.OnSearchListener import com.dahe.gldriver.databinding.FragmentWaybillBinding import com.dahe.gldriver.ui.waybill.fragment.AllWaybillFragment +import com.dahe.gldriver.ui.waybill.fragment.CancelWaybillFragment +import com.dahe.gldriver.ui.waybill.fragment.WaitAppraiseFragment +import com.dahe.gldriver.ui.waybill.fragment.WaitLoadFragment +import com.dahe.gldriver.ui.waybill.fragment.WaitUnLoadFragment import com.dahe.mylibrary.base.BaseFragment import com.dahe.mylibrary.callback.RefreshCallBack import net.lucode.hackware.magicindicator.FragmentContainerHelper @@ -26,8 +33,17 @@ import net.lucode.hackware.magicindicator.buildins.commonnavigator.titles.ColorT */ class WaybillFragment : BaseFragment(), RefreshCallBack { + private var currIndex = 0 + private val mFragmentContainerHelper = FragmentContainerHelper() - var mFragments = listOf(AllWaybillFragment(),AllWaybillFragment(),AllWaybillFragment(),AllWaybillFragment(),AllWaybillFragment()) + + var mFragments = listOf( + AllWaybillFragment(), + WaitLoadFragment(), + WaitUnLoadFragment(), + WaitAppraiseFragment(), + CancelWaybillFragment() + ) val titles = mutableListOf( "全部", "待装货", @@ -45,10 +61,31 @@ class WaybillFragment : BaseFragment(), RefreshCallBack override fun onFragmentFirstVisible() { initRecy() + binding.run { + + etSearch.addTextChangedListener { + ivCancel.visibility = if (it.toString().isNullOrBlank()) View.GONE else View.VISIBLE + } + ivCancel.setOnClickListener { + etSearch.setText("") + } + + btnSearch.setOnClickListener { + val search = etSearch.text.trim().toString() + when (currIndex) { + 0 -> (mFragments[currIndex] as AllWaybillFragment).onSearchClick(search) + 1 -> (mFragments[currIndex] as WaitLoadFragment).onSearchClick(search) + 2 -> (mFragments[currIndex] as WaitUnLoadFragment).onSearchClick(search) + 3 -> (mFragments[currIndex] as WaitAppraiseFragment).onSearchClick(search) + 4 -> (mFragments[currIndex] as CancelWaybillFragment).onSearchClick(search) + } - mFragmentContainerHelper.handlePageSelected(0,true) - switchPages(0) + } + + } + mFragmentContainerHelper.handlePageSelected(currIndex, true) + switchPages(currIndex) var commonNavigator = CommonNavigator(mContext) commonNavigator.run { @@ -88,7 +125,6 @@ class WaybillFragment : BaseFragment(), RefreshCallBack binding.magicIndicator.navigator = commonNavigator mFragmentContainerHelper.attachMagicIndicator(binding.magicIndicator) -// ViewPagerHelper.bind(binding.magicIndicator, binding.viewPager); } @@ -99,7 +135,9 @@ class WaybillFragment : BaseFragment(), RefreshCallBack private fun initRecy() { } + private fun switchPages(index: Int) { + currIndex = index val fragmentManager = requireActivity().supportFragmentManager val fragmentTransaction = fragmentManager.beginTransaction() var fragment: Fragment diff --git a/app/src/main/java/com/dahe/gldriver/ui/waybill/activity/WaybillDetailActivity.kt b/app/src/main/java/com/dahe/gldriver/ui/waybill/activity/WaybillDetailActivity.kt index 35a341d..c1eaca6 100644 --- a/app/src/main/java/com/dahe/gldriver/ui/waybill/activity/WaybillDetailActivity.kt +++ b/app/src/main/java/com/dahe/gldriver/ui/waybill/activity/WaybillDetailActivity.kt @@ -1,13 +1,39 @@ package com.dahe.gldriver.ui.waybill.activity +import android.Manifest +import android.app.usage.UsageEvents.Event import android.graphics.Color import android.os.Bundle +import android.widget.LinearLayout +import android.widget.Toast +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.amap.api.maps2d.model.LatLng import com.dahe.gldriver.R +import com.dahe.gldriver.adapter.WaybillAdapter +import com.dahe.gldriver.adapter.WaybillNodeAdapter import com.dahe.gldriver.base.AppConfig +import com.dahe.gldriver.bean.OrderDetailBean import com.dahe.gldriver.databinding.ActivityWaybillDetailBinding +import com.dahe.gldriver.event.OrderStauEvent +import com.dahe.gldriver.net.BaseObserver +import com.dahe.gldriver.net.DataManager +import com.dahe.gldriver.net.RxHttpCallBack +import com.dahe.gldriver.utils.GDLocationUtils +import com.dahe.gldriver.utils.LocationUtils +import com.dahe.glex.bean.OrderBean import com.dahe.mylibrary.base.BaseActivity +import com.dahe.mylibrary.net.CommonResponseBean +import com.dahe.mylibrary.recycleviewswipe.RecycleViewDivider import com.dahe.mylibrary.utils.ActivityUtils +import com.dahe.mylibrary.utils.BaseUtils +import com.dahe.mylibrary.utils.ConvertUtils +import com.dahe.mylibrary.utils.LoadingUtils import com.dahe.mylibrary.utils.SelectPicUtils +import com.permissionx.guolindev.PermissionX +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import io.reactivex.rxjava3.schedulers.Schedulers +import org.greenrobot.eventbus.EventBus /** * @ClassName WaybillDetailActivity @@ -15,14 +41,186 @@ import com.dahe.mylibrary.utils.SelectPicUtils * @Date 2024/1/26 14:50 * @Description 运单详情-接单 */ -class WaybillDetailActivity :BaseActivity(){ +class WaybillDetailActivity : BaseActivity() { + var orderId: String = "" + lateinit var gdLatLng: LatLng + lateinit var loadPos: LatLng override fun initView(savedInstanceState: Bundle?) { - binding.btnReceiving.setOnClickListener { - ActivityUtils.startActivity(mContext,WaybillSuccActivity::class.java,Bundle().apply { putInt(AppConfig.SUCCESS_TYPE,0) }) + orderId = intent.extras?.getString(AppConfig.ORDER_ID, "").toString() + initRecy() + getLocation() + + binding.btnCall.setOnClickListener { + BaseUtils.callPhone(this@WaybillDetailActivity, "15838201105") } + binding.btnReceiving.setOnClickListener { + DataManager.getInstance().receivingOrders(orderId, "22") + .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) + .subscribe(BaseObserver(mContext, object : RxHttpCallBack() { + override fun onSuccess(t: CommonResponseBean) { + super.onSuccess(t) + EventBus.getDefault().post(OrderStauEvent(1)) + } + })) + + } + } override fun initDate() { -// SelectPicUtils().getInstance(mContext) + DataManager.getInstance().orderDetail(orderId) + .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) + .subscribe(BaseObserver(mContext, object : RxHttpCallBack() { + override fun onSuccess(t: CommonResponseBean) { + super.onSuccess(t) + val load = t.data.orderChildList.first { it.type == "1" } + var distance: String = "" + loadPos = LatLng(load.latitude.toDouble(), load.longitude.toDouble()) + if (::gdLatLng.isInitialized) { + distance = LocationUtils.getInstance().getDistance( + gdLatLng, + loadPos + ) + "km" + } + var goods = + t.data.goodsList.map { """${it.goodName},${it.goodItemGrossWeight}吨,${if (it.goodCube.isNullOrEmpty()) "" else it.goodCube + "方"}""" } + .reduce { acc, s -> """${acc} + |${s}""".trimMargin() } + binding.run { + tvTime.text = t.data.receiverDeadline + tvCom.text = t.data.receiverBusinessName + tvUnloadDis.text = t.data.distance+"km" + tvCarType.text = """${t.data.vehicleLength} ${t.data.vehicleType}""" + if (!t.data.requirement.isNullOrEmpty()) tvRemark.text = t.data.requirement + if (!distance.isNullOrEmpty()) tvLoadDis.text = distance + tvConsignor.text = t.data.realCompanyName + tvType.text = if (t.data.orderType == "0") "一装一卸" else "一装多卸" + tvFreight.text = t.data.driverFreight.toString() + tvGoods.text = goods + btnCall.setOnClickListener { + PermissionX.init(this@WaybillDetailActivity) + .permissions(Manifest.permission.CALL_PHONE) + .request { allGranted, grantedList, deniedList -> + if (allGranted) { + BaseUtils.callPhone( + this@WaybillDetailActivity, + t.data.shipperContactPhone + ) + } else { + Toast.makeText( + mContext, + "开启权限失败,请在应用设置-权限中打开电话权限", + Toast.LENGTH_SHORT + ).show() + } + } + + } + + } + adapter?.submitList(t.data.orderChildList) +// initXml(t.data) + } + })) + } + + + fun getLocation() { + GDLocationUtils.instance.getLocation(this@WaybillDetailActivity) { + //errCode等于0代表定位成功,其他的为定位失败,具体的可以参照官网定位错误码说明 + runOnUiThread { + LoadingUtils.instance.dissLoading() + if (it.getErrorCode() == 0) { + it.getLongitude()//经 度 + it.getLatitude()//纬 度 + gdLatLng = LatLng(it.latitude, it.longitude) + + if (::loadPos.isInitialized) { + var distance = LocationUtils.getInstance().getDistance( + gdLatLng, + loadPos + ) + "km" + binding.tvLoadDis.text = distance + } + + } else { + showToast("定位失败,请检查定位权限是否开启") + } + } + } + } + + +// private fun initXml(data: OrderDetailBean) { +// val load = data.orderChildList.find { it.type == "1" } +// val unLoad = data.orderChildList.find { it.type == "2" } +// +// binding.run { +// tvTime.text = data.receiverDeadline +// tvType.text = if (data.orderType == "0") "一装一卸" else "一装多卸" +// tvLoad.text = load?.address +// tvPhone.text = """${load?.name} ${load?.phone}""" +// +// tvUnload.text = unLoad?.address +// tvUnloadPhone.text = """${unLoad?.name} ${unLoad?.phone}""" +// +// +// tvCom.text = data?.receiverBusinessName +// tvConsignor.text = data?.realCompanyName +// tvFreight.text = data?.driverFreight.toString() +// +// +// +// +// +// btnCall.setOnClickListener { +// +// PermissionX.init(this@WaybillDetailActivity) +// .permissions(Manifest.permission.CALL_PHONE) +// .request { allGranted, grantedList, deniedList -> +// if (allGranted) { +// BaseUtils.callPhone( +// this@WaybillDetailActivity, +// data.shipperContactPhone +// ) +// } else { +// Toast.makeText( +// mContext, +// "开启权限失败,请在应用设置-权限中打开电话权限", +// Toast.LENGTH_SHORT +// ).show() +// } +// } +// +// } +// } +// } + + var adapter: WaybillNodeAdapter? = null + private fun initRecy() { + adapter = binding.recycler.run { + layoutManager = LinearLayoutManager(mContext, RecyclerView.VERTICAL, false) + setHasFixedSize(true) + addItemDecoration( + RecycleViewDivider( + LinearLayout.VERTICAL, + ConvertUtils.dp2px(16.0f), + Color.TRANSPARENT + ) + ) + adapter = WaybillNodeAdapter() + adapter as WaybillNodeAdapter + }.apply { + setOnItemClickListener { _, _, position -> + ActivityUtils.startActivity( + mContext, + WaybillLoadActivity::class.java, + Bundle().apply { putString(AppConfig.ORDER_ID, items[position].orderId) }) + } + addOnItemChildClickListener(R.id.btnOk) { adapter, view, position -> + ActivityUtils.startActivity(mContext, WaybillDetailActivity::class.java) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/dahe/gldriver/ui/waybill/activity/WaybillLoadActivity.kt b/app/src/main/java/com/dahe/gldriver/ui/waybill/activity/WaybillLoadActivity.kt index d8e4a77..bb71309 100644 --- a/app/src/main/java/com/dahe/gldriver/ui/waybill/activity/WaybillLoadActivity.kt +++ b/app/src/main/java/com/dahe/gldriver/ui/waybill/activity/WaybillLoadActivity.kt @@ -1,13 +1,33 @@ package com.dahe.gldriver.ui.waybill.activity +import android.Manifest +import android.graphics.Color import android.os.Bundle import android.view.View +import android.widget.LinearLayout +import android.widget.Toast +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView import com.amap.api.maps2d.AMap +import com.dahe.gldriver.R +import com.dahe.gldriver.adapter.WaybillNodeAdapter import com.dahe.gldriver.base.AppConfig +import com.dahe.gldriver.bean.OrderDetailBean import com.dahe.gldriver.databinding.ActivityWaybillLoadBinding +import com.dahe.gldriver.net.BaseObserver +import com.dahe.gldriver.net.DataManager +import com.dahe.gldriver.net.RxHttpCallBack +import com.dahe.gldriver.utils.GDLocationUtils import com.dahe.mylibrary.base.BaseActivity +import com.dahe.mylibrary.net.CommonResponseBean +import com.dahe.mylibrary.recycleviewswipe.RecycleViewDivider import com.dahe.mylibrary.utils.ActivityUtils +import com.dahe.mylibrary.utils.BaseUtils +import com.dahe.mylibrary.utils.ConvertUtils import com.dahe.mylibrary.utils.ToastUtils +import com.permissionx.guolindev.PermissionX +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import io.reactivex.rxjava3.schedulers.Schedulers /** @@ -19,26 +39,82 @@ import com.dahe.mylibrary.utils.ToastUtils class WaybillLoadActivity : BaseActivity() { var aMap: AMap? = null + + var orderId: String = "" + var waybillId: String = "" + lateinit var orderBean: OrderDetailBean override fun initView(savedInstanceState: Bundle?) { setTitleBar("运单详情", View.OnClickListener { finish() }, true, "查看单据") { ToastUtils.showToast(mContext, "查看单据") } + orderId = intent.extras?.getString(AppConfig.ORDER_ID,"").toString() + + initRecy() + binding.run { mapView.onCreate(savedInstanceState) if (aMap == null) mapView.map btnRight.setOnClickListener { + var data = orderBean.orderChildList.first { it.type == "1" } ActivityUtils.startActivity( mContext, WaybillUpPicActivity::class.java, - Bundle().apply { putInt(AppConfig.SUCCESS_TYPE, 1) }) + Bundle().apply { + putInt(AppConfig.SUCCESS_TYPE, 1) + putString(AppConfig.ORDER_ID,orderId) + putString(AppConfig.WAYBILL_ID,orderBean.waybillId) + putString(AppConfig.CHILDRE_ID,data.orderChildreId) + }) } } } override fun initDate() { + + DataManager.getInstance().orderDetail(orderId) + .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) + .subscribe(BaseObserver(mContext, object : RxHttpCallBack() { + override fun onSuccess(t: CommonResponseBean) { + super.onSuccess(t) + orderBean = t.data + + binding.run { + tvTime.text = orderBean.receiverDeadline + tvType.text = if (orderBean.orderType == "0") "一装一卸" else "一装多卸" + + tvCom.text = orderBean?.receiverBusinessName + tvFreight.text = orderBean?.driverFreight.toString() + + btnLeft.setOnClickListener { + PermissionX.init(this@WaybillLoadActivity) + .permissions(Manifest.permission.CALL_PHONE) + .request { allGranted, grantedList, deniedList -> + if (allGranted) { + BaseUtils.callPhone( + this@WaybillLoadActivity, + orderBean.shipperContactPhone + ) + } else { + Toast.makeText( + mContext, + "开启权限失败,请在应用设置-权限中打开电话权限", + Toast.LENGTH_SHORT + ).show() + } + } + + } + } + + adapter?.submitList(t.data.orderChildList) +// initXml(t.data) + } + })) + + } override fun onResume() { @@ -62,4 +138,32 @@ class WaybillLoadActivity : BaseActivity() { super.onDestroy() } + + var adapter: WaybillNodeAdapter? = null + private fun initRecy() { + adapter = binding.recycler.run { + layoutManager = LinearLayoutManager(mContext, RecyclerView.VERTICAL, false) + setHasFixedSize(true) + addItemDecoration( + RecycleViewDivider( + LinearLayout.VERTICAL, + ConvertUtils.dp2px(16.0f), + Color.TRANSPARENT + ) + ) + adapter = WaybillNodeAdapter() + adapter as WaybillNodeAdapter + }.apply { + setOnItemClickListener { _, _, position -> + ActivityUtils.startActivity( + mContext, + WaybillLoadActivity::class.java, + Bundle().apply { putString(AppConfig.ORDER_ID, items[position].orderId) }) + } + addOnItemChildClickListener(R.id.btnOk) { adapter, view, position -> + ActivityUtils.startActivity(mContext, WaybillDetailActivity::class.java) + } + } + + } } \ No newline at end of file diff --git a/app/src/main/java/com/dahe/gldriver/ui/waybill/activity/WaybillUnlLoadActivity.kt b/app/src/main/java/com/dahe/gldriver/ui/waybill/activity/WaybillUnlLoadActivity.kt index a40635a..4576f0a 100644 --- a/app/src/main/java/com/dahe/gldriver/ui/waybill/activity/WaybillUnlLoadActivity.kt +++ b/app/src/main/java/com/dahe/gldriver/ui/waybill/activity/WaybillUnlLoadActivity.kt @@ -1,15 +1,33 @@ package com.dahe.gldriver.ui.waybill.activity +import android.Manifest +import android.graphics.Color import android.os.Bundle import android.view.View +import android.widget.LinearLayout +import android.widget.Toast +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView import com.amap.api.maps2d.AMap import com.dahe.gldriver.R +import com.dahe.gldriver.adapter.WaybillNodeAdapter import com.dahe.gldriver.base.AppConfig +import com.dahe.gldriver.bean.OrderDetailBean import com.dahe.gldriver.databinding.ActivityWaybillLoadBinding import com.dahe.gldriver.databinding.ActivityWaybillUnloadBinding +import com.dahe.gldriver.net.BaseObserver +import com.dahe.gldriver.net.DataManager +import com.dahe.gldriver.net.RxHttpCallBack import com.dahe.mylibrary.base.BaseActivity +import com.dahe.mylibrary.net.CommonResponseBean +import com.dahe.mylibrary.recycleviewswipe.RecycleViewDivider import com.dahe.mylibrary.utils.ActivityUtils +import com.dahe.mylibrary.utils.BaseUtils +import com.dahe.mylibrary.utils.ConvertUtils import com.dahe.mylibrary.utils.ToastUtils +import com.permissionx.guolindev.PermissionX +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import io.reactivex.rxjava3.schedulers.Schedulers /** * @ClassName WaybillLoadActivity @@ -20,26 +38,107 @@ import com.dahe.mylibrary.utils.ToastUtils class WaybillUnlLoadActivity : BaseActivity() { var aMap: AMap? = null + + + var orderId: String = "" + var waybillId: String = "" + lateinit var orderBean: OrderDetailBean override fun initView(savedInstanceState: Bundle?) { setTitleBar("运单详情", { finish() }, true, "查看单据") { ToastUtils.showToast(mContext, "查看单据") } + orderId = intent.extras?.getString(AppConfig.ORDER_ID, "").toString() + initRecy() binding.run { mapView.onCreate(savedInstanceState) if (aMap == null) mapView.map btnRight.setOnClickListener { + var data = orderBean.orderChildList.first { it.type == "2" } ActivityUtils.startActivity( mContext, WaybillUpPicActivity::class.java, - Bundle().apply { putInt(AppConfig.SUCCESS_TYPE, 2) }) + Bundle().apply { + putInt(AppConfig.SUCCESS_TYPE, 2) + putString(AppConfig.ORDER_ID, orderId) + putString(AppConfig.WAYBILL_ID, orderBean.waybillId) + putString(AppConfig.CHILDRE_ID, data.orderChildreId) + }) } } - } override fun initDate() { + + DataManager.getInstance().orderDetail(orderId) + .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) + .subscribe(BaseObserver(mContext, object : RxHttpCallBack() { + override fun onSuccess(t: CommonResponseBean) { + super.onSuccess(t) + orderBean = t.data + + binding.run { + tvTime.text = orderBean.receiverDeadline + tvType.text = if (orderBean.orderType == "0") "一装一卸" else "一装多卸" + + tvCom.text = orderBean?.receiverBusinessName + tvFreight.text = orderBean?.driverFreight.toString() + + btnLeft.setOnClickListener { + PermissionX.init(this@WaybillUnlLoadActivity) + .permissions(Manifest.permission.CALL_PHONE) + .request { allGranted, grantedList, deniedList -> + if (allGranted) { + BaseUtils.callPhone( + this@WaybillUnlLoadActivity, + orderBean.shipperContactPhone + ) + } else { + Toast.makeText( + mContext, + "开启权限失败,请在应用设置-权限中打开电话权限", + Toast.LENGTH_SHORT + ).show() + } + } + + } + } + + adapter?.submitList(t.data.orderChildList) +// initXml(t.data) + } + })) + } + + + var adapter: WaybillNodeAdapter? = null + private fun initRecy() { + adapter = binding.recycler.run { + layoutManager = LinearLayoutManager(mContext, RecyclerView.VERTICAL, false) + setHasFixedSize(true) + addItemDecoration( + RecycleViewDivider( + LinearLayout.VERTICAL, + ConvertUtils.dp2px(16.0f), + Color.TRANSPARENT + ) + ) + adapter = WaybillNodeAdapter() + adapter as WaybillNodeAdapter + }.apply { + setOnItemClickListener { _, _, position -> + ActivityUtils.startActivity( + mContext, + WaybillLoadActivity::class.java, + Bundle().apply { putString(AppConfig.ORDER_ID, items[position].orderId) }) + } + addOnItemChildClickListener(R.id.btnOk) { adapter, view, position -> + ActivityUtils.startActivity(mContext, WaybillDetailActivity::class.java) + } + } + } @@ -65,4 +164,5 @@ class WaybillUnlLoadActivity : BaseActivity() { } + } \ No newline at end of file diff --git a/app/src/main/java/com/dahe/gldriver/ui/waybill/activity/WaybillUpPicActivity.kt b/app/src/main/java/com/dahe/gldriver/ui/waybill/activity/WaybillUpPicActivity.kt index 8be8413..42193fd 100644 --- a/app/src/main/java/com/dahe/gldriver/ui/waybill/activity/WaybillUpPicActivity.kt +++ b/app/src/main/java/com/dahe/gldriver/ui/waybill/activity/WaybillUpPicActivity.kt @@ -3,19 +3,31 @@ package com.dahe.gldriver.ui.waybill.activity import android.os.Bundle import android.view.View import androidx.recyclerview.widget.GridLayoutManager +import com.amap.api.maps2d.model.LatLng import com.dahe.gldriver.base.AppConfig +import com.dahe.gldriver.bean.UpPicBean +import com.dahe.gldriver.bean.WaybillPhoto import com.dahe.gldriver.databinding.ActivityWaybillUppicBinding +import com.dahe.gldriver.net.BaseObserver +import com.dahe.gldriver.net.DataManager +import com.dahe.gldriver.net.RxHttpCallBack +import com.dahe.gldriver.oss.OssServiceUtil +import com.dahe.gldriver.utils.GDLocationUtils import com.dahe.mylibrary.adapter.GridImageAdapter import com.dahe.mylibrary.adapter.GridImageAdapter.OnItemClickListener import com.dahe.mylibrary.base.BaseActivity import com.dahe.mylibrary.callback.OnPicResultListener +import com.dahe.mylibrary.net.CommonResponseBean import com.dahe.mylibrary.utils.ActivityUtils +import com.dahe.mylibrary.utils.LoadingUtils import com.dahe.mylibrary.utils.PopsUtils import com.dahe.mylibrary.utils.ToastUtils import com.dahe.mylibrary.weight.FullyGridLayoutManager import com.luck.picture.lib.decoration.GridSpacingItemDecoration import com.luck.picture.lib.entity.LocalMedia import com.luck.picture.lib.utils.DensityUtil +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import io.reactivex.rxjava3.schedulers.Schedulers /** * @ClassName WaybillUpPicActivity @@ -24,8 +36,25 @@ import com.luck.picture.lib.utils.DensityUtil * @Description 上传照片:装卸货以及回单照片 */ class WaybillUpPicActivity : BaseActivity() { + + lateinit var upBean: UpPicBean//提交对象 + lateinit var picBean: WaybillPhoto//照片对象 + + var orderId: String = "" + var waybillId: String = "" + var childreId: String = "" + lateinit var latLng: LatLng + override fun initView(savedInstanceState: Bundle?) { - var type = intent.extras?.getInt(AppConfig.SUCCESS_TYPE, 0) + upBean = UpPicBean() + + + var type = intent.extras?.run { + orderId = getString(AppConfig.ORDER_ID, "") + waybillId = getString(AppConfig.WAYBILL_ID, "") + childreId = getString(AppConfig.CHILDRE_ID, "") + getInt(AppConfig.SUCCESS_TYPE, 0) + } if (1 == type) { binding.run { tvTitle.text = "装货" @@ -34,17 +63,131 @@ class WaybillUpPicActivity : BaseActivity() { } } - binding.btnUnload.setOnClickListener { - if (1 == type) { - ActivityUtils.startActivity( - mContext, - WaybillSuccActivity::class.java, - Bundle().apply { putInt(AppConfig.SUCCESS_TYPE, 1) }) - } else { - ActivityUtils.startActivity( - mContext, - WaybillSuccActivity::class.java, - Bundle().apply { putInt(AppConfig.SUCCESS_TYPE, 2) }) + + binding.run { + tvPosi.setOnClickListener { + getLocation() + } + + + recyclerView.run { + layoutManager = + FullyGridLayoutManager(mContext, 4, GridLayoutManager.VERTICAL, false) + addItemDecoration( + GridSpacingItemDecoration( + 4, + DensityUtil.dip2px(mContext, 8f), false + ) + ) + + var myAdapter = GridImageAdapter(mContext, mData) + + myAdapter.setOnItemClickListener(object : OnItemClickListener { + override fun onItemClick(v: View?, position: Int) { + + } + + override fun openPicture() { + PopsUtils.getInstance().showSelPic(mContext, myAdapter) { + + OssServiceUtil.getInstance().run { + asyncPutImage(it[0].realPath, this@WaybillUpPicActivity) + setResultCallBack { data, oldPath -> + picBean = WaybillPhoto() + picBean.run { + photoUrl = oldPath + this.type = if (type == 1) "1" else "2" + } + + upBean.waybillPhotoList.add(picBean) + } + } + myAdapter.data.addAll(it) + myAdapter.notifyDataSetChanged() + } + + } + }) + adapter = myAdapter + } + + + + //回单处理 + recyclerView2.run { + layoutManager = + FullyGridLayoutManager(mContext, 4, GridLayoutManager.VERTICAL, false) + addItemDecoration( + GridSpacingItemDecoration( + 4, + DensityUtil.dip2px(mContext, 8f), false + ) + ) + + var myAdapter = GridImageAdapter(mContext, mData) + + myAdapter.setOnItemClickListener(object : OnItemClickListener { + override fun onItemClick(v: View?, position: Int) { + + } + + override fun openPicture() { + PopsUtils.getInstance().showSelPic(mContext, myAdapter) { + + OssServiceUtil.getInstance().run { + asyncPutImage(it[0].realPath, this@WaybillUpPicActivity) + setResultCallBack { data, oldPath -> + picBean = WaybillPhoto() + picBean.run { + photoUrl = oldPath + receiptType = if (type == 1) "4" else if (type == 2) "5" else "6" + this.type = "3" + } + upBean.waybillPhotoList.add(picBean) + } + } + myAdapter.data.addAll(it) + myAdapter.notifyDataSetChanged() + } + + } + }) + adapter = myAdapter + } + + + + btnUnload.setOnClickListener { + upBean.run { + orderId = this@WaybillUpPicActivity.orderId + waybillId = this@WaybillUpPicActivity.waybillId + latitude = latLng.latitude.toString() + longitude = latLng.longitude.toString() + orderChildreId = this@WaybillUpPicActivity.childreId + this.type = if (type == 1) "1" else "2" + } + + DataManager.getInstance().driverLoadOrUnload(upBean) + .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) + .subscribe(BaseObserver(mContext, object : RxHttpCallBack() { + override fun onSuccess(t: CommonResponseBean) { + super.onSuccess(t) + } + })) + + + + if (1 == type) { + ActivityUtils.startActivity( + mContext, + WaybillSuccActivity::class.java, + Bundle().apply { putInt(AppConfig.SUCCESS_TYPE, 1) }) + } else { + ActivityUtils.startActivity( + mContext, + WaybillSuccActivity::class.java, + Bundle().apply { putInt(AppConfig.SUCCESS_TYPE, 2) }) + } } } } @@ -52,44 +195,25 @@ class WaybillUpPicActivity : BaseActivity() { private val mData: List = ArrayList() override fun initDate() { + getLocation() + } - binding.recyclerView.run { - layoutManager = FullyGridLayoutManager(mContext, 4, GridLayoutManager.VERTICAL, false) - addItemDecoration( - GridSpacingItemDecoration( - 4, - DensityUtil.dip2px(mContext, 8f), false - ) - ) - - var myAdapter = GridImageAdapter(mContext, mData) - - myAdapter.setOnItemClickListener(object : OnItemClickListener { - override fun onItemClick(v: View?, position: Int) { + fun getLocation() { + LoadingUtils.instance.showLoading(this,"定位中,请稍等...") + GDLocationUtils.instance.getLocation(this@WaybillUpPicActivity) { + //errCode等于0代表定位成功,其他的为定位失败,具体的可以参照官网定位错误码说明 + runOnUiThread { + LoadingUtils.instance.dissLoading() + if (it.getErrorCode() == 0) { + it.getLongitude()//经 度 + it.getLatitude()//纬 度 + latLng = LatLng(it.latitude, it.longitude) + binding.tvLoca.text = it.address + } else { + showToast("定位失败,请检查定位权限是否开启") } - - override fun openPicture() { - PopsUtils.getInstance().showSelPic(mContext,myAdapter){ - myAdapter.data.addAll(it) - myAdapter.notifyDataSetChanged() - } -// XPopup.Builder(mContext) -// .dismissOnTouchOutside(true) -// .asCustom(PopBottomPic(mContext, myAdapter, onPicResultListener = { -// ToastUtils.showToast(mContext, it.size.toString()) -// myAdapter.data.addAll(it) -// myAdapter.notifyDataSetChanged() -// })) -// .show() - - } - }) - -// setHasFixedSize(true) - adapter = myAdapter + } } - - } } \ No newline at end of file diff --git a/app/src/main/java/com/dahe/gldriver/ui/waybill/fragment/AllWaybillFragment.kt b/app/src/main/java/com/dahe/gldriver/ui/waybill/fragment/AllWaybillFragment.kt index b41be0c..526f3ff 100644 --- a/app/src/main/java/com/dahe/gldriver/ui/waybill/fragment/AllWaybillFragment.kt +++ b/app/src/main/java/com/dahe/gldriver/ui/waybill/fragment/AllWaybillFragment.kt @@ -1,12 +1,28 @@ package com.dahe.gldriver.ui.waybill.fragment +import android.content.Context +import android.graphics.Color +import android.widget.LinearLayout import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import com.dahe.gldriver.R import com.dahe.gldriver.adapter.WaybillListAdapter +import com.dahe.gldriver.callback.OnSearchListener import com.dahe.gldriver.databinding.FragmentWaybillBinding import com.dahe.gldriver.databinding.FragmentWaybillListBinding +import com.dahe.gldriver.net.BaseObserver +import com.dahe.gldriver.net.DataManager +import com.dahe.gldriver.net.RxHttpCallBack +import com.dahe.gldriver.utils.OrderUtils +import com.dahe.glex.bean.OrderBean import com.dahe.glex.bean.WayBillBean import com.dahe.mylibrary.base.BaseFragment +import com.dahe.mylibrary.callback.RefreshCallBack +import com.dahe.mylibrary.net.CommonResponseBean +import com.dahe.mylibrary.recycleviewswipe.RecycleViewDivider +import com.dahe.mylibrary.utils.ConvertUtils +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import io.reactivex.rxjava3.schedulers.Schedulers /** * @ClassName AllWaybillFragment @@ -14,30 +30,90 @@ import com.dahe.mylibrary.base.BaseFragment * @Date 2024/1/24 14:06 * @Description TODO */ -class AllWaybillFragment : BaseFragment() { +class AllWaybillFragment : BaseFragment(), RefreshCallBack, OnSearchListener { + lateinit var adapter: WaybillListAdapter override fun onFragmentVisibleChange(isVisible: Boolean) { } override fun onFragmentFirstVisible() { - var datas = mutableListOf( - WayBillBean(), - WayBillBean(), - WayBillBean(), - WayBillBean(), - WayBillBean(), - WayBillBean(), - WayBillBean(), - WayBillBean() - ) - var adapter = binding.recyclerView.run { - layoutManager = LinearLayoutManager(mContext,RecyclerView.VERTICAL,false) - setHasFixedSize(true) - adapter = WaybillListAdapter() - adapter as WaybillListAdapter + binding.run { + setRefresh(refresh, this@AllWaybillFragment) + adapter = recyclerView.run { + layoutManager = LinearLayoutManager(mContext, RecyclerView.VERTICAL, false) + addItemDecoration( + RecycleViewDivider( + LinearLayout.VERTICAL, + ConvertUtils.dp2px(8.0f), + Color.TRANSPARENT + ) + ) + + adapter = WaybillListAdapter() + // 打开空布局功能 + (adapter as WaybillListAdapter).isStateViewEnable = true + adapter as WaybillListAdapter + } } - adapter.submitList(datas) + initData() } + + override fun getRefreshDate(stat: Int, page: Int, count: Int) { + initData() + } + + override fun onSearchClick(search: String) { + initData(search) + } + + private fun initData(search: String = "") { + DataManager.getInstance() + .selectMyWaybillList(mRefreshPage, mRefreshCount, searchValue = search) + .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) + .subscribe(BaseObserver(mContext, object : RxHttpCallBack>() { + override fun onSuccess(t: CommonResponseBean>) { + super.onSuccess(t) + + if (mRefreshPage === 1) { + if (t.data.size == 0) { + adapter.submitList(null) + adapter.setStateViewLayout(mContext, R.layout.empty_view) + } else { + adapter?.submitList(t.data) + } + } else { + adapter?.addAll(t.data) + } + setFinishRefresh( + binding.refresh, + t.total > mRefreshPage * mRefreshCount + ) + } + + override fun onCodeError( + mContext: Context?, + t: CommonResponseBean> + ) { + super.onCodeError(mContext, t) + setFinishRefresh( + binding.refresh, + true + ) + mContext?.let { adapter.setStateViewLayout(it, R.layout.empty_view) } + } + + override fun onFailure(mContext: Context?, e: Throwable) { + super.onFailure(mContext, e) + setFinishRefresh( + binding.refresh, + true + ) + mContext?.let { adapter.setStateViewLayout(it, R.layout.empty_view) } + } + })) + } + + } \ No newline at end of file diff --git a/app/src/main/java/com/dahe/gldriver/ui/waybill/fragment/CancelWaybillFragment.kt b/app/src/main/java/com/dahe/gldriver/ui/waybill/fragment/CancelWaybillFragment.kt new file mode 100644 index 0000000..a063ac1 --- /dev/null +++ b/app/src/main/java/com/dahe/gldriver/ui/waybill/fragment/CancelWaybillFragment.kt @@ -0,0 +1,113 @@ +package com.dahe.gldriver.ui.waybill.fragment + +import android.content.Context +import android.graphics.Color +import android.widget.LinearLayout +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.dahe.gldriver.R +import com.dahe.gldriver.adapter.WaybillListAdapter +import com.dahe.gldriver.callback.OnSearchListener +import com.dahe.gldriver.databinding.FragmentWaybillBinding +import com.dahe.gldriver.databinding.FragmentWaybillListBinding +import com.dahe.gldriver.net.BaseObserver +import com.dahe.gldriver.net.DataManager +import com.dahe.gldriver.net.RxHttpCallBack +import com.dahe.gldriver.utils.OrderUtils +import com.dahe.glex.bean.OrderBean +import com.dahe.glex.bean.WayBillBean +import com.dahe.mylibrary.base.BaseFragment +import com.dahe.mylibrary.callback.RefreshCallBack +import com.dahe.mylibrary.net.CommonResponseBean +import com.dahe.mylibrary.recycleviewswipe.RecycleViewDivider +import com.dahe.mylibrary.utils.ConvertUtils +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import io.reactivex.rxjava3.schedulers.Schedulers + +/** + * @ClassName AllWaybillFragment + * @Author 用户 + * @Date 2024/1/24 14:06 + * @Description 取消运单 + */ +class CancelWaybillFragment : BaseFragment(), RefreshCallBack , + OnSearchListener { + + + lateinit var adapter: WaybillListAdapter + + override fun onFragmentVisibleChange(isVisible: Boolean) { + + } + + override fun onFragmentFirstVisible() { + binding.run { + setRefresh(refresh, this@CancelWaybillFragment) + adapter = recyclerView.run { + layoutManager = LinearLayoutManager(mContext, RecyclerView.VERTICAL, false) + addItemDecoration( + RecycleViewDivider( + LinearLayout.VERTICAL, + ConvertUtils.dp2px(8.0f), + Color.TRANSPARENT + ) + ) + adapter = WaybillListAdapter() + // 打开空布局功能 + (adapter as WaybillListAdapter).isStateViewEnable = true + adapter as WaybillListAdapter + } + } + initData() + } + + override fun getRefreshDate(stat: Int, page: Int, count: Int) { + initData() + } + + override fun onSearchClick(search: String) { + initData(search) + } + + private fun initData(search: String = "") { + DataManager.getInstance().selectMyWaybillList(mRefreshPage, mRefreshCount, "103000",search) + .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) + .subscribe(BaseObserver(mContext, object : RxHttpCallBack>() { + override fun onSuccess(t: CommonResponseBean>) { + super.onSuccess(t) + if (mRefreshPage === 1) { + if (t.data.size==0){ + adapter.submitList(null) + adapter.setStateViewLayout(mContext, R.layout.empty_view) + }else{ + adapter?.submitList(t.data) + } + } else { + adapter?.addAll(t.data) + } + setFinishRefresh( + binding.refresh, + t.total > mRefreshPage * mRefreshCount + ) + } + + override fun onCodeError(mContext: Context?, t: CommonResponseBean>) { + super.onCodeError(mContext, t) + setFinishRefresh( + binding.refresh, + true + ) + mContext?.let { adapter.setStateViewLayout(it, R.layout.empty_view) } + } + + override fun onFailure(mContext: Context?, e: Throwable) { + super.onFailure(mContext, e) + setFinishRefresh( + binding.refresh, + true + ) + mContext?.let { adapter.setStateViewLayout(it, R.layout.empty_view) } + } + })) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/dahe/gldriver/ui/waybill/fragment/WaitAppraiseFragment.kt b/app/src/main/java/com/dahe/gldriver/ui/waybill/fragment/WaitAppraiseFragment.kt new file mode 100644 index 0000000..09b1d4e --- /dev/null +++ b/app/src/main/java/com/dahe/gldriver/ui/waybill/fragment/WaitAppraiseFragment.kt @@ -0,0 +1,113 @@ +package com.dahe.gldriver.ui.waybill.fragment + +import android.content.Context +import android.graphics.Color +import android.widget.LinearLayout +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.dahe.gldriver.R +import com.dahe.gldriver.adapter.WaybillListAdapter +import com.dahe.gldriver.callback.OnSearchListener +import com.dahe.gldriver.databinding.FragmentWaybillBinding +import com.dahe.gldriver.databinding.FragmentWaybillListBinding +import com.dahe.gldriver.net.BaseObserver +import com.dahe.gldriver.net.DataManager +import com.dahe.gldriver.net.RxHttpCallBack +import com.dahe.gldriver.utils.OrderUtils +import com.dahe.glex.bean.OrderBean +import com.dahe.glex.bean.WayBillBean +import com.dahe.mylibrary.base.BaseFragment +import com.dahe.mylibrary.callback.RefreshCallBack +import com.dahe.mylibrary.net.CommonResponseBean +import com.dahe.mylibrary.recycleviewswipe.RecycleViewDivider +import com.dahe.mylibrary.utils.ConvertUtils +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import io.reactivex.rxjava3.schedulers.Schedulers + +/** + * @ClassName AllWaybillFragment + * @Author 用户 + * @Date 2024/1/24 14:06 + * @Description 待评价 + */ +class WaitAppraiseFragment : BaseFragment() , RefreshCallBack , + OnSearchListener { + + + lateinit var adapter: WaybillListAdapter + + override fun onFragmentVisibleChange(isVisible: Boolean) { + + } + + override fun onFragmentFirstVisible() { + binding.run { + setRefresh(refresh, this@WaitAppraiseFragment) + adapter = recyclerView.run { + layoutManager = LinearLayoutManager(mContext, RecyclerView.VERTICAL, false) + addItemDecoration( + RecycleViewDivider( + LinearLayout.VERTICAL, + ConvertUtils.dp2px(8.0f), + Color.TRANSPARENT + ) + ) + adapter = WaybillListAdapter() + // 打开空布局功能 + (adapter as WaybillListAdapter).isStateViewEnable = true + adapter as WaybillListAdapter + } + } + initData() + } + + override fun getRefreshDate(stat: Int, page: Int, count: Int) { + initData() + } + + override fun onSearchClick(search: String) { + initData(search) + } + + private fun initData(search: String = "") { + DataManager.getInstance().selectMyWaybillList(mRefreshPage,mRefreshCount,"102080",search) + .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) + .subscribe(BaseObserver(mContext, object : RxHttpCallBack>() { + override fun onSuccess(t: CommonResponseBean>) { + super.onSuccess(t) + if (mRefreshPage === 1) { + if (t.data.size==0){ + adapter.submitList(null) + adapter.setStateViewLayout(mContext, R.layout.empty_view) + }else{ + adapter?.submitList(t.data) + } + } else { + adapter?.addAll(t.data) + } + setFinishRefresh( + binding.refresh, + t.total > mRefreshPage * mRefreshCount + ) + } + + override fun onCodeError(mContext: Context?, t: CommonResponseBean>) { + super.onCodeError(mContext, t) + setFinishRefresh( + binding.refresh, + true + ) + mContext?.let { adapter.setStateViewLayout(it, R.layout.empty_view) } + } + + override fun onFailure(mContext: Context?, e: Throwable) { + super.onFailure(mContext, e) + setFinishRefresh( + binding.refresh, + true + ) + mContext?.let { adapter.setStateViewLayout(it, R.layout.empty_view) } + } + })) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/dahe/gldriver/ui/waybill/fragment/WaitLoadFragment.kt b/app/src/main/java/com/dahe/gldriver/ui/waybill/fragment/WaitLoadFragment.kt new file mode 100644 index 0000000..fe0f068 --- /dev/null +++ b/app/src/main/java/com/dahe/gldriver/ui/waybill/fragment/WaitLoadFragment.kt @@ -0,0 +1,113 @@ +package com.dahe.gldriver.ui.waybill.fragment + +import android.content.Context +import android.graphics.Color +import android.widget.LinearLayout +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.dahe.gldriver.R +import com.dahe.gldriver.adapter.WaybillListAdapter +import com.dahe.gldriver.callback.OnSearchListener +import com.dahe.gldriver.databinding.FragmentWaybillBinding +import com.dahe.gldriver.databinding.FragmentWaybillListBinding +import com.dahe.gldriver.net.BaseObserver +import com.dahe.gldriver.net.DataManager +import com.dahe.gldriver.net.RxHttpCallBack +import com.dahe.gldriver.utils.OrderUtils +import com.dahe.glex.bean.OrderBean +import com.dahe.glex.bean.WayBillBean +import com.dahe.mylibrary.base.BaseFragment +import com.dahe.mylibrary.callback.RefreshCallBack +import com.dahe.mylibrary.net.CommonResponseBean +import com.dahe.mylibrary.recycleviewswipe.RecycleViewDivider +import com.dahe.mylibrary.utils.ConvertUtils +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import io.reactivex.rxjava3.schedulers.Schedulers + +/** + * @ClassName AllWaybillFragment + * @Author 用户 + * @Date 2024/1/24 14:06 + * @Description 待装货 + */ +class WaitLoadFragment : BaseFragment(), RefreshCallBack , OnSearchListener { + + + lateinit var adapter: WaybillListAdapter + + override fun onFragmentVisibleChange(isVisible: Boolean) { + + } + + override fun onFragmentFirstVisible() { + binding.run { + setRefresh(refresh, this@WaitLoadFragment) + adapter = recyclerView.run { + layoutManager = LinearLayoutManager(mContext, RecyclerView.VERTICAL, false) + addItemDecoration( + RecycleViewDivider( + LinearLayout.VERTICAL, + ConvertUtils.dp2px(8.0f), + Color.TRANSPARENT + ) + ) + adapter = WaybillListAdapter()// 打开空布局功能 + (adapter as WaybillListAdapter).isStateViewEnable = true + adapter as WaybillListAdapter + } + } + initData() + } + + override fun getRefreshDate(stat: Int, page: Int, count: Int) { + initData() + } + + override fun onSearchClick(search: String) { + initData(search) + } + + private fun initData(search: String = "") { + DataManager.getInstance().selectMyWaybillList(mRefreshPage,mRefreshCount,"102040",search) + .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) + .subscribe(BaseObserver(mContext, object : RxHttpCallBack>() { + override fun onSuccess(t: CommonResponseBean>) { + super.onSuccess(t) + if (mRefreshPage === 1) { + if (t.data.size==0){ + adapter.submitList(null) + adapter.setStateViewLayout(mContext, R.layout.empty_view) + }else{ + adapter?.submitList(t.data) + } + } else { + adapter?.addAll(t.data) + } + setFinishRefresh( + binding.refresh, + t.total > mRefreshPage * mRefreshCount + ) + } + + override fun onCodeError(mContext: Context?, t: CommonResponseBean>) { + super.onCodeError(mContext, t) + setFinishRefresh( + binding.refresh, + true + ) + mContext?.let { adapter.setStateViewLayout(it, R.layout.empty_view) } + } + + override fun onFailure(mContext: Context?, e: Throwable) { + super.onFailure(mContext, e) + setFinishRefresh( + binding.refresh, + true + ) + mContext?.let { adapter.setStateViewLayout(it, R.layout.empty_view) } + } + })) + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/dahe/gldriver/ui/waybill/fragment/WaitUnLoadFragment.kt b/app/src/main/java/com/dahe/gldriver/ui/waybill/fragment/WaitUnLoadFragment.kt new file mode 100644 index 0000000..0c7c211 --- /dev/null +++ b/app/src/main/java/com/dahe/gldriver/ui/waybill/fragment/WaitUnLoadFragment.kt @@ -0,0 +1,116 @@ +package com.dahe.gldriver.ui.waybill.fragment + +import android.content.Context +import android.graphics.Color +import android.widget.LinearLayout +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.dahe.gldriver.R +import com.dahe.gldriver.adapter.WaybillListAdapter +import com.dahe.gldriver.callback.OnSearchListener +import com.dahe.gldriver.databinding.FragmentWaybillBinding +import com.dahe.gldriver.databinding.FragmentWaybillListBinding +import com.dahe.gldriver.net.BaseObserver +import com.dahe.gldriver.net.DataManager +import com.dahe.gldriver.net.RxHttpCallBack +import com.dahe.gldriver.utils.OrderUtils +import com.dahe.glex.bean.OrderBean +import com.dahe.glex.bean.WayBillBean +import com.dahe.mylibrary.base.BaseFragment +import com.dahe.mylibrary.callback.RefreshCallBack +import com.dahe.mylibrary.net.CommonResponseBean +import com.dahe.mylibrary.recycleviewswipe.RecycleViewDivider +import com.dahe.mylibrary.utils.ConvertUtils +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import io.reactivex.rxjava3.schedulers.Schedulers + +/** + * @ClassName AllWaybillFragment + * @Author 用户 + * @Date 2024/1/24 14:06 + * @Description 待卸货 + */ +class WaitUnLoadFragment : BaseFragment(), RefreshCallBack , + OnSearchListener { + + + lateinit var adapter: WaybillListAdapter + + override fun onFragmentVisibleChange(isVisible: Boolean) { + + } + + override fun onFragmentFirstVisible() { + binding.run { + setRefresh(refresh, this@WaitUnLoadFragment) + adapter = recyclerView.run { + layoutManager = LinearLayoutManager(mContext, RecyclerView.VERTICAL, false) + addItemDecoration( + RecycleViewDivider( + LinearLayout.VERTICAL, + ConvertUtils.dp2px(8.0f), + Color.TRANSPARENT + ) + ) + adapter = WaybillListAdapter() + // 打开空布局功能 + (adapter as WaybillListAdapter).isStateViewEnable = true + adapter as WaybillListAdapter + } + } + initData() + } + + override fun getRefreshDate(stat: Int, page: Int, count: Int) { + initData() + } + + override fun onSearchClick(search: String) { + initData(search) + } + + private fun initData(search: String = "") { + DataManager.getInstance().selectMyWaybillList(mRefreshPage, mRefreshCount, "102050",search) + .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) + .subscribe(BaseObserver(mContext, object : RxHttpCallBack>() { + override fun onSuccess(t: CommonResponseBean>) { + super.onSuccess(t) + if (mRefreshPage === 1) { + if (t.data.size==0){ + adapter.submitList(null) + adapter.setStateViewLayout(mContext, R.layout.empty_view) + }else{ + adapter?.submitList(t.data) + } + } else { + adapter?.addAll(t.data) + } + setFinishRefresh( + binding.refresh, + t.total > mRefreshPage * mRefreshCount + ) + } + + override fun onCodeError( + mContext: Context?, + t: CommonResponseBean> + ) { + super.onCodeError(mContext, t) + setFinishRefresh( + binding.refresh, + true + ) + mContext?.let { adapter.setStateViewLayout(it, R.layout.empty_view) } + } + + override fun onFailure(mContext: Context?, e: Throwable) { + super.onFailure(mContext, e) + setFinishRefresh( + binding.refresh, + true + ) + mContext?.let { adapter.setStateViewLayout(it, R.layout.empty_view) } + } + })) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/dahe/gldriver/utils/CommonPopUtils.kt b/app/src/main/java/com/dahe/gldriver/utils/CommonPopUtils.kt new file mode 100644 index 0000000..d9ac553 --- /dev/null +++ b/app/src/main/java/com/dahe/gldriver/utils/CommonPopUtils.kt @@ -0,0 +1,17 @@ +package com.dahe.gldriver.utils + +import com.dahe.mylibrary.base.SingletonNoPHolder + +/** + * @ClassName CommonPopUtils + * @Author john + * @Date 2024/3/5 15:48 + * @Description TODO + */ +class CommonPopUtils private constructor(){ + + companion object : SingletonNoPHolder(::CommonPopUtils) + + + +} \ No newline at end of file diff --git a/app/src/main/java/com/dahe/gldriver/utils/GDLocationUtils.kt b/app/src/main/java/com/dahe/gldriver/utils/GDLocationUtils.kt new file mode 100644 index 0000000..e645923 --- /dev/null +++ b/app/src/main/java/com/dahe/gldriver/utils/GDLocationUtils.kt @@ -0,0 +1,70 @@ +package com.dahe.gldriver.utils + +import android.content.Context +import com.amap.api.location.AMapLocationClient +import com.amap.api.location.AMapLocationClientOption +import com.amap.api.location.AMapLocationListener + + + +class GDLocationUtils private constructor(){ + + //声明AMapLocationClient类对象 + var mLocationClient : AMapLocationClient?= null; + + //声明AMapLocationClientOption对象 + var mLocationOption: AMapLocationClientOption? = null + + + companion object{ + val instance = Holder.holder + } + + object Holder { + val holder = GDLocationUtils() + } + + fun getLocation(ctx : Context,mLocationListener : AMapLocationListener){ + //初始化定位 + mLocationClient = AMapLocationClient(ctx) + //设置定位回调监听 + mLocationClient?.setLocationListener(mLocationListener) + //初始化AMapLocationClientOption对象 + mLocationOption = AMapLocationClientOption() + + /** + * 设置定位场景,目前支持三种场景(签到、出行、运动,默认无场景) + */ + mLocationOption?.setLocationPurpose(AMapLocationClientOption.AMapLocationPurpose.SignIn) + + + //设置定位模式为AMapLocationMode.Hight_Accuracy,高精度模式。 + mLocationOption?.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy) +// mLocationOption?.setLocationMode(AMapLocationClientOption.AMapLocationMode.Battery_Saving) + + //获取一次定位结果: + //该方法默认为false。 + mLocationOption?.setOnceLocation(true) + + //获取最近3s内精度最高的一次定位结果: +//设置setOnceLocationLatest(boolean b)接口为true,启动定位时SDK会返回最近3s内精度最高的一次定位结果。如果设置其为true,setOnceLocation(boolean b)接口也会被设置为true,反之不会,默认为false。 + mLocationOption?.setOnceLocationLatest(true) + + //设置是否允许模拟位置,默认为true,允许模拟位置 + mLocationOption?.setMockEnable(true) + + //给定位客户端对象设置定位参数 + mLocationClient?.setLocationOption(mLocationOption); + if(null != mLocationClient){ + mLocationClient?.setLocationOption(mLocationOption); + //设置场景模式后最好调用一次stop,再调用start以保证场景模式生效 + mLocationClient?.stopLocation() + mLocationClient?.startLocation() + } + } + fun stopLocation(){ + if(null != mLocationClient){ + mLocationClient?.stopLocation() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/dahe/gldriver/utils/LocationUtils.kt b/app/src/main/java/com/dahe/gldriver/utils/LocationUtils.kt new file mode 100644 index 0000000..c332141 --- /dev/null +++ b/app/src/main/java/com/dahe/gldriver/utils/LocationUtils.kt @@ -0,0 +1,67 @@ +package com.dahe.gldriver.utils + +import com.amap.api.maps2d.AMapException +import com.amap.api.maps2d.model.LatLng +import com.dahe.mylibrary.base.SingletonNoPHolder + +/** + * @ClassName LocationUtils + * @Author john + * @Date 2024/3/4 15:53 + * @Description TODO + */ +class LocationUtils private constructor() { + + companion object : SingletonNoPHolder(::LocationUtils) + + + fun getDistance(var0: LatLng?, var1: LatLng?): String { + return if (var0 != null && var1 != null) { + try { + var var2: Double = var0.longitude + var var4: Double = var0.latitude + var var6: Double = var1.longitude + var var8: Double = var1.latitude + var2 *= 0.01745329251994329 + var4 *= 0.01745329251994329 + var6 *= 0.01745329251994329 + var8 *= 0.01745329251994329 + val var10 = Math.sin(var2) + val var12 = Math.sin(var4) + val var14 = Math.cos(var2) + val var16 = Math.cos(var4) + val var18 = Math.sin(var6) + val var20 = Math.sin(var8) + val var22 = Math.cos(var6) + val var24 = Math.cos(var8) + val var28 = DoubleArray(3) + val var29 = DoubleArray(3) + var28[0] = var16 * var14 + var28[1] = var16 * var10 + var28[2] = var12 + var29[0] = var24 * var22 + var29[1] = var24 * var18 + var29[2] = var20 + String.format( + "%.2f", (Math.asin( + Math.sqrt( + (var28[0] - var29[0]) * (var28[0] - var29[0]) + + (var28[1] - var29[1]) * (var28[1] - var29[1]) + (var28[2] - var29[2]) * (var28[2] - var29[2]) + ) / 2.0 + ) + * 1.27420015798544E7).toFloat() / 1000 + ) + } catch (var26: Throwable) { + var26.printStackTrace() + "0.00" + } + } else { + try { + throw AMapException("非法坐标值") + } catch (var27: AMapException) { + var27.printStackTrace() + "0.00" + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/dahe/gldriver/utils/OrderUtils.kt b/app/src/main/java/com/dahe/gldriver/utils/OrderUtils.kt new file mode 100644 index 0000000..3813108 --- /dev/null +++ b/app/src/main/java/com/dahe/gldriver/utils/OrderUtils.kt @@ -0,0 +1,67 @@ +package com.dahe.gldriver.utils + +import com.dahe.mylibrary.base.SingletonNoPHolder + +/** + * @ClassName OrderUtils + * @Author john + * @Date 2024/3/4 14:48 + * @Description 订单状态转换 + */ +class OrderUtils private constructor() { + + companion object : SingletonNoPHolder(::OrderUtils) + + + fun getOrderStatu(statu: String): String { + return when (statu) { + "102010" -> "草稿箱" + "102020" -> "待调度" + "102030" -> "待接单" + "102040" -> "待装货" + "102050" -> "待卸货" + "102060" -> "待签收" + "102070" -> "待结算" + "102080" -> "待评价" + "103000" -> "已取消" + else -> { + "" + } + } + } + + + fun getNextByStatu(statu: String): String { + return when (statu) { + "102010" -> "草稿箱" + "102020" -> "待调度" + "102030" -> "去接单" + "102040" -> "去装货" + "102050" -> "去卸货" + "102060" -> "待签收" + "102070" -> "待结算" + "102080" -> "去评价" + "103000" -> "已取消" + else -> { + "" + } + } + } + + fun getStatuByString(statu: String): String { + return when (statu) { + "草稿箱" -> "102010" + "待调度" -> "102020" + "待接单" -> "102030" + "待装货" -> "102040" + "待卸货" -> "102050" + "待签收" -> "102060" + "待结算" -> "102070" + "待评价" -> "102080" + "已取消" -> "103000" + else -> { + "" + } + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-xxhdpi/cancel.png b/app/src/main/res/drawable-xxhdpi/cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..b63d7861f3bea04ce2f47e774dd27b9fa78e2821 GIT binary patch literal 739 zcmV<90v!E`P)Px%ok>JNRA@u(nBR*CQ545NTarXbVv{6lCCQKMCQ&5WS}W`K8?T%4$bX>h)3))d zy!ib)(zeRByP=gN$&a=rNs=}{lH|c0oz-+|x_4&o(9O)_+;hL@`#tB*xo1uTkv|QQ z^QRW@uQOO@pw2+a2>e$^s1cY3JS!PA*Y*{_bKslHP}Y4juof6pzT=>(UjST4 zqP^1C9Rm)#uzdwA0nR3lmKwleUra3^z*85luK>Ym0?z0eP2=8G z5${~i%(@f>IW}v|`$tOtg%4gH0fM(sGqK8m52%O_K2CvIN`9TOe~=W1y}*bkj&~JG z7!`cV8p_+Lyf8<;}o2_FNSqFN~w(1qjw86|vPpO8OhQq`sFWA6kImO;8crGss=mWAifv`6>jA^OA33 zmmzsx$%o?p8>i?!kVPWu3`G46L|uiVz6YYdiKFg?qV7hc{vU|?k1Xnc;^?OmM}VWI ze~4->bTS$D?N15#8ZB4$P@w zsB1aOd{oAjUtHv?Xs3OA2DQnPfuN2t*7002ovPDHLkV1hc)Tg?Cf literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/empty_content.png b/app/src/main/res/drawable-xxhdpi/empty_content.png new file mode 100644 index 0000000000000000000000000000000000000000..e6e89f8dc6cf3ebf0373f0c42ae9df6396a22c84 GIT binary patch literal 53870 zcmeFYXFQv2_&`|*~H+IdIB7&;j)+(iD5F|ELu}f;D zwu+)fC@Qh@zufoz|NTDCyXXD$yb#Hi>pae5e2?#O9A}a^Lw(IFm#$v=>#x7AXlrR0 z|Ml0IfYU$P3&52TD1IOK_qVUHrrKYXL)^cBOJdp@s!$Hj^##xMjc4I}e_H3}=XX_B zzI+)P913o=okx-Ga=CcYIHtb*`n-bnys?Is@x$b+V}{1Xi5ga=q^L4Ay0G3TEQ176 z%~kb`rIV@J{C*bzdSH-z?WXkGNhzH*4neDd_l5(7kmTkbVl^@GO+0>MX4i_WG zgso{P;7SFpIKG;_Wvkrq?Wl?f!)<{B?p)E$E*>(wMP9K?s@)^1^KNF?+M&u~`|vU^V?Pdv@r0bGsg%uV!1plaG}Ty2(@zrvX$Whx4!Tw#MRh!?lmI4=nmL zXV;VVV!Zc)Z1;w1Pqh^6=2-M3sBGudw+4pgSnb;coc#TZPk26Y1cLV-9ht~e*>z`*dG=s6`^+w+0C;$=I$9CT5$oRYy5La zVHy6($L|J~oO?)iut9MU#-96~Lrh)4^U+rRTmJM8uy zWla^K{eorC0X&qsYOM{`=!`;5u1l3pHEsS1h8@VS1tqtMQB>A;>XlRZ_Dc@|qvhg& z9IisQJ=))IUpszv7=hbX`Pj}Nho~~I|53RNIoMfc|1Fsk-xMucBpPf)k;krk=1bPB zwN$%Gk2F_gI!AnN3&pVnh7TK1aqQb4h5(s7(!hgz36Ar= zB)v|0&5j9V>g$`58}ia+Yt+K0q{Np;$4~XX(!2^9I6Jr^%m;U;)_vPJb~wQ#wRr*P z=>QPd7IRSCejGNl--Dqh94Ir{rQ7!Q;0&h1Rkx8v4G`~j@T`cHA*P8GZC%l7a~ou3 zWu{jrI-_M!V=JOkl}YVx9l$ToAN`g*)lcG7ze1HG9(+^wiP(N#ipulUss}#UL--bp zsj^42`>ysN%am3bwxqDKsUBPAR4!FovY~@5`8ZOWi1Dh;t5bR%N~bb(piQl(l6~W@ zIwl0ZNd<6p^(Vve*M+0`P?dcX;$~N$*~*Ipku9?#zQ70D*<|{R^s+=9If%q;WTnm> z_vWd?&qe{-ljC4$h(MM6jL()r5q>ID^avl(lk`nfnF|Q_oT@&ctCT6RF>jAYdS4T_ z36fha|9W}9knA#%$6th>Y!yMq&ysp;xH3JA#_sVD%0^$n%BPF`+qk7y;<3_L5Ce~s zyYvW6Kz+JG3d57d(8EghHWElC^pF2(&YUI=+nUO5Tk(t{#X#qT{ZB~m_Bg^0d;Ic1 zJ~-c?ugPfL7A!msyJ}%&?7<+7k(oxEw=G`g)vD`6NPz z9O2QrR=l%v(tq|;JRGPI-uWlr8FCf(`!@gZM=Kq(BsxocL9IxJ7nKRdOv(1aM~-r$~v3WrlA}cl2ZIMOS-S-TLzD| z4Jry8Jh{=f{b@y|zBM4wLf=ctzlS6=gxZOUZ?01O-DSqxaEzO5p6eRL=Wy41Low`T zvot-?wi8vlxn}c@E19hnb-R+hU|E2AS_V%8gz{V2FxjZu?4-e&efV*Cgxw;rsGg)K zBG_C*9MgN^z$2pA5J>KKkx@R}w>%V|KMctuheiAp-#m$#-cWp2Lm(fxyX2khe>?g{ z?HdRu_o!@cxCicrZhhGq7-SJ$^J}oiPMDkfK&2V7ce2+vcbbx(b-1*=2e$SMxX~S? zDPeSUnJ8D<@+jnK%k=7|v0dz*jtKi~yPz%eKtR?UBGy>S-+ZC2x*=kdIGR_&Znv~H zzf(b7U}&FLIVx@+{uZ$|T0`&N{F=Y1_wX!tv_~YTsEK0FOYM% zJp7Y&oq5(hS8{_QcmJN``_s3%SK9V_$L@E)-U^KNHo&Da-5i@@$F+RHnTKoQtux6x zsrs#pp_ajO;kCW+VGL@g&-u93^d$2~b6uO7)#3T0?7h1MUP2{3Zaiq~@m3mknef%N z%r=hp6`I@~1M247CWSgok)KtJU-DirIF3v@`BAl3Pwh%NU^q!kdPeU1*1E#wHKPb0 zv1t;4aWVW(3syVul@9;1U_w?Nu$^;@HDBGeN}s9s#RngQ`1Y3ZOVNBvT#iRrkYhr< z4RvxewA;NWWIa5!!aIG}zbVfcj|d!wV9NrV5M;1?xv21b*GcOSPP@{((}$yb&$e%P zJ>?P^x6wvnvgtRJ8urrJH$%3T4#FblcTUWx+x7e8&Ew!1{u2W7;InStZp6t=71I1+ zV0ed|atPUfv)M5x1KXsFosF;1F~E|3eN{jwp;Os{1+MSS_S zmyo2imwrUU*X9CLM;(9Br;=>r>53 zn^6rdBIX{vnN5oS_ET!+HIkHE&8E9@67_nm&_M6hmP#@~NdXw)s zjY?AaV|Gl$xBWccR8idhvT#=_bKu(a_#CD0>~`AT9dfN-VlhjVR!yc;Kyu=!|YUr#Ac|~QN`lncB9b;y< zwL#&@4gJ>V>`lUQSx|nhy;DCR?S)I?jlJ`#DeftD#t~Pj(Va=bzYikPBS;^rfY4?H z-ss+Yx5^OqGh>BZ-?*+KxX*%}H}GQAa1ZUXwXzmwlEbPKn7u6>0z-C}4nEIz&hMVZ z@13Pi_||ysug>nBs2u5?e9a3T&!e`_P^QY+u&u%fVi|>;s7`L}u zQ_oNDAI0TgqVD^>P~KWv)Gkyi!|EhAVvlq4I75`FovA)AD6@SfsikLhGrWH`lYwFv ze>a)yS0edBecu&qgXqv4XC%x1W1EQV#fZ)2A(ionlz-}hhf zt?>7m8}=~zHIgkXs?nvOcfh?LzLgNR!b$xTcw%+@DK_Go%tSXw`%*T5N1w2c?cvP> zQ+MjcK0cF8BfCT*SZS@yt{frf-xFbmo3}j*gmq=5>}8cUAmzrZKoJT|u$kgpvE%Ae zo-O&M88lh5ov8+ML6k!;d9RFimRF;FIf1j-*`JN8PCWjN8pgQ(#CvrvEf3<_F=g$^ z6$iV>AQOcb(ea+0;1`XV4JYUPeK254W%)}9!6r0l^M30|IMaI&Mld7 zOlZqck#%w!P2Xr?exh%#nXONwUq*DQchfD;_@mutY=;xQRd3{>GghTz12Hm#8Ksf( z-6RlY1qD-9+P)-&59iRV5T!5ZT$Jd2vJ z>A}YxWPX3Hp0Z-{TZYy-m9_YjqP(W~n5&L0j;Db!J_TO**694w@A+?`>_kc5j^bN+ zg?UAGbvZ>ahNaiiNm4b8zkJd`o*LDPBSFHtU0i~0+QhOe1sQ@`j`0}5Cs9l21~%Ki5;@^|4>VMXH4>)|_d(a>Z1x;C^Om);&oqUy4 z+}b~hn&0X=Vo~t{`eMzyoQ^HdI-x&I=84x-O7?kwB_8M~8s;&obeuG#f3wlZ!R0IA zjE6zxy5O2>tvUgXv5^PNFTr&XwLQ)+!>2=^4094KlsruZSOuJo%NEFqN} zKd}Jt+o7)icN|**u);&A1LpFenNKQQ}~McOxQD( zi&{nKJ%8LC7U5kTkseHu);{OD{-9QaG3gKEFr%t9W&nnRu}u3Q$`cW@4VD>}Sgpk? zo>~<=riH^i8j%l}%|O8WW*yj{0+nSpb5OJ5r;YO2UaR9~i!Rjuv+Y#AXWz-GqU}tX zJCpchGsedpPIl5K_A-MtCX)=qYQ zo<74K7VMeU)~Ll-2Nx)tv+#pi%?L4>B~75EknNrZhS4p;v#p|H&vwmifva|Hwabe? zMAwhwD^pzhSVp)!D;!-j5dnRd*x2GOSv0A|6~*0>5Js8{OH>NJ`x*o`El}XS$gIt% z@mgAs(d;6Vo|7hvX+?Kdq`5-~I8F|y4!nKUTT7?Wqi}B5X{NdPxQI$oqJH9Q-;8Rf z(i6)~+K;xHPe$4g-yKq(o$RM(S&7cVth&Z^Kt|w;<$j)%(~b}kD5k<1+Gi>P!KAZV z)fS0N_jh42RzAt5o`h&GA0zf(7QSdtNp?8e=4l7SdMwOZ*rl1hZ*l_?!p6Sh5C0)} z__?XKh)^~juPbeemv#$G=2BAnpmZ2>xYG9fv+lEnXiuO_TL8^+oasz!sL(MzsX4R} z8O*8jAzb@a(HtuGqo`+f-9SxUJeZ`)Q1i23m9v0lSxGK8jM5hyu|dRBb*ma9Hgl`y&PHs_9~87763u| zpXw0c`N-T8dhXQ+IdzwHxrv|hmFk$#KIZbc&o83pzVpX}`(6~WSvV!174`oLVL(?` zSK~&&%*;(=#+NUvGHOU+#?+uss%K`D6)8u3Eb;BXsll@mf2!J%wN*1+c84+>2bZba zHcH<3HcB^1L3B1A3`elgg9lU@Fi#)FMe#amXa4w=7@m3r@yZ zH~lb|wwbDysgZ7C_*GkzOZgmoI*i{rEuP(Lc*TWl^J;mTq0e;e*z(?24U1MN_TBRv zJ=H}-{wH&Oe66UeP(9y7hd0ob`=D7e`^nFoZ^@vzr49f#dYzA(&V z#>8x?Dy6|V94vOLGV%S7BiRF0suUQ3}~dg>}co0DNi z9+0Nn`BuhKp2Cp2tm@Cwl6Awc1wAm9g974Gs;*z9O2^B-I@galm-~A(Iic%gr6ZB$ zv%QwmHUzZ1xA>vo^yH}WqR5O~caYU-jlH^QDYrp#`IY((A)|?@D#?`UV)@}jxnCI1 z>(_@~=XG$+yq4x%3UPEsXV6+qHI&6(RbWyrOvbU9mBTTSBizQq0YYlTD_e$9C5%aR z@!c?+^KjR~Hep10bQ(!Q;!Z|8nv{RJJUyy7*QRZkJMZKVS?1)e%t3x$%U);1soUW?{zL|7tCfgYcnAt2q;3)OUxF}CtU)Qgn zabK6vK_=BDGI8ZdL^;WA(tcc>$qWt~gDJ8N%v&oGVr=9y0wZR9?qS(g!nUefe!t^8 zqzr}s&TCl;p`N5t!gm%*SJ)B{DcEmq)yE@v#oyF@Gdl|3Npqmm&q=xP*}hu5%v#;L zE`}=>RZv$!{H+x)rCR?HC*&!tYo)7Xdd@2Cfr+Q^^d&CWUV;XT##R4eJvMR3@R-Dv zUk`3qWDq6=P(|;e2)0j1(#`1}hb`QtIa-Nig2(QC06B}$9{PGMy-^9NnE0z(wBV=xUE_e4eyQKCe~)yXKH0Ap&m zRb)+Z>x^DB&kgso=;>m&t;{=-WC;CHWgFTVC_TTez<`fvjU|rDc*%qjiHm&lA-_yq z43yDI)ZA3jTw6lNoV7IO+^*I@S%x1ALwZnQhF^%f2^88aZmfC^X7$=|I7XwksG>SP zNSIeb$Ji5`AusU}@ra!o;E;ikq9#r!)pY5Uz!fE(PGXKl; zl4yS6nh$Y7>Kck{TZWwliI)m?wYYRywOLg)AcpxkScM_bwsZ;Qw+S0DB}uXFnp?w= zKHWNsyANmDObo)%wkJymz4+|o8N6b(+E~$8fRz%}TJd;}tKKViaLL#b#IA8(ugHJ= zC0n{66N7Vdla8cYxv-ni)N36H=a5c<2D6j`6H^_nj)|^o5v0pU8)ZtUv1$gz^A=1@ z{X~wN2k}>CJP}INH5Zg5t4$JD6UJ%vpSa2SfDK4Xag^AktB#?hoKwo6n9Uklb(uZN z*HxDSiWebYsW2Xlsf%@TWiQC^i!1s1gq|rWS_2~0US_nV#U59lA)IzeFe?UGehcwP zNG+KkNh|oI|CJ^)lQ+_?n735xsO(_ZlA#Nhu1EhWY9`Kcd@v`Na(0NJzvwFStHq~H zU4x{1v&cH>tTNp-T1%Y1)Rwt89L8;#QYMA!DJw~V$VrrzZRk0aN~IuTn;^I@FGOs? z6?@E-j@FaO(nqo5miC!`z-a{}1E}Wex~3Q!sjQ}6%YeJV=%HlHkCF`$RQe#=&)btb zF3}e_hQrDOIQK6oYr7E-Fo(@u;n-Pc3n%+Yr3$b=0wS1bDeUL!U?Diw%d~5lDI)Q5 zW9f=El+g^OIki-FS%KNEhOr|6q>2*~NGvBwR5Z8=@s{(ad_BNqOe7XouIkMWk7Y?r zWVNoXHk68b_00XTM#W0RXE#`k198l>xmqJt#H%ZA3_;^ejm|-el1-x>-7O}uI@Q0* z>V)0OJuNJg&hPftkO)Hg5N)?A;If}~d8uE%shd?z#<*u-X$e2lZ!!_X)-3Jb*GOn; z0KZ~sefgj%+Z1EPC1(@-`;jKg%GioB3@C$Lz^t9~;o=pWj0p?kS6%{A1glKNex!9lwd53b@IjhsTn(r7K3#7zZDk-;TTpw{ECBTEp| zmPk=XxiAqea`K=?5xV;k8=%DOuRO|{{_^$L5nm-nGtUa>V!lWj?`7txf=cN~6tB*C zPeV;b)>&P`M-3)pPbmhGO3T%J4J+};5l}fMJ_X7Q4iItHWCm%NRXl(r0w!%5UPCgS zO3zy18qw8Pm7X}p-H9Ckc`<7iKoPQh(bfh)=ry3g2WD7ih^06O%A+RO=$mk#jbqKt zX)_R{*BV?*%%H2{FPjAm8^=16r2li5}b0vW7+REEnU zdW)9GXxHtUL&bGzVV;H^&LP4Lv|ENY)VVZ-Eopvd))LElRs=)$RHBouwq>TZMIvLo~sre`@^Fg9|me zLxzjo6>#0>nN+*HG%C6q;T6Dm?+KhZZwlw@aw7vQdTN@%x=D}^7E{sAIT`*)=iwqj z8(u31ft0RSKm$QrkOd%6U`!oNOh%Yvdn76?9U65CDv69+=0I?+U~qO-C2}~&0Y}Ku zE>QwmQf?jxSQk`*kb}0Crj?ZiRY*yoD$FbCji6m*LnUb115+CaW6#uB<{0d%@fsD+ z+tRg~J5Ny!S8k_9pjs*1N-PSgQNF^rN_~HJ+=4L|-GE4)(YaKx{86v;`2`6KWc7U6 z-4d3+*##i2V(ciHzjh-tmJ65#5eS_tb&N%>C6-!5?sv;SyNC9!zn!e5SZ*Ft!z|oe zZ`Qi3D`9(XPOr_9DbLQC*h{B6K!u$QyXel|W*35@EzW6+$IA|+Kwz@H_naj;JFR2J zUQ1ZSzD@DuSbKlX0_kQQL-Axi5)2Yd7{u81%W+qjoEvU*@=HUZ4v(5%Pe@2#d8lD6&R!sK zgBvQ$l!l06rr@|HXIS7xM1Ez|_3IFOxPU6BSQR^~j>g50TImuxT8&V(bTKvYcwM89 ztV_lvKBZ|_MLq^uIB@8&I_QAj-Z|?`;4gCPcs%y#y`i(prD)^Yk`&qWl1rReWSMHe zxdUrDf+J2s2WkYmfJuLQBfjv91kCxOd>ooiwDt=URlw{^-w6d}5|FKgsoNG9!Yi#t zV@@$={s(N%2!S|o)YX9IhGY0fOEu@f^$Ql-Qk5@D3lXl!s1iZg4Z(b(j$V~cSJ9xV zhJc`!*jW*{J!9JCElc&caZzfaH4WcgI-y3@vBquh!g!3&|veREfu3t&1cTM#8ibSDYyjT_8?*e zH;U7AJB!X2G0Nzs`H0hBihl9JM*vs!nwj10J@nb6!;rCfN5Pk9F&dF;5WUBZ)$ci$ zjNe8kzc-W+K}uv2-y3#uID2u3h>PD@GImoHFDkRXDz4!+l>`&-gua!A#JQT5${Xp( z4$P%_PNj{Gnj46tJu5oHJUQrdgRdREBTTK#mtg`Fjg2m{scMX0ztZ{W96UVmZb+Og zo84h9i$TPac#MJ!Zh!K90kfIg8_2oNqDKfd5yVu%YYjEf&3wdrYYDh3r-pTzgQ>N6 zzp7!J1nUyNw6HBKnU#o%+*=1-f?vPMB$2}WkiElUzskd)FiaY9f_FsGJRJELj zj??S5HBM2QbiCPZTVrH0ncyrsiMuw?Ju%bJ_-tF(q4l;B#hs5Lsj|yu8?^CER5WDZ zN;k7rGKynDs8TW5($f8#!?>jaFAEd%(#UH%Sz+0XdGG*w~g-XkP#c1`4gV8M-&uInC-Z(L?3Z)PmGw=KoEv~3t^9I8R* z!k230!j|N68~xX)aEgbo57x|ow5A&yfAT zJFINX`kE4)WhL0a<&p!dkH!Jn<%B7wQdPm2u4oNst;pAJd`p-(Wm%?e-5H?cL;I7B zVis%`F=eG0957p12`qAY1yG0$Q0VTUMqC-9L<9B^?h2+u&qLf9#@-vpm@_W*=Nh4* z6@c7bF2Hfu`jwda(`g|B(ySPxA`HzF4$eF5JN2r|rYN>Do)M*G}#<98? z3K-o^i>6~5o?7W!?Y|RaDX8O4dP0Z7EZ&4@c*@4>BnZL<5NeH#s4&}gbh()9%S1~D z(>lVd&wv#D+JcxUBr~q)5mXpzWEt|bn^q_Tsaslt)HShwM+7D1W&m`<0q7(Nx}l+= zQCM(;arwRA@YLCxl7c$cWoi9mmJ0U(y^}982|Z-0G7?6=e1t?2c;DBksQ6OIbCD41 ztFb@-~tgK*w#sih)lh4Y#6^X6NI?D_H?~uOGaL zF#~J$7oj!c(71}bqn6DNP6cXcq|r*qMyZNazGODjac6i4gI;mO9j{ARx@$TDsi({W zXFR8RDUJgnEWw0Qy3467DFOh)4FE>wc8w~oh#4kpEymto#1D8WWyCV%)Wwd>Rb_V( zW?ztM=>%m1;*VS1%;X7ci?A{=tN)Tf^J4+CsysrgtEkLS9f}4( zrIZbdhWoB`u~RA%M)&*($PvrtYp1A`z`3)E=Yi*xYxjCo`l$!=+Xhs-I|(M;YBMZ( z7W+`u#$rawxg~yp_~mH3HqXY&-nE;WgaYHEy6Jev% z<=3d+HTNVVGVJ!xlf_tx?-|qZ`u}XpO56oRBcgm5fveo-qVJ03<=hp+sS3~o^oEF1 z<37E)%Ix%68XipFuNoS>#7{r8#h}uQKW3$NF#HZV@$V+;l~1+o9S!ApZuUi^aWM=0 z;sE^b0`#LPrVPoy&coV2y{O*aJAV)#`kOt-VX3r7_6;P`FcsL&;{UB4i6B4~nx&iZ zfU_DXCCKq;B+3ET!Fh^$ULY)6 zk~B;2xzp-5j-(?tWA_^KzQYxFK#C`HhrVv3yf+-}m7J&1ClV^VvL{s$p987a=l4hz z#dF!X;2RY&t=0Da&Il9{laZ!rpzBVu1Z-o74QkycPvq>N=fAIKt3|$6^`tLQdU&ZT z(j=SxFsI&Wr<9BU;BeXu4SZtFj8uz*vVdp;!XgtW)z?JKx6qI2Mki`3}$3BPpSr^G7-0a{S#L^AO zP+L`QoT}lat$?OoS}GxLu|9&P{X`Y3WYPQnj*fz*fb_Xkd3pII8@o=qFoh(=WvPj` z({oUr1Q9V5=EG^XTaWlA!7vp3x&BzWZMWHoK5~Tjg6cC^Onrr0@iM(Lf;o*aWn_sV zOo{3;QZz!$anlmwChjBw**b!yyLX`kknpjcUoG8Ht!RJ|8RGIWz;#rZD)0h@F(?L@ zgdzI$T8LwmhC3<$`ajD&YSITg3NQh<7~p2oN&n2oJrxCC2g{5JfV?KkFa+hv@SYit z%bdcr!>{y>mUKYV-7~&EQO>(;dcMtz>l>UpQnC*wYOk1j0Df>9w{)*6>BCcn!cTf8 zNR9CLR4%Zj1xKffGY!XQ0&TyeMT78x+vD?}gNeRSH_6+@gei4l8?CmNXVcNem&vynMGj;#| zh>KnTW>8=;#tjt)Z{884Qs#+fCl`|z2HLYV^XvoJxt7#i8RFNbEiOJhQBS@JY>3mSa?{ap>2HNl&$m(9zvoevgy#x>6|HOr{aOqhL?t-)BAkr@ zE1sMNEWBrP1y5x-`fayVOjSnirtMzf|Yt$Fex!0CHnJ(s{hulc#jw65s$AwWw2qyfh4$hSRp^H4YRN9M$=z0%U33y$`5 zH?->94Y{Hv%4l!UJ~m4ATwIr4k&(S%w+&M~cHX$ypOwnNsk0tEn0`J4z%~Ma0}10b z_oKXB`%n$!t>(m;A!3VhMe$VqlK|>n8~}2F()r)Zjz?7(GUGpaBIn~Hq)%w5^E}1> zx6^EzwX68BPN_gR3A-P*XY4{#-dl@%+ZfXJXF*wspYI3RFE-i{y(6A`@7Ww-DQ=l;I&}ozO90%mvLr7P zsw=<~AEWp;s(`XddvPiE{iP-TxojT;V7=1TTfLVr>BwAb%l!e}x-y0c887WgtiuzO z5;vf=jF+6(cFyKXad`Ip9@EA~9}n}j{$hzL_9`==8XE}E6MaqQ%tOgU=Pus0?*n;1 zC`a~fC({Vi+I4&&cBd4#{0Jb%e}P}-{Ua${#UO%{Z(kH#oWRA}Uwn1r?S^;5bw(Oh zdt=Bm_Y3{1&vuAvvVmWk6%WqMAIWUzM7$KuB}l{G9<~lXhT|hg{*~4IXF8mH^CVu8 zYVYRQsC}V-MS7#ky8Zpc&}80LFN@-CI=Gx%pv}@fRnkjw zF#zBYz!XE6;)p39Nq|G~!q32qr~hU{3Q%*@9seJCTmf3gg@0-eB~_JK{WQY= zssI;AMmh`C{$Cqr@iYA=9^L~^_R#;$CH&0hOk3FFY0vH(r}|9)qYwU$+=@)jGVkva;6ce`tXdJS`{x?4MWG@*C}oKc3bpZ4oOfhSBAOEe!p4s^MhZu!}-2xsm9t>`auc1G&j$+MRGPr7CrglJ4R!Bvl6SJ*P&OX`3mPE%PQz1CW*ai%Le5?yAFQX` z8vGQTi~rqqE6$*bTf?1ULRh?NV#WjnV7tEvK=!vMfYiLt_ch|=j4eZ+OI-Vyf@&dD zn46XnF^~VVX_1-kT!*0!qqeZ+VGAPad{)%?+8D_Y@*7aqE(j3e1c=C_!Cv&$?JM-87`&ztE|`$Z|RpH>3wa z@)>CW%WshIa#ngwoSoOeV0xVdWEqFUr0*i&@m)^9d)LIOkj&A{IG}W*lxUr&b0)E^ zVx=9xX{Hg}wZa*0sOtgZI~{`nnY|txZ=o^F+PG+-GG70Hp?NgrcC$V)8jMcJm%z%V zy#ZNW5$Q$%<6%Q>{D1SUNR;q~cwPlk;-x>JixC>!DOu(KMmJpNAQ~rfeC90%9OZKA zs4`j|YveZ4CtnQOpFT2mmeEmzQ|BSghXM&UcD6Di$OIVB#{n{Qh`Q0D--}4LZ)M_sHk0W{3jKgO#zn$;X3^6`Ef-Y z^f6jY3DN!{mLbjQ@~v)&goZjgvu?FS;6&gufm4R`0TUnv#DwW0EG_ejU?r>C>*~8D zr5G9qQ*Gpnj!0SJ$UP!(_$J~8c9X`Y0#L{Tpb#opCJ4&&a6mGP=+u$P@n~r$G`OOG z&`WzefeDr@Tj-Eb!sLDmSD>)~yg|px{P3|>K8Iz<*O=5%leJ%NlQFuT18il2Li*P; zUn8z#2$cZUDkuX=HyBF88W}T}3k`vj5~sTs`U&vQ2s0;KWCF)$qDfdOfS=RjQcVys zx9`h+4QmM_dZJn#`92gq_$DTy0gWqq+f|anWCgjQ@#Q?w1pb4zkBoFQ(S{qPs`i}V zcmgltorhH^(wXiyJEuLo`uYQ>ivU6f8=C(EkEX}#hLi^8gzIXcT5B;>Yb)_j@7lt<^qxw!&l!{ zwYWO@x5x*UWRr7(Mn{w)YVor!2ufr}N@m>Axhxq>U4eHv?S)WtL6kpgk=^rW2jv z!R}oS?dN45fG;ms1Dpf}4Scp<98!kV5tKJi16_td+!ebWgJ3SwU=+O^2k2p);0}Ks{TTJw3sVe9!%mMq8}P#GbDEvw0mEYeiRF zTrSIo=`uyfT@^FyzJKLL!b{?iGLTrOXP?Zf0>H$drVBJn67)zlJya{H8^I;VzE*Qx z+z5o}O0oY~7z34M(~WUn+RFJast=#RKsQRX`k~V40s{HKv5rP}b)_8GLeH70yV}|Q zwM15jn0wb_^JSoV+yR0M7iSVshBe+erP3kR!+YrY*hF;qJ+^M!D-ukyGro5|kpCmO zj)o;)R+)H210&@&hWtG{o6aD#FAl!=lC!iIkznq|!SUvHuc45>{%^qIQ-tv*D9FIw zMU-_R=RpATymnBR*D6VqgaJxD=w4lG+m*$K4t`KR$saEfukAH_>%?(0gYNbPkjn~u z=M}jd8PvXzb^azEIH1g`unb8QobzsY%~#{<-N7^D)s;9}qPAag4mcS3MyqNF5jYEg z@_E-yJIb5Dh*3x7y~X(1SB-&1%<)f|Rq2`=uNODTW8}y#Z40ahdtdw9RO~7aCfQkv zF!dc@r`%hqvvRWs9|Ie9^)^df=6%b;HoOvCH$HkwUW_x4nKNfJlQ_qjpo#=k`76dM zY5vcjX74F{SN20EoS@swt2!n2Z#$8*X6u;4vdxgqID@fN<>bI7g?ZdZgw2N-fRmJ+r&S!k1nz%5i3=u&m6IFyyElnH{O+k_Ef=<2>|CR(0x=C37pw>V z1LN?{UOhSQ?5TiGEJPxM&ce}2E2gZ(g5bY}Gf8^3l4>wkyJ@vH>7uE0xGq*uN@?}> zUtuwje`_!~uIFo2DmoDnM`>RfmKdJ0s&gZ$wQh!$H@9!S%-VhFsqEnWZf#WgkHBu& zW|%VHUSAG*xn<4W`(TM-?)TOTTeGjeLErn21~T*)`pYA?Yoh5QXXOulQA+%xcR`)m z=2~i3Zi-y!&sHcFU0Oy}JvElg4xjCjYX6f`d(1-}=WDjH3pgm?v)f!g%Qvwv2;Ho| zyZ>|1P1(7!e#V-NwJG&9TGSSeQ#tYMQfWhB>K~1_{Tx4((pNrcXbeH_LiLBvueB6) zk8VdEv{97v7><7EhvbyG#I_#|vkU|fqmLcJkH&&lGXj-)n`^zFu5AVGqmt&UJ-_tb zXpuh~y?u2_$Ea&Y$5Wb>hzeeC4BcawS8&O$p(|? z@+-@0RD4YLQr%?X_CB@A7`spXe>5- z(}k6l^PbE;>TDmJKdRbqq$Xj+*pU*zua5-sk!sO_5m)ASii76)mVQ7(v=XupMykSb zCY#~7ll50qI;hT)7ad}59714cZ~q&7Mxw=Eik;s&)Y@%c_1Da4f5d~|`ROUs`X@y( zczTnU59NLG0sjoY@2PS;xFmBFokF`LV1_$vU;MbW5ZK_m{idj-(eW+el4Gg};n=M{ zVgxn1y)t(!8%}yfP^Kv-L&|e+xBRh5+MDn-n3PJo3L7GiCK^c;Ef3w%cbfAFd^R=6 zK1OM!?1z3A4QxY<9nQD!k+bBSBL*UNdOz?UE@>XGelQ4H|Dlahf+)EX7Kt(b^0FDQ z7OmXtE8-xgyu=sVS6S>G#EfqUc5!G;&WgLZETP1Xj`@~ljxEBMGaFv?T<6BEe5_ue z<2#_`+lSZ&y^7dZ`7zvsiB%;I7kdR0d5V<}@Whe(%({XX9lVX+8gt3B6y4D1EnWDy zO}}c>uP^Vi!673*sl4&yk38SKPm5FpES*wjZ+Zayv~=m>(XYwEJOYLmM~WcJ1l_WH0O2@ zwG2w0&A<|edQZYbU`0*g8-+u-!;sZbX0c*$^Xeo;DbFRsZ}Tz~po7%`6~EP@9h1YX z;?<2*ef>P_e5?9+Dv_r~xpG+wYr+}tOrQ0-^=^H_G`6wi9t%tK-owX;%Wy`sj5G_T zbGjUz>9ds{&D*9&2Q>S6;m;XPm<^;u`y8_?Slx{0S{fLc-4@B0kES&D*Hn5@#rtO? zvUfEUf(6Q*(4>OLZ#fCh?`|d_F8h{nIzB8GRd6fwuaS8x`)#~N>SLFKVN$6GQQTM2 z@ow#sNVlhM>!aMznZ>|d;0tlz>^6>Z4d)8$N zch$D2Z*3mvCnMO&3vvK$hA87te$J^^A|%?Vhf(8+3@WS3RfBzL(GSrP_649j8rFw}Y2%a`ir{pp{eUCo$|?#&0p4xU?-YY`t=+i~YnQnz1zI zCAaRP4S{Ktbcprc0-8$;aH{qa)rG;<(SHzsSQ!!VZMS{XC5JNABR|2C#Gp5#%_Vq6 zt&sS=q~&i=oX%|Wdl|+v+4tc>Wjg$GP8Mp%H^kPise5q;z6vK+t zW5wuedGu5&(QGQ!;zLloij?E_@O2E9@+C+=7p_QNC#~$r7Au;p-v7?H8p&K}c&?Hu zZY@64RO2e;`K9dF(i>|N-G8SfM|0mjqgC>^xNO!Ny?z(QBo@npfXoW6 z3cu8ruy~ZhxBK<`y6wT!R`A|&-Pn6~#lpXM;POHqXDv>+@ZK^15?wngHK*76&{x#t zZhh&8NSDVu>CIPib{% zjh3NWw>U>=cfvUtyPxmbp1~=dIsfuY3pgWi|Ai;%lgx?h-pG99{0Yz3_@^zAT840) z=jSh+Lu}%g)0mezE3ISKcycFVB32DLhAarY%!lmtK?iSZkA~*CN-alRQU$m_vtjSQ z@Hj)e;XYjY*Eyg?g9|bWQ#ceqyc3sV;y)w#n#;J;gK18%;rT5gp42w=r%`iNa7DY7 z&zHX)%^$5^@j|_tn6ZVEjtZlqh?*o{0~!7yV~^S^LB1canXn1$c*Tf)R89pOZqzh{ zd}-e+jic_C>kWWK)52jt{p844IrDK$Z zX8!K7dN;qv-pmT_=B>8AcG4fFY@A!w4zD`eLAzS;c*Oo1+;3nIb@!u^2 z@mZ-Vho$ZZM`oF!T6^EOdy6hlADK~yILVlvcnrSR;){ItAwtUXPSY6+#^@HccjANh z7p`CI{VZ_ibr+Y#@(bGDGgfuC`jl=6I3`?KR=Qq{ySQ_opYf52J`xdm&@)(cPJ)n|R*Cc)NSdZ!nm^Ve`Yj--*SV zrgOzhcT76IDlmPtYB8HV^A_f3$!(_aMdH-QBIYdt2NJ6fF)# zioLnN=hwHgGHWu)WX){5uD$1+eJCnaOOWx7GozumDjmF2dQ{}n5GmXoyb{%Lz(L$} zHX^DvoHo&@J4}!$R9sZ&xb@s}L4$e?q8wixvm|Qx`(c#kVbwIOK9KYPY?GZpJKp1j ze1Ls}&SmtE`C(WBF1x!%%w3Md-#)!J#?Z*0JJWhxGeJs5o<24TGl?dvu~Qx(>1+x& zaF1?6i#c(R4v>z*Z<=5dX00J?QYc92z^hyU=l^=|PD`Qbon4b{|3Eg?F&X$+t$TV* zwC+8vtX}8t%ylz#nQ2WPc}jiOl#uyv7;0anx*;HKrh`#YN)k+1&l-c@JiQ_!Mz-44 z;qQ<>Cn|C^!l_zQ+Z!{wMmskrF4Euv#&NLU110eBPGR;)SS|$VM;wJEO=4l|KKcE= z*Zt=A*p}y8cSCDND}I0cdxLVjDDV*8vtziyJ8xcy$K$9mu2)J}%Ir%Bcrtu(02#ep z@w{2qEC+DFhfO=3P4A?B5*9bqV~Qjr8Fm~5fgm80GtngsqnVe1T<&#HrYY0l^PUMr zADIIx>=X2SZTM!5HuiS4yL+ys3oIE0lJw}#!{KZC`RUC`5e5N099}WMpOQxqu-$0h zP2_OhcO(e6K%IBdQ=p50!{ZzjaiwAE2~~?d!nD8W#PvP9egB+HiVq!3e45;x&4Ru2 z{hR^s-wv>+_BpD_D)aNE6|NO`{nKMxzW$^K7fb zwFwq}wr(fA@=5InAp_k%2e<^?~vdKB&ae4nqnV0 zGEt`eoBE|C$A4wc4?`K47oV1|VqhKPegKzx*8kEmpQ+wMgx29aUu5lilPc;y^G%1Nj~TrzKnN9Ltrzr_BAt zv;6mcE@gt$%4O#qec=8-Zv&(L<+3X^FD>dUDSR zQSB^}W>gS1{EPxY^B7O?2S5^Pfju3pZImXGQdr_N8WtCOjEI1++0v3YlY_nJ)s^wx ztb?oH9>WiNWDM#CrdT?NIVpKjFe4XL!0q%Of^hZ{()AR^lAxsq_(kzb|9S0)ykSRKC-Wor7 zfX1@QCH|)xF#kvrHm)(gUHby5ImBlIVm2U_5ia>ytn*rH|9ZJ zSVJXG68A5zChkFw)BccED{uQ)fSnyBX64l|qi5$sB38gfbf&M1G#)ZMV33EA4uJ*| zurWDEC`e^bz?;+<&ZYz{lEMPA6%d8Z&U?p3my`UfHtGln=X_q{d+navx}pTci><%GaQY zA^vjw`|;2kM!n>~XA3P)yoO=-8Q^!qi!u0{yS*gD8WFXcW(wczf@G0m=h=Z4h?rqy z2B)~|oAh#(DG3f2!)4^$5g(TGQq zyDtoNO`Tq=foBq3le?o1b*3zJ&&9kO!fU0i{kSD48VlWuUu;naDb#;yLJ0l&9T05! zv$5C~7>m(UtTJXG3mx(iaJG&z+rM^oQOsb>$^jOBguXpbqxz@oi%b*VW_{jepWL09 zEQ%}2yx@~;HVblG&>FXBVu~TMU`up}5zpB}Zx0gbL0I4IG{ttjaOBSK9Jc*SaD?~O zKSYdxw)`W4asd;eW^R#WPExr2`y4zC9)f!20QVF?EkZa1;wIgrE63kNjY+ba(-6&N zrV)ku19|-D{q{MKv#GJ|4(@ZTp|6pTZM;3g0!H_E5PXO)0gQI8LI@URuc+~;V(`-n zVe%zC>QI@V$Y?}#lsTOT$9D#X8Ex)HUChs!N(r3v*u?Y4CIAw-*r}|fM~vV=f(Ygn z@aPlngbtb=#Io~vAITZUk+Jls|Ji4a0MN2&vtz~0DiNYvTLnJXh-vvrUix~r32kjz z<=`*E5NdNbxCu2gfjNdh+S_szNd_rch)>dhYj9VvLMq`GdKHG@N|8e}HT*;ZIp*n) zlNy{n{o`M(tXsoxFQyv@eJ?S@N9y@wFKj1=s2p(JKsr4D?>Va(%}*iRAbQ9ZnF|Xf zL5R9QI&3-~C`BFeWdDg|ePtByLXo6M5SIhhJf=vnl!}|Mfn-LLpuR`Y&8vAuY;J80 zg~2twJm6f^_ptrA+VB=+Z8O2tIE;#VJ{2@821k8ku0cc{I*kTLNCTOKv7-g_ssskL z6ucBf3>NvC8<}%13W?dDPTb4Ug@iJ}WMUY)fD=R{0?0y@b$J|g81p|_8GO6C9jEck&~J#PF`~P$H`>o|yII*YDDW%le zUO$pqa+Mt9o$Nz~1w&N>)jQ=L&2c{o>YF_+$*@G#cl;T?)4o)gB%yIYNh(q_U=Rid zO=#OYO(Wk#T4Wk_4Bs)FE98)6YPgB~uD62gmu`Ke}|{aVb<+Z(Vye;Tv2Wtt49XyMt%<~U%cjsa?t zIC!iz9=jt)e<&le>L#v!$6p}3Q*2?wH8=Q4Lw@20Mht6V#Bc}&aeHm6NPYdbliQ~V z0?X{0yb9RXn6iXGM3}I-)dQ$adL>6hmeetgXn%ub3m76$qk_;~sbl9qHq9du8Ql*I zu;-bFuA4rg3Y3klu82pvLvMxbHM2eonSZgTMF)}q?iEmPG!$$iqG=!s;LLkv{&7@o z4rwH!rXYB@5Uv&m1-HYy>1xgy(ZBK-3NW}L8Q3bN;0SQf|HIi6YgZQZJ5Ol*2ob=8 zUi>T3e43ebM5PVX#*T^oeYE z6y`sBV1l95Dgv68MQi@^t;3b5ot@Kyp0E4H^HGTKR)l#$XGS+#0h@Fg^+C8f8u=$c z21*1RP>Nipy`X?6qq~A(6cav*fK;)pf_ehg0LcwQ1EBW4XrOv$4v7>H3P&62C7}X`6^hPu3Ll0# zNk!PE`3_Hr;HJv$Wm08Ew&g!M)708M5uU%c@A+z?W#VFi%s|!YWRFZLtx;gr4&e%WC#5+K zz}4FTCqyB$NAH^-j;79j%#;N?oFO!K_KwI0{=;n4<5HCe65_~2p{j+ej05+8I3~qh zj9NXiqy`x{xmLpU7?}zr#EOWqXcgm3RgAW|G>VxMR?g<0z_OX}BbAe=uT?gh3B0bq z;w(%E&vV}o(6<0|@bb)2VHhg~!&v9X%+Xr!MHbji*3Nf}tm}D|# z0m-%Mck&B>|q>Kpg{<^Tx-e!a7F_=P++e0(irvusV}sX>NDv-{H(TNfLn>@CI~=jl zUtY;kSUw*`2@?;7JA$l8g1c2?@wxhokj97>WelN7dit@X!z6$KfE0hC5{+zPK>>}; zCzy@~3JMftLf~2F<+M`SF6#8oXE4_(G%=ZdkQfpK7h^n${Q^hgL9V7a3NfhKpaN`; z2DmG=X@7X>0HH8;5Yhfmhr-`6SS5%1VN8={1a?VJpTm=#= zVrg;_vx{sZP3!UgR+)wJ6)))zPa8qOR&djVGNy%A|I_o%{joaZ`t}MWi`WaUk!!kv z4}H3FYuM&L_b$T&)YLNFmjJp~Qj2Z05kY{jL?sL#pdc78V*{8` zt0BrU#q{_5+nwI2-F?Qdsr4`LxW9jVl(-V)eA^Nb6z`esAZ#)3mvo62UJ&LW@iL~v zDgW(@_$!Qv0rJ(8Y^qpNZBn*UQu3W;zhDp#IxVq`CP$MnS8-0Ic=4&b6%b!5VO4Rs zhRRCneNvX!t1V2fFq)0iH{--8Cby!Hg(2J6_%2mYQ#FN}ohURzi3#Dpz`8()gr{H1 zvN%o(G*4rOT2g=|l?Xvp4d#u)qzaN`M@8aQoGM_|KqkqEZu&d}jBN3y@^W{VL|cfa zR`H>^CgCOT3~C1Ki)iU&U0Cz!kNd?Ijz;!hM8x|x!(;n%JR@iz7dxw>~qLEtE; z0UiDHVU2Lv@V~J+eB47w|Ek%J8sO5|!VzLl%OF>og$sQj_S(xh46OcNW`V;O>O~{3 z^Fa~A(i(A+CfFs2$32EWsuEtF=danc8L%iWf~6p2Tn=`}3iONkk&@Dx8DRiiw5SAB zBqpwbf*{QA7FwV1w7(<~MoTx3BMQf-g(2D^hgaZzup-JH>qqzOH`@vpqR05oq_R35 z!D7#KFW3NY&SloP!otrlyli4{{e4;Ic_W`o38sS~OS1`gzsT(Ro=N4vOBM&FwtM7J z2DaoNIvVN@&Q8Y8`kPB7HF~FcYUCe8yyU+4k)8sXhl#P+p_&3Z8i-B(k{MZW#3vN8 zj7I?8UMuH!yi5sU*+>2b#K69x>q~6!Lj_oR_g|*4a|f#oX*)EySQlg|xNX0y9sU`{ z;*4*Jt41KzM(4YmCW9r2XU!vHM!$duQ!-?py$OYzAt^`_UNM7;rvRQ=168pE|G>;- z;A4zAn-79d0YQAuEOTUrFM!+a?&=Tbp0SR6S-Qea8_cEY5~54E!fAt~Ga7`xz0?3{8 zZ{`Pz45%J8k}ZB|!CbJUqEC%69Pj@r}dLsMWS+`!t}6GY{25sf5Gyd%Yk(`#$s@J-;$)cfsD zRdSJNLh@{@i;eyzM{wP)7qU4)xaIp%Bx>-M@nzTU5c7ix(#j}>Plk)z#44jxqY;w) zvgdJZM=->mdrk_Zfz3oK$zOq=$7Cf8wSn;c9(HRwr9HQJn`Y1Z_rPZ&7)bnzY-e{- z(s<|W`_IogPR@=7uPA0usw7;ADU=B96F`Y42^y^NeUn6V7dHJv8tr39Nl_vlAgmCT z3?8aPD}zc$9ZcT@h1Z%VT#+g%h_y~c>kZ8+%$8S#7o+N^pF_9>^Uw7RhUfbvItBj4 zzPZNSgHOq6^3HwtNdQQwg+gldOWHiF;9W4A8Z+uZ!)K!PkttJ&-=1$5BF{epZBhP% z;oupu1DRDbZA(#g70Uy2gm?=*)wPGEi;eNX2hTpmb-~}X`5OnPrHOH8bYws{4l1T| zW`Jx3m~lnnAeV0b@sf2*X&1<8#=qV@CVJJFZPeJ|;vc`bLv#zLm>?^|$ifB14Gzv! zd#706znJla>TkB1u7Q6z>nVQ6o1NqP%+0|*8F+&saLf5NNeyF%#V~1g^Fqa;LLuD4 zqERypW$2I{1(qbK0fLF&a6|};5Nsk}2U`6$Eeu3=le01Y~-k z6kUppo{Z#00U!;PsyQP~@o?e0H$LN!CT>TH>jm|Ixcb0HoDT1^Lw$Rsp>gILVbUte z83oz-WAlbWVOT(sr6yPI2tx<7!13Qr$5oF#Z@xVu_gyMmudHlYI-G^Yb&id4RH^*M z&ZrvX_t0FdG)XBm{Mi9*zZ<)Xe|3xB*A4umc)rmw*f}Qe!Rg3TQYhRj3_1w@&|{U5 zX}P6(xKoaoH-g^W890tFq21!-Sr@SWo+4MORmzZHfq?)yOpsbKtRVd;lDtNTs+P+N z+_?LFOj!LjF*EnYA?VlscZV~W~$$K zSNIcF<0Tz#wQN{XZb3i5G+?ceB<+B&EKGApIhGqy@F^fc!vcOCr?n`VqaBt^xK#=1 zr>6+gK_2p0_0*o3g*b$}g?&`lQ4XbP5PRqSy`!TL(LF_4t5U&D-CzQ8_#0dGNlu6O^KvMID_0zxDUsQEnwb#HoMVP={APG|eK(;E1t7DHPVS-Ce zBjO{Yv{YvXdJ(BnMZXwT@GLDOoaN5ek$o->ag@>ss^ghM7?!Oj;mH zwl;DIzMOss@jiS^Kb1DNG%^C-CRKElnVaFM1af;l#Z8~zt4PmnE3Np|7=M&KX10ZO zU*n3S{W;x`+&s@XH3`wgs8s^H20AKL(7WNa_zZ7Wx5;1d+ChTmDxD2jsO0wA{NYRp z*evjLY{fijT=!uK;h&fgLnQ%{@W_8L(m5XS-+qtXb_c%Qcivq){9BNbOZbeck!hRo zSz69qx-48jT(Q9OgE87_aM&UXYPJ+UvA9p}4Q1yJ>KAB##3 zE}$xWholGp330o4LPK&dv1IEw)wyGYCw|5E+EDa~@eRB0F;@)R=~=Xp3ZEco0O>qP z%3M0U7~g&J7alCdMy2MGAxY(8kUq@|j@><2Tz{V7+@Oa=aq{5<6R=x*V_;olWAboD zY`EagN=6TJHH}cgBPA+?F~LISe6{%8Kb`g*_m=X42g z^8?VAzeTN+Aa?6N8+$*hzrA`tA~`J{s?5FQHF}>%uJ45Jr!L1geQIxHtUhZiw1@oQ ze>yFhb!M2Y5nf(RcFSS4PU5xX?A4EGjHY4L<6-zi2dZg1DGB2MDH|f|D5V<0rdHP} zSh%mS-!zd%QL4`9VVq4YVw~7HJv>mp`o8|E_wV2SXKH$P`6s_%auq3Bnh@m9>5wJ1 z7;UcD-pY_>Ny6M!K_3nRa!-z6B%0jCmsO8Z?|=0E^JUAg_vP+zJ!{_`GRxy(8OWcL z+y0`zdWHh>c-q+w-x;XRCN|mZd9d}pygqn-bq>&(HL>CRCfsxRy+MT28YkkZ{&dr~ zfpoJvuSb)A(>eM6|00aKgZVwx_aL=|!id7%o`g1DPNi?E95!-%B!k zmo_NW$|ucrmbi7(b^rdpD!zJ%tM+?gO@Fy$P5G{7HWvst6SYaAD7`mZ^r|7Ld*(L}JD0mLy0e^Vkc*Qm44;&`@!uzC z>GA7r>&mIk#2d5$Aw~kOG>NS|w8*JxRV?a;q{_)LFMm%lRIb)27WJw$GD`Uo z%NCY8&V7(`z-A|_Gd(}RqW_))?L!}E>mQ5hKfmlvmeQ_NSMcdtDDir4dgSIeqn>&3 z%fy)%9Q!sh$5>)Ds|h!~WikzR98lPV=buwAd+dfn-qVZ4s)msPnx6q~hO zAWcvediXU^!=~jPH)XrmtDY*)R*MeS4he)BvhRR9mT91`tPku=v$JDoor-hBv$TZF z>K*U7EM0w^YK_h+2aWAb9Jgdtv-}X|DF5N!A-q2^G^AJl$yiMP<+3{RYAL;*N4>lW zJ5RLd`Y3Mfga6B~oj2`pL@VF8y_#^LKOpqteSRr`T0@g2c_3C&#zzq_Op>H1j1W-x*8N z=at)z3$C=cUDND|deIuZxtD&2yr)8)eBK+=PWQQq4XonzHuJXB+}qh2F>rlz^FiL) zAK~Vu@K%l#SRn9i8UuW)Edu}LacxRLZGR|T6+^@=@%R)_E zRU#>gtD>{U*3QK1T29pKO!>9b-livE!<`L z$$Mp8xAv7AY6m)7s!417A#^Oz*LCLR)w2XlZLCv%67 z^kNpw8>$uLS*muIZfUK3bkLHyGYCnQJ%6$Y(D-oi`xLC+P2+=SK|2E9ylx*t(~4RMvHmg42zJABboZoao-sai1ZsNwU-*2==Ld&wJL^1JPsL&yOU>J zfn9s@Cfz?`4b+-v_QK^&jhB?29tGZB`i^NOZvMQUo4(+`u5Q2Ke+W1OYl+;OzW>nE z5Z)Wp78)^Y%Yv+|&h|1!KrD!ZGigag%rs_!FPk^Y4$-TCHwuK!00fW3zs1 z@ty5y?b@HA%%3Llyl!WZGv~5p(k~3H)>w+w4A5Ie_U{X6lXR+N?4YEg!Dw5p5$Uw% z=Hjz0O+0@Z!XNQzJDyP@viC{D8fuYG9|C*#uM^|_t}mW&-jcVkwI%M6-X5G@s7?R1 zsw(_P*WC{s}?+*RCmWFp7g#?uy8W=Cphk3g8J zMQad&BFai+Xy;kv5hftsUjJ<1w$G{oXHj_z#3;uuIzM< zsUoZ@n(I8m9)#szsR%Eu%^XVc1=8?^D$gpGGgFCwc3H;~PyYz@yPNY5R`;(BxFRlh zI=C|JzSu{pHyBI5jS?3Td|&x#UCpIRkJ-&sE%I|;VyBzea}uY~`x}hDOF92@w;yg2 zT-k>KM~jEz0yoQnuXeAaC?+ji|AIiAE6962Ki44VwQJydPhY$9#vg8+t?8}JP06j+ zXCrc{VS3X%VFoPPmU?#cwL08}DO=&ut8ucdRo@imM}%scsCYNGlYkA^{ zIUHcdw0a&mF!v&2db6os(9lbo;s!67gQd}NCX_%I^ihBA0 z?F>zTWtz#jYpgPnGXs5IY+V=OJjg<^LJgr}kDZsTmmH{4({Y4X3DCZlyT3GCS6N%> z%4m?{Ib0h}1O}ffe}>&vVbu3tAUAPV@Cj8_k+2fmvTdb7m!|UacZyB-G&1EdmdaAr zkSYyj{W51G*z7-jA45oGG?`0vni6DKClPy$o&uvc=H%$>maM?p*wjX&a*O5ScSo7d zWDS?<`53I?Vv#18){9xcWfEQ3?8~{*F!J#mDTu3Z#J(VO2fjY~9q^jgnf@zf42XQr zl=#*x@)YD7sY~GzTFu%TO;P?SwpP$Z;W)aPx2~>?d$P?q<3{#%f%>XKN%S58mJrAf zZ9hEjYjeCz1-A4&9+;#E8}etjlJj_Wd6ZGC<}`s%fp=QIrwz@g4Y&jj(RTWR`k!;P zlu8vQ*hovY+$V;mVa<;?dLORwjTy@^?NaL$p1nv>`34~$BITXL8v53bW0X1jV21Y_ z-}E-y)Nk?aDe$Fc`*~14*Qa?~eN%b4N#~EPU1OG35vCL_daXu^9lH_^8#;!jqx%uZ z98>#RYgP!6VvL9-Zc4c{pJHXSw6~#l9?P7qXVUf8V7`jsxDM^O{n=UG5QjP8#uSm# zL=Dil1=n&hJMStnkSsGgwQP8bCn%ByH%@7z0_L4cn2;D2ATXptMuUdJxDiPfbi|}d zv2P$7W>A$zN46dnRaId^^D`+LrZh`)-0z8Ol@&6EUFmdP#AiCz&*Q(Iook4C1<=#_pWME?7 zGqJ>l`r9E+HA~(84~af+f4~0s^{f8|4N(37nj=7(#4)r(t}c)w7Z0Mb*7rK(9TfX@^^Tsdi=Ax>?6L1-g>5q{ShW;b*q;_PNOdB3 zfLK#<5t9W5T49TrB?hI6hHe$LvY$PxXlaGHt+U6zTkD$m{B3N$DXzxHw`*D-iElct z+;K3E`wm^z{;uYB=-%0ED00{x`SodR_M*A(O)3>e2n+(wtIv^z~d}S5B00Iiy2-0ZNW<%q=bajodD^DoJKPs`z%+ znfk?iY0GDC(DacqkbNS(+Vald)cNoo6dYRwV5{hCm$PQvLot{!kbz2o|CupYCV(f5m!({lD& zL>{}?c$rTHpA2v0WPbvg4zdz77^ug-*<>KsxWNLEVM*dq9};a`nqZ~$`W?RfL1am~ zbD{e|Q=q3$ZG$AVMp2!?4NLulgtPPc$->s8#+UD4i(>;Iw=z~qsw*vX3Y(U!5@9%# zU8hdfXW3LHJgHIwbj__|G?p#G3($Fs6M;b2{1#}+7xRL1Wvv}_1b z)<}G@J8&{iNI_O3uZl(?N(8^Sm=*7!V6Xc-g?cJ*TuMYS-_U#2fLP6G>t6TmI|q!Y z=ssU>`wd(@6ov9O=dHwBV2z1AajD}jb9h|~et)lfi(0<&*8+QN%bWV}b(%78H}FA3 ze$IdUzs!eV^6h!sG(%UyAy0f?(6rgM^Zpl9{dHhuS3ts4E&i@)ebwXB-!l0rTgwD$ zQZ3b1lBB{Grr|gPdSlzxSc?SBHWq=d%9J1b&IWqACjaKi#jhs>?4OGFEQNB`Dikct zA7)iCJON0z4TaL|_M@JJ}?8nrBOxy@I(};N!F3uf57( z5q-B~gYU`V99fg|b?jDH;bi-xwoOV#hOr#&(ZI@-@Dshy%yOxd($H%W)#d2xwv=sV zo4Km!`^9hIeexE=sVBSbt?L<3s^L`gT5Z9+eo@Ok%W`y^h9g_eC=JwukubbK6Y9PJ z3rXy-g#bRYDap7;vVA67Tp$W(^I--e4Op-#0%aLLg1AR%lv%1^iCz*R%l8F7+*XZ5 z+*Ccs6bBVz&b*&`N#o3uO`Plw%)5Ys|h~C<0 zYyM9sq^81PsqMXOr2}_5xpEKqVYZezR9zQrA0`Md&?6p332Un)(Z_&wIbC{9GZ?PUjxs=D6IdLb+82yU3PlYSJ18b^~U5 zz4H{MN_2|iJ)N~2X+CG=F1BS62xA{xpKXVPT3`YP9%>`{$=Rrj#P ze8CwIdHrF(7u|*Zyyd>4XsAXj?b>AD0G#@hrc{G4PQR2TL@oyS)0I_KhLM2PzO|=1 z4cksbU$`;EKu(sgI1PAf@g>&4aXMP51U8yCdANeUNW}dotY{~jK*(37rn1~rf@T|r zPTl;QV7>SF^(FMh!&NYiyF&J2cgfwl19qG0t>p|67e>B1-9PedJ=dDoa_?&HHes+q z`1I8Qyv{VN?ZSwP{`8gh>(N*8O&4&Hzx5J}A?JnO=i*)9kIP{)n}ck-3oF0FHNSeerA2my9RaiH_|jgaW&3uH~Dbchw55Izf53h=lE0K*D{UN4Tg9J!-=CHD5>} z2`o-t*T9z9Q;@A~()#HNPH9h#ilR#qDHKuKSP_o3@%*j{4X#oc1EiXL#w{F2g_7DL zYPPx;$!+M{PmS{kBZgLKXzJU_%*e{dkc%-TMmxm(D1@XzIz8WxwnB^bmevS-h%d;# z*$v^8pBMCiZ`!=%CcCRF%)YqGmsw+Ocb-4U8L|ts5rl4fgww9R&&#P^b2mNSTo|{4 zvj3P!TCi0uCbl**POF^?U=wh)&~YCzsGapVsm(Q=7q|8~f3m&Vz=`v_<0byOR~(VA z`64x?W~7PInx=1AOQI`kl5?gme)Y6Msj^6?ls)@gEvyYOF0D&57qs4P2Za8pGOhmzujed+k&%wvb)x@95Ahvh}yn4v!xty5HPdwtn1)P zRY!}kfB7B*svWi!KBK_cuRKv0d1CfVYT~POwd(|Z69~C(yL%;yE)XRo*sYXq*wEY3 zeMCN!^R=ax{eoynbVkZs${wDo)mo91LZ-Y?$p+e&Th>BTMUyH{tLxBg-Ke5ck^x3~ z*uhAm^y1)m+Nz>4Jon`2f?=|Sv?{&c7CY5K)+(BEz3TVzQ>%}u#3sEhKElR?$*4n5 z*#RYA5@m#w8j8YLCUea?L9$xkr}SL(5{D&qdg}iRrnhH=(ZJZeJR{e~gHhY==3LGF zkLBle6e=hnT(?s1cSzuz=dhL2!GoKQ^gaRVXgh+e}K1TXYsJa5E1wVf5=xAv+om_ha1_Ahl`sl8_zDa znsI0)x953{Jm3H)a6;m-@BTyI6^&i9h{OqZoWaN3CN)`Y&=#&`x+|EvRkU?Oufkxm zwMa$3G}114U#GaS$DsqXWjY^a$J|bKC8mAu-sp#~3ie*=zpm-{ffl#li!8<7RlbR>B{VLKD$R*Rqr^%J$5w2GU#wIr-8PT?JEL z9B){i96GKy?iUX_w|^w1%)N~0PBTh;^4B^H)~2jr>`D(_bnudQ=jB$9o4ML?ZR@*j z+zz~)M9GKs*y}z2yY035$24Gu+{y3f@ik+vtNF*KPu2SFGD0TjGv0HK_Yo-duU*8Z zFJCwVe@}^D?g;eWo@BReN-Z{h-M?;0*5=(ke~_bAy-BjgFKXAtyFqr2IR|@h z=kDka!Pt(obqDVT={crngf-T7ZWNiNeGZqlP3eZh23q(@6JaqpmV{y|7grriUDfkH z$|oSOdGggBgFZ6N-d$O?R*TS0CYPucs0z}q-Or#FI>wCLoH(DaDtA!J+-I>Q-+z6X zL1|BXJ5vVH=RJK}6}|V>NxJUrdx+lLQ=fQXw)Q{w>f$*lJ*n*4I3jEpws-ss(aEg- z{j+M)+4Z8dz2~;D{$Hj9zyHfr{XbZ$y&>_k9{5u@V5K+x!!bj1r50>eKpaldfS)EX z5PdETyf=M72)uS$-}XJdUFsZSadQ>qD{rf9Le8DP`o=F|!oRKKG!1eDuI*@?_dTpI zzO6WsbSIm>_)@z5y+m4#;Lb7zDmiEp3h*d*-O|K(95Rt9uQnv4)VR_Py0U(Y8yR+W z@QKIz+-~bVdi@qUc&*whGNpait224+ph8yc?}kC1=?H30@LF~)-z850LCiHNnAvpF z!?~xbY=D||>_oe>Wi>lGTuT;>(Xe%Dkju5nX;~6wvRJBUrdsiq8I0Ma(8@&IRIPF9 z{2uV*d+!?MJ@$^ScN%n7zZ`j)W>aDqv&DYpwwUF&R-TNrMc*Xoie{koX?I6Sl!=FZ zZ|(4{HI7ez#7lwU|FwZELFC>x`Y7RC@j^&HvlF_*KV zl(L&^wDrewJ7dmvk6Lkh&-ZoJzdhi5c#4cSare50TYvqwCB4DShK+NNjU)6;u;=0A zkNCqCXJ?mzNg(**WMa#}@`EynG}M?=aU+9qZcWs4@3%1+T-&ss)*7vEg_Vv2?!F(M zdrsWG-9@2%YBde`&$$N{_dCC=xobx@ZB&9-EI}1*qI}xu^00pJ`*NTSy(xi3J-wLB z>zSPS3XXQ7wfhYNn?AcUa<($PZ@r@=3wm3u&9{kUS8+s28%&-$BXO>bgGDR^AXu%_ zMvV|x09J4;k{j2eb$qXL3+YUwr>(MJuL6U9a(j@EMc2{OvY2bpV!l!OUM_)Q>yzF; z-WW!{ZGjf$lWG|%%M?DlUn<~_kqJ%4n$sr54fMn3Y#>S}7?F6RNNoiPrFTxqy6$h# z?UbS-qFPaXx}vjy9|GIS=w%EjG>s%O#nDBNiG!BKYgz-gf7Z>MpICr&b-z&j>;EhI z5&t6>lq|e60UDk{KBOV!X+AnKr9EqsL0i9(g_K1;T1F)ez^HA~-ks1|O*UsM`8oda zC(D;D8&KFg=1>vC$@dMh?UH3XnqgFAG)m(m9MGXk$&e!eg5gH4d2J%B+3H}lc_FT9 z!muBoTxP0AfI)gSyWDfkoWJY<9DU9yWnrk?W$ zqhFssBtXZ)Go9~<-&qI3agll^qoKenTUo?}qM!z;u#F>PMF9ZqnKGzB%_B`wiR@O= z3`Dd94p(=Lodye+s2o zbdaNIxWaoX0=z@$?|uTL2D2Aza(W-cz4wi+lDDl~@goQ;-1Pd81)K)M-IEt@1S%RW ztU5>+5V0(FkMNYC?6p#4IlRS#kL9d=|NbasW5()|Q4914F2ph*pk?9z1Q6;|M@VW? zwM%kWM48dlkYp+qUaK)Z&qbXB>AU13`n~p3K^$r(1=ofUj$a>($}$KQehmOZ(CJWv zR*3Y_PwD!DAYZ!+@vgiJ_=YgGA^-!iBGT`KN-+6CCoXNL8FBM5=Hx1*rDQy8*^ne9 z&9Ya3k6z05Xl&3@R8+1snSSd`9dd5f&f84Vbd#R12Z^hqTDJW$QjnNVDMs{~;osIar&?Q*0t>RKox0;SMIk+le5p~>mt zCvm`dec&~Ho#_kWIamHr+!xdxB2K>@l%C7ZKC6m2@@CxNpy@_4rYQDQl;joqCdj9~ z-Dcid6Q-VdxFDa*+rK zdcJTq$y#lc(NiC=E};`sSgnd+g;7?Zp;USbvJUM?>e53 z2297HEKYY2D`Hx~oQ4|6?Fk;pTBzD_43qjLErlq67$rt$_G<#PN<)Qdwsra0%9gdp zxMMc(I&vHQvL^dF^rvs?U+dv#ac8SDgm0JoeZMbW4&R6m^In*LD3-MahXcZ#L&)P) z5nzK9>6?Cr;6@jo*5qYhJ#v~_w~0Id&BgfbLT4HIOF<4*t$J`D5nUCnIn3~#4E7+q z7P~f|lzFbcQM>ME_i~N}F}&Mc-K9%cq}B374m0zw?W8mB$ufd>#;FnegZuM_x8Uaw z%=Bg42xL(=s3q<3NT?95U?C(#CMiQv0Ui@67$H~${>ixu_EUz)6MMV}y$U#ueyhZw zWM5RkWj37<0AW9REB1lz0Y4_m!zW1(m|AOy_FAHT7CNt;kv&-{5dom$pC^2Eb zEk0z)%roHS$Pls0dy}6OlKQ8m`N+mmxFOEmIeaGTWRs)8PgUm`9G$mGVzLMII?nVH z!9W^&q}n-3fht6c?WQnW8cG@l-e;l{Wq{*@q~y8IV^~P{>e-^}dQc<{`lOM9OBl@& zq7v&H6iLdnQ}Y^k(wU+AA}`dk#YQ6d@|lB4JJYfx^^m`@PRk$nCa&piZ0U=Hxcx5U zw|{AUo400;Z&ZxQBLyv08kOHaT$P|K#0bJlb}hL(bx%jx$?27j>$IAxJjRf&n*m?W zyGES;)We2wyk`lB;OCDp?^*f^zLPOdtY6o0EYv;gq0Pik2}2!=BKAp6U)KIA*O&!? zleE)#(L{UPVLR`AlQ4N+ z?41~GyP?;O`u^eBhGzI~0CR!1D<|9ebP`t-2CT0F8f2QuU9op$tlA6k_K<(?Bb8#+ zuH5uaRPs$}bUAd?LvA?afSui^(CI(?#nKOslk70l^ImoAqF6d*<9^L1tlBzH6gVk& z7NtD7J;d?PLe7}$_wCF(yW>YjcmCYW{KI&m?npO(%u)Y16(`cUPr0?!FMk*&YnBEc zME3ZOZqe!QtZc0xj$OP*3_6hfa_ueOu{-U*+0_e7?K<>~Bwf*g@k3gQMx4(L%yFi! z9jqv3(P}9Yk&Kc_@aHUaMiPtW64Ts;lv-5q;@!D3c=3atVf$oOh1Ff}C(hfD= z?snImzx)wfkM*aAW+JJ7D|dCrwuOE0@r(D&gG#Oc`RdcNtzSz;3nd!Knwm9ffoB3fP2=__C&omg{g?G+ef$Od9c1kJj<6%{EX$`>yI0s z@YKP&?Fp8M4dJtss}>reOFPPYf8_#qntiQVj5prF4evK9TMl`showv(Bxo8{q19jK z8!2(pW|25hDCMZcG~+~9&Ladhkt%&voCrsvn8`g6m`%bs_?DPRgO3av4SvNbpj~U# zG|Qt7y_&`_7zW5E;#+5^BVr;cPPFZD?Cp#`tXw}n)E!RFnffXovC_NtVOd7L@bwv#Rr<}Z zu))+O*HKO+&6w_1LPs2JykJrzo|ePR%#htDILN*r_RQS!_^_ah{C=67y|2xMpevjIa!R};Oz3!U4bi?ri8G5;msP9zh4bND z^fV?!R>!3oyly0ZQ{hJAAYLrio6#B5asK0ZiK;ZJm^Zc)kMV!RhZ`zKrAwVE0)wGR zEyWnWI3xnX-`k5Ywah0)8gKuA5sk;wF~Feee!#HeEm|qew9j0bqwytgm2N5ddbNjS zbDtaER<#=2U9bGfKbG5n`;l?*;g@Sa=nNYTnQdG?Q9SLv$1&*&Syt(jJfbKUoZ5?G zF19Jl#Pc8H8RXHJb3^wb4-xv{Gk$E^wX(|3a10 z-`LQ$XJ@t>Dt$xKVrlUr6m(rQ{DRq8&Grk0gz4q@MFe-vEzXG~tv`K#`<8L=#IM^+ zPtq%2k{8%LP~PTAv7eG+rTqso$&847)x{4wQZo)A`Oy?X*BG3^^<0YJ#i&1)1y-^B zc``M#(u_pf7+iYAe8Zyu2Z+eYgNQ`KN=l@g5GlW!*cM#`%O1_oXcJ%(H+ETb9oPB6UMn)%;?$`7(QiM3nAxVRv4#ScXxT=Iy8%HA z4;Qk@=7X1oHU4eA_4&^)j)w-2PW&;>#Ov)*xdzN)#9UrD-tM7QnyGOlU-+ZQwM#=w z*CsI|WoAKACS!XudGo@KlHX?-_@bse7_sb_V+DzC2cT;8TfFY-9>x6I<&`g6m$svq z)^2L(ziwR8i4*8`gj936>O#3HDvTI4LROgeqDl|892rt-3yOiejXBdaaj5hWTH_RJ zf|~{k*iFxe*7ynsZpiB2bE%`Wvi6*eVnlF%6s(b%NL0clw2^$fbU@H`E#)XnGdd1h zO#7PmlT+6=B5!{k-1{msl3)=eWoSF~dvB80?zg;9pGf8S@kA!38{kd}DIEwID}(Q5 z=btAj7B;?J+L;6&|J>WAi`XpEr;G|6n~utLKFp@!bN%b#J39k=Z%*xwhb5T|p1xB) zep$rC)4-ek?BL~*Nom6%wwey2nX_b!y%J55Hhf+MmvlYXJn4FoSiBM+?PY6b%&Xkl zoaL1pFZXuFK9B7*#x5F5G-RxlRu;M_=vb`XR136Jy_;@(SF2qFR>~uSX?=Ed~?TzQ}A#!)N7&IzU za;@K}i9pKnTV*f9l8FH#jd7~^@K=uv9x2L*gMVWh0~*3a|*;$J(fXIlKq0( z*R~@0l#}kb9u7+srR^@o$$_}Qw;N6beSDkkY^_?9l~i%ZMa6L@cyD*3?pK>HxWeF% zP3XMT9n&X%yAzE~o7(!*Of7q-3R-?y_`JNG+tX`w(~Xao753j|Pt7q7#wRTLXNGLD zr`ERjOR!3z3JC^D<;Og4oO-28ra&vA^t7VnBhgqec;!TV`}MqjS0lYw-mz+qJC4Nf`zzMjo1_0E{Z=eYYe>+{N75@ zF(N~Mv$FDO#LgJmb0Q?VhDVQl*!^#W$KlhjxbW_8Oj)!3#jys&s?6wK{q#o?l}okM z&Mz8AVU~x`!*}VrnccrdbND8t38)sKs~OI>A3d*-F(4t?XZ5SxcZd4&Pmk6}f?3cT zlY?^0e;<41S?fh@X;Bi?jgHx?J{<3__K;4DGr+PZMX}529kA3@y|yGE$IoB<4KsOj z5bIIbUd|siM`gVHG%-GARxL0fMyvr0=#4#w@vfxoJ42BdTAqdVN8ZMUDmNL%<7k|f z?ij2Q%5T7!1iB;DziQR7#y_{trphg3P{zHjuLyV5|)nN8`_-xhMgsC(lt>l@Em(9E+Ymu37W6^?2V)i!;ry%Zcr} z<2^FbW(1e~e!uB)n$|uxb-h-n?OlxD&Bf0W4J6TPa;v_kGu6M;(%BXRj~-#yOnuVv z0IQ&R5yLozro*b7QRQ~!R1qzmZ>R{nZhV&x*Cr)CUBt_y*xWVq@-NNq&PGI>!@Se| zUJmwQX+z6DzkK)N4}yz5;V0)jS9fJaF>T|tJg&6@awP_MOaW83q|KbvSjBq1Z})7< z$@|(uz6GaA0);Mz9VBSq1Q-OmcznQIke4P*2XTtf#5TJxnt97!Z_k$P=!x$atuFDX zx+tBX&A8R26UrD|%naNlrMOC>`oy235406yuYL4LGIc!{!%?PpKZ|9zcW_s*YdMt|e#0!ZAj*R-!2{8?E*50@0ts|~dzv_eU1o~Su_Wiboe(GyBo;%m#`gY&w zk7pd*$(;!F$lwY;Y-kWOZm+a1#>3P~<0GDAGI^?Cr@QZ`h10F~g8W6=>~r5KEq{kY zZv@^Eo3gl@_@!X6^W{7|5gzr7BdI<>nFCUIrI5dAU|iCR#Nq=e9shVb0;jGAKkp@@sLN!;nn#Mw#4dw zLuZTc>6uY&{cd-wYMD8OuJK9>Si2Dg96idaj(e27yDaRRF0taQa#Zsyue1&y_|2y( zZXSXgMZZ*@=EhCWKPhN7>2tM76q1lm7}`H~isSAFzzb`;v}F2pNMz%Zu$ zcXJ{0|Myx|ZTE_dyn8ldTIe?Cq5=(FhdkGnxAI);*+XSjnc!b-w=GKLD47}f6O;W-jhy@ zrC^Ci$BL*&!!Xt_H6&g2OIy&2|NHylE?A(LAgheyg971L9nWol#sBln-%k-J|VyXzOC6}Y-@#sviw zue7{7f#7=K2>Ek{F>00Z=x19na;_H=2@1Ry%hOnH(o9yp<==CKJc3M-Syn6C@!$Gq zqy299TXyi<8}-_{S-27xGBx$k?2Qa&3zZOWTA+x`(}P;6&71}Tj;{G++V}%n2jC-m z*;B*EU5~rjOf0i+aR>*zI6|oxKVqFy<1iJKP-L+Ht7~oWXleDnz-k^ajcNbZsTIoR zmo2t2O>pbfs>3p*(WEORNK|KjmeiY4;wu=Ooc9ZbSTlV!K zg{RNFqHX0j9x9HRwqCM|FxyW~bLk-!77+RwyZa0*@Gy?BUQ z^w_-#v zBV5!)szGQFRh}zb#UkUP+j=Psr-P->j%u3(p>~@ppVc9F!$042<{a2J(H|$10E2M9 z1e_?BSNMB>=m+<^RmU-6796T7^r|Vnmq6eGFOFhweN=7aakHzF;C8{)WO_C;2If{d z3cU)!>m2@~S-8+kh$h4`8)r*;xGi21xEsQqLe}}pXWrX)$hZjwW1)Ps>AR*3y zFYJ{Tvk~dQY|NrBE3@;*5XX+!*->Yo@X_Cc*VW>52<6lWTXy%}0m_@f0tN1*uT!pF z6y4K@SPh8+CWS^U)RFxcI`e93qe$sdXOg3jvTxmrrXw8$3(WiQqvoSb<8Ma$XA#2G ze^yx@pLTB5WUjAs5V~tOSp*Ku%Dj*U-WGO@Jve8-Ks)ay05X^t8YhkG8a9E-J5 zOnKy&6IH@!KB0E{5MHwZ_3$pt+V-fG!n%Jra5F<`Z@$kZRh_T>Wfx$cExym63dT{- zPu8hHferMoLG+THo2_0mE6V}~p3+=59P6zV*Ga9KG6Bb;)8|sauwv+n!a}BiyDO=j zMIkq%tDFUL&@hjwd+Th<0|DL2I$MuZMsKgGU8*u*K=q_UTi889ocUVZOgikmtL&Q&n+gZ=k zMk^s&`r~YN0DEoL#bF!k2@yLs{*Rgu3))SyF6#7RL?jHx3FhBl2C#?8e60Ig51Wsl zXT*U6j|8wEFe;-SV<97&Nw&$2-{HlQ6O%8ZN-}Aq!ep~(_#uhvqmQc7z=?$K(?)CI zxr8O!bW}gdR_=IeNc41D2E~D7XN;_PMyk7hp~hrkUw0Z6b!%mEz9#1Kh)dm*wj;Mi z=YcK%TF%!lJvY-cLL7^w^~@&--ORqdZy7VS8qEaE67M_Q0{a|$l%5f&zvemxFM6^T zOS780#@Qwp6udc!Va#uj%Dgx=HQd*P*Gg#2+TXkcZeYumYm_+Qv;Pk3<7Fn+y~jZ5 zwPTj>$CdDDX$5E0m2$o|#4rl8Z=BdaG>%uA%w)GpAkjcwIgo4VqS6dDuZ5whQsoN|;Q`*sM!yH_Ur4m{HJf2y7g{ zUMecJqA4d}{qG4_4o$Ye^~?;-OIisg^AW`ZnGL=!Q{>M12iM|BpRZ%BK3~?u*TreOETh6L@Yqk$6bBz zhZRV45L_}oXG8tE=Imh{BO{=)NQqbHe|B)qpG|Ra)$k8z-;iAFARIDM4F7QS&}v%9 z($(U9hg9+!6rWG*U_K=E)`eAusXBAE&<*{M-ukoSB)HMzS_3+474FW4!O|wdPDs+= z-Y)^K$*vfeSUY~i`J~c55}$9F#4&eFX&PyaejjwKsf=tM5VXJlH3yC!6mwBKdfW}- zye;3F6m|1bhDxEc7Afcvlw(5DDGrjVZP3%0r=R=co0Bz##94ifgAa;ZQ{&^j z+A}=cS9tpcKg3sP=dy+I`$rZQd=S9kb*k4B%z~v87I$|iN)w*Xa0HMf*^uaeFlF%a z8v;94N9#GQ-5|S$$uVcpa7r_-Z5fOY|1oF0Vob`Qr3xam`*U4v&EpM*(=CS|rT?L4 zW9Xh`m3;Tp_t(V-NP?&moL&@|5AW|*q0L8>W^xxzD0r=je4>>I+9<%ZeH(GwW4`FyoW*8VMa$|T#GQ3O%uWfgSXnM%^eEyoWI7v{v0ZH6UH|kFR z*as82(()2~oDzH@U#pgwn6##87YY!AfbMZNc)L64xyZDHU!bn?di#8(>C4qD^WgnG z=N0eA4EKwCXcyU+NiUDANY#K`qN<9~5Kl}1)*b0CY7NkDRi~7$gCzV`@-h6~La$f(fwTR2T zef&*w4O`|xTlpn#znp=`7%i{crvbJFCj6$a8=u;0Y5D2)^XH5?a^aum7UkakT;k0S z6zy3V{@-3wM(j)ho;qqiqff~HSsCq1RKKneMG2ox0yfHyf8WT1f-N{2vu9uISpo~U z7KXcxgGGRWowi+LH9WR2-l{GbazRg4JMSwK74t&xf?Sg%B*}0t;od6vd|atj5PkOS zy1R#BnbNl34Hoe>o%<)#Xwi26F%Xt2hvtzZn2i@vFXpebE^#&(DL2scZ?xPAT^|a3 zQibMNPA{7N&sqn0U|PYw7}|L~e;jtqyOlS~D*sNf`_xNY2A8(9Y3Cbxq71}g$%KEy zSeHup3j2Tc=3f4yneo8S-N)m;b|x6O#{(->y%6z!TMDO=D*Uad+F3p%@L!BHYB1e^ zr`oPpOW=#rGY-XiJ^&b&RiR%nH}4RUf4MMZW?EL1wn^&@hv9#Q6KOc?&t%9r?y88_NF@CIdsDh%f%n_)!|MG}`eXI4% ztk5Y9dlgmgUi0BA?}55T<3Tkqvs_K;%9$Y?QtcPa13$$b`Mw^*rjBPi<)6?j8nQEa zo|PYF{x=rg&fW(5I^Lu}ij}IN5_d0j$?mj`YK3E79;j{k#=&kLpJ1)ZmQl@MAIn|_ zb+P@ocD!!O3%u^NZ{`sW3;El0?GMh^-Bk4~I9=8hc$v!MRPJ$5d!$;Wfg~Y=O4u0f z^7e)em4;ty@i;ld>FJumE{tk?- zJi0GEQfIAWU>fH5rr&lRYUa7TS4QmLg^K?3yfF6v_vz4+)!{(8^T6;@y|dPtFbx{_ z=lenNqGK?XoL3F9MDWTnQG9S9&;Ce*Zy7521o8wk0kqbgX6)7L{i!aX1jXV9P@i^YzBOOt}(Jme_U>eP4uC3kws=#~6gsK!5 zsMH)mVQ58GKRKjlqCwvn24@iFy8bUCO7)x#KY^uQ2P0t!_75ExFJaUa0Vgv8YD01{ zL@Tn~_sviphzp{TIHI{=6al+fVI7QobhD4*gP( zadvEg2~B?<9DlsIa5=70O*OC~u6I`GFcFLbLMe$=-s{?dz3%O`=!P(*%gF}yIdn}`&8y; zHu|Or!Q4O~R{feyN_xSt>T%Vw!>Ot#OQ)Ydo(_F5Eqdq>@uY|K$$|obS`H~|`C0Bp zBZguEZ?<7xm4so_b)IOk1SW>NjT^gz-ds~iidaH1Hm|DrrHxoN&H|l{BT&LPy1N&0 z1Xq?A$jdJT$jjWw^_^kSg_*))vP3%`ebvD6wzG#vOMLu>q&yph0=LDY+uuWcfhVyT zB8Tv!a2_7(UFJ}X1X=|A!O+~LthrL(m@X9Lz3hOnxtH5-K7p~Tv2 zTkE|aAD@a;>07fBjnQ~2A9g7yD2S1~%!cRVGw&_bZ9Gi1zXcw7xw+>lqY86Bf1Y)a z%~CJE@WmiNwCiagJ*z++Ey3R9g)jIT^Zx#7(Z01q7j9jN!FkwKp3_y<(HSP^?X-z> zdmq_)ufOwt;M=RXEqJH8I09OOcApG+?+#X1S9ALap!~r2x_f%69TiLArJQFpgxcbr znwpw}DXFQo5LP$|vM;w=sj(}!I|e+}^KNZzZKG|Oj^bP`JYutoC$}_Brf3(IeY~h; z$GyI>F~(2YX6!te=6Jx_sqDmG{q>(;gPA?nnZ#rB$~lQnPEMZL?%xe95#tNDUPNrZ z5+0SEI|j8_uL==oB+8e5{P?jrKksz|Hvki3YNtZ2Ic2lV3-a^5d`6qj6to23%dxn{`5!+fz-gTh2hG0YYD#Sm+ptq~ ztgDiVsah{9Ei})7T?%K~Oy!B})1ei&wSzsBsTT8}%C%L2$tb2z9zTBktg6b-6zk%N zb*U*%hVN)z{dFEnBe}DYZxRv0KxGWBfs_QyEp_9@4eL)Ap9_HLiGt~2Q}zDNDxA({ z$u=)ZhHI`rm3P334l_FA2nWal6i#xgf}&zXvYW|M0TSn^Av>KqU-Ijel$61~0bbvrdAllMUB#5;zF~F^%)?oots%8s}&n%q>QIjgLilLgYHu)7fmXxHfl)lylH20!;}GZ|6%k zfrlU^IfhtXVsb@=;y3Yuv9U4MyUj!1Hv;Mf{C84lG-c)tpjzm2=;~Bw=kD%qCrtb> zG}JjXblTCXaK<>wZ9dz<=K}MA0~#o-$CdXbN;O=-A-_V~Y@Klu?l7GQ{ZX;do5j{# z(6H62KC~&uh@eMlI_K;j|L#N1(JP%&%+VJlZ3`149BoC0M9a{3neTEC=pin#&Kmd) z+$>;-PgdULCx?cU?H+$5uDTGNFjW{j;-(04G#*~zHg`oKe!8$#MpC)myc4S6O&`>W z6}eAPc|=a_c=zsT02ucr(HNVYuJ7z*NoeBB!*`j#l#$c&X^#A)aIo&?hqK&I7u>#W z<;OCh#)62E?>IID&3y!pA|xmzCoO~7NJo(K!AWR5x*%Q@e*tx7Nl{MGmsZ59){V33ATn$t=M5Y=%ATwE12{C8U_Ui z-*K?F-;Au0pYM43gt!_(oQHG>DmlNBid!t-|MJduSB|-h7njRod@9c*9fQM>U`AxM z&C%5K4Kw*#NO$-xNqBQk~G++S+?T zaDSc`XUb;`u?&nv1iK_oH6wmC+qHofF?ZVnMPv3F9Thc5N$rQ?mDywQq{0VtS%3cg zx!@T6^J{JJ;%IZ&NQ$8LC$w}dPOJh&O!p?9FKUA5anYEi(TJ^| z2R~eV9{wgp@Q!4?c8t=9w|Yx$<1bF7 zQqMrWG@7Yi&%!nq;l4Es$XErf*?8gogM>5X*^@=DLFF5hol_+uI${?Nb;f%UY-0ro zam9_$uQcO(rUN;K*aI`MIKxD*G?+o+yJ!qeiR~N%B(<#P3VaovmN9&1=8qHNjaaU* z!Y4ac4Y3B&AX+Vti6q=XVsM7?Q_9pM$lJ9h^xaIDNO6F{A!4S~iD}QW-6Une{dD(J z7RcD}aE+(Uo3i7j5xOzUQqYTxa6!r-e=@aYf68B9T>7qNr7t%ZnV}{z*Y@t+JGXMX zt`$85J|=43mT&fG$lGMtv3sp4!%a2;kuD3^T>eH&NJ%~V{LJ^7KD|Z*TVZl#`T|l($#Kyb^1Ok{P2~sBImi#alnPc#ncBI&zMeDx`)bXZ@`>AzKFW@M z7#s}t#olum_;bkXQvpB7OD7+nY&!n@%n@H-UkB{B!hrhWp^MKI0csGa9Gp+S_}sjy zVuGALDTof%TWFmW{w5kli6cI<5hDg0o0%Da1e zvq?!_&@&o)K|}ksACD_v{2Xc2F#6V!F8;aUvfP6Q4<@F2@=4`(H>J(QvX9zobv-=^ zidD|lt5?yCrYQogVMAcI(V&TThMjfay(<7Jh-W9jXpvENL+6?ykkH^`w!8#>GA#ik zVvZ&{#zM3Z1IS`z0Ydw4A_PO&y8HN<|Q%1 z$B8W;hlc(nfaD_(`+I(nboJ^P;DFu0QCPtvWhS%`eO`(eE`hETU-;XCuG3UiHR4qF z{wxAra?jLwb& zP4EOwS~qH#b-WAKK3C%1-UAS-Z{TZrQvfIUbgnfqkB7yP)HL$CME9DGOt(b?*7G&x*nCHFPwQD{;70oAP%UMK=A^Xp)<0wdWT+o;u?86O5 zxj}yMQ*j%Ho6yGJe?*kq>;y)bGI7n2ldi~7%_X6bPt1n8G(ARe#hx0V%0Mn)2fwUDhfoda+!6jCrn zF6POA|7-!2GjpqFx*tH|JpAMZh#rA2Q1J&*n(ErxUt<8YlL47BH!rVq@X6`5N5wm^ z1}Ma|1pZE#nj6@881jPLAVqX84WQkG1UJdK;^H~^u2u7rr-!L^*0yv6+GPw`4hrBh zG_aK-J3yIcj1+e$2bzM!Iy021UG{na7Nl8L!RBZFc?jz<5nc&}bD)O5-P{aeI;E_v z90ic79jGnYYVhsy!TI-fCSWcAvuh9^kstH&^LGhd`_=DTd#0S{SjW?a?$4j?^)xke z0mO6w`D_LXKRI9oYoN}f@Tg@CW$KK1$-rrd4SM`h7W^>!gF>Dx4nkQmr^|CdO%SsT ztgwVM@eo>y8;N?KK7CrZ*$21pc^Dttm0uO3ZaSW`Z;9CH77QM)4w-!?nmg394>OWh zR#rZdQgzh_EJB(Obgc}Wd>1@qczNghN@hQ z);^RSAAtu^4tpjrg3zqCzOQF6)$U3BMT4C|BiRBy7cvh zT1=I>Ej?s@3!^kLI;yz6fTbfE*uDYI+X#x#!ExCuOQX%|)HAug^v=smpa`x(l3vfh9D&|L4^RSM0b(pJE`l&-iT#bT3p=C@u&$M zA8(E30cpn?q#fcj-?5jIpu9@;-O;yciZdxXCKg&-+((nkB&u_5ZlFXe?CMpqQGj$< z9(}xc(aVb|_K-5Q(JULXY{$3kl-XQ+wEM-Yk|7pgkE$y_zx+I%eThNTn_h{KJ-<;dtM~#Kao}9^xWx>vTGy-Vs-AlU7b5 zePBRCqoaD~DhE|LG4%BBJ!<}R;wNV$uIUgFUSb>ugL&Dw4-lZ3wzWR}$S1Y68z)L^ zc~MG=b4;Q!PU*kmi*1nMbBZ}ji%Uymr^-%9&j0=^_Fp8zfLe~C7s5gJjsnv8;NCsa z`ylxz1Scxr0Ep||=%_U(H#fJYh6WEPA!~twf!xlilO*_9kH2zD;#z@Mpk7>?B7ChFDf47&ze1=fK+~_4vNE z(hDyvE-WncJYCQjQ2UwljF*sF95a>G>QmFZiHwhTY^Z$FwI^q*fiQ{&O24hbroIEo+QOSVQ1m^Cn2_}o<9wXS#Eo%;KGUK~P! zEGSa(3K-bF`ReaK$4jk~e{F2+%~GOhnCwl62q<+KqA`gur@F=8qKb-&PXPRGumCz) zl>}f40;*aV6wXcIfqx?lpvh2~p@Vf+qi${w4-d;tPEJ}iDab1-uHV4zLKI)5$;y_4 zV7|(M>}tl`efjcbWok-_^~9yaAa>~>@oU$v@fcxEQQ@o<0`?mRqE5wY*T^6D^<8QO zsXp|7>2tI>M0sgnro_a)KF< zHV2q(FfP^t&;ea)hyVqh-3d^cHgVKqRS}XQOJ6udu1vEmEiIjVap`LzKL}#iyaN5m z!qCD>A~MAWHJ(lj5};|IgyQ*hzxNP6rPskh!fb=D`XvSR-CkXfH z$>}2C3Mu>2LKXANjpn8AsrtK{)v>X$Y{YrE$KvX_fe0ugc;xaR|MN2nZ@#uIjx;u| z>FlwS$Ha$B1Comwpvc0RKeg}Gex@k*rf&-(`KWCvh@Xd>d)Egz@IlspqJ_n;U+-<4 zcm)Ku2Th9nF%&uI1xgb@eiKyptN-#wAiuPmmjvWZX%REz&CWndMymly%Hs9XGNSc@ z6e+WFX}=1Jb5I32Y8EP@Lt>!XO76HIQsteHQR$oA9X+sILT)~_)zuIZZxUxqLeKGz3&LRBJjk40n3m8oOm z^(zyvZ`%AEu3rl~*tFc{-(=K$&WU!}9N@+i2+Z$L{;8hFDSSoXzZu)m#-?wg#3F|^ zqnoIgYMA7&9^8;$q*^g-FrRmg3jAwy}KyjEMjgHVcrt7k>P(ef;ra z&adbANhw3D1h~uS?)-kmU?wjs-V-SkE2AN3lhyhHCunr`w%6W+>DgFYS?K}>n&73T ztla;lK5#}H`b+dlR0hj22(+_3P#FfLbGn43h9u@Dfov0b!OLq)UrI{Kp$@apE)qDT zeo<%+OznG*3SL0K5`d#pvxpm0Bgiyrq3h|w5)TiLP0*DqiBpH6)HG1|!aY1B#~Oo| zI`%1Y*WGiKcZB%(4&OA~r-H0tNOM_or_?2htMSES@Sjj(EtE^=hod-^T=;9VZ#@b5 zgy7N8nT@{N+8R0TLyk!+UXY&ksuwJr859OAszmN=Tx^(6-UsapV72s7enS7_Dr`66 z;_|@?>s|#b@*Xjlo(e5ITjzJre|vK!yV%SY5LCI!bIpG>$ry61PT!2W@96MDpu_Hl z1p;a=MHHeFf%<4d1c5mLlLGQVeesQAI^-r2;CTDT@2fZF)c`^Sl7#~)>5{z)k6}pp zxk@LKZ`E&v9K4^O;f2yq+|vT~%mo7UH$F>C%W*4^eeEUh4S7c(Q=r}pSo9*{9y@=3 z>+=C0{I$LwQ3{BFcs(nn8G0!#b2~4uHCw^KL{d_cug)L98Za=It@WQjdprWeZar{9 zFY`iopm%iRQs65Mb}rQng}Zordt;W4KK{6R@%i7$rSKW;JqaQL__98t290yTdmNpn zs1N&c=}%C91$l*q`ygX^@GTZxQv2%i{wSdH`2Ydt0~?HGJj|zNY|xqqFR)Tld6?`Yz|=RW_$|~hJIVMPSTB|A z7*IA3#~eiyh_vrU0fzL;U}k21lJkon(X#+KrwgK*y;K9@F#(K!Az4uSO1PZW`;W*j zJrYd3>NwDLgN0ww#?n%tUF9o~8)iTmD>cMkL;j+e)0)oGA$=L)?37@T^COk?^hVpm z0D@zqlmSNKo6#gaCk>`NOz)gg9Ojy|aV0o-2|OapfPC-g?fryK)gj#$bQ7KjFO9za z@ZkgiQ)iB-SRpVsp5(|Z8h*;Q$hPbm3p4XDzaef^g4&^Gm8zcKlL0*ihY!nu6G9Fs zQ(1|}VN=MFR>^;FXXBvI;UH|+h4bg73v@zPD{yVE;70f?^6L!NMaaU~HiVulML_F% zzDr-B?rl|7)jJHL;Zai_5Un4U671pW**7l8Dx?$QJy>ye?+~?)k+MVs0Qf00>)*eB zp9O_S_d5Tx{jq-U%JEJApsKCCMMS{F!XR(xU8b7B>K5`+SzmvzImam?l$+3gQb5yh z97M4Y9QduR$+>mC$4j;L#Ys?}0hYUo-J2dYiuw z;^{nxcme5gpOQDp^aZA$NMc)p6QEVYY?uL-fQ^#ULn7TF1>!+a1{e6pHcjA!??FIr zefR0pmD=K;$Xke-0c#ltaLaWAj3Nh;)(*UfqgaDdt%?--JU`RdwE9-=eMk=Qroq2| z|LzJ9q&oE_hZvltiO4h{LhGKu;k9Gu-;9oqK66wIKHCs5!B40*NfR66#&Fto4pgpji z35S!95EYP{&@E-^F{HGr`|#nzpWIHr;H4bqgavbgW(P_vPWf>VU4w%)A|BP&22X)e&?g86wlrkO5$$(wps84Zauo`usmqxnU|lL4 z75DzvWVu<)$j}MhC9Y}__nfdUh}(5{u`+nh1~gtE^ZT%Cp6*(=YVB+MM%qGFJFYEV zr_X6_b~d-Q=e41ii;JkWwe@JmgSjQt<|Sx@C<~y+av!`G?(gr<3?eNlHC03S>g+up z*{rutaX4967_}@1NB#tES){A0%W?DOOj(tO^ECy4%E9R#e<*;_pi8VoCJ)x|6i+uiPCRg zvg+M@t|iI+)7aSF1&EDcsDj32_wOUxRh=?nJM zhl|TM*IN(va^X&8qC3I?AD9k(nF|vei?1NT&YeINKp8^}dN5G|@`A4=xj{g?Ns#X< z1WAcQSsF+sVI#?RT+^*&0qac)2VN+w9BSwc?$0UQMsgj8ZH)2d?j{saJHTu?1q zM2}CDx+&6GiQd#Cn%(MN3wH_&+d2lZb&1c-&(B*T#pTV-x_1tOWarFA_TxhEB>C6) z3|yOG(h5jyP`EY`X%XP%4doiN*_R;!lM6--69cX#`Mdr6^4!y=K(p1hEHeft!XP{a z*t2~uxFTYHaWP^AxZ;nwxrE#^ z%g9I!<;{eGcJj*vz?DhIj~~BRS}OHv{_dDHu}+2V+WuSFr(S~Rm56A=gg2PVc7ll?c1Qc_d2d02v^-t7v3vV z`)KMo=!lMuR}>h*p?MhrkWs41+V4r9N5qIIGc!GrId$kJ#E#S*g9CwLf*~@H1-fR_ zO@-=JW0tp&2qp>!(jv1VV`)K*UD8y0BOs-vo!aq98MI`=N_;fKAw*1f&G6Q%GW zQWDR`(pV&l(9Qx>>kuPbxfqBT@*dzzcHm-JAhjKyxFkbX2NEMiWxtQ3Ol2p^mjYcd zB57(6+GZecp|BJe;@FcDvRms*V=eLSnKN2|3S|bR7B`v|zFpgPdi?Q6|HbFB;Yu%R zYw0;b?k>2EuV%Qj*5iZ4-5i1w~^;u$Txus zHXoS!U8E>CR@JTg^tSGZ zb2tL>;KHAer<^XyWtq=?dG6(3*nY}X`rO=HAQY1&lV!|lHvK)I zUV;JkzfDVk4x@%g1_x`O+m^X0n@kuXncqWS(h=g|+@ZcW(8au;o&?d}H4X?YoC(v` z*6uTtb$S`jtC8p?*SDrZriW-9g+ce|foRNEAU}8lW+%{j4hl|}&+twIsw+q!TR?g# z^=APJyl70k1g+l|nAOq{kQkIXZ}mv7uy=3>w_^8)QIuymd0h}xv214wwT zn>Hh2ZT5wJyc1`5&CP9!xnjfyfK&qT{>Y>i{b117wL>kb=<4?1+DstOn>@x2-##Gf zNU>5TpdGrhj)p1cf8^PKD|vA26_OM^3`RbX6AYjO}p* z_E@ZlnK|)301=7%LiUrR9cxW+nI(IyI`mWC%)E*j{tg)?Ro|wQmm!K(h=FTu;1;u0 z3&a*N7@&jR5cTNB?=&_xMk)aw(Ej{A!1yOXJrYGSKyThppR54IpovZVOaN}6D5+)< zHUptesW35jCNu#w-Wkbomx?Q|fL^%f+~OiYH+N7c%qFbB)ehjoKvWvSjP$<7r#?SZ ze#9|Or!Vip1$L4*2}Opw(Yb))p@dTywLp!lbtT5SAv0P40q)09wHYJXY#LG_9*n~k zqW$;?v2??Dw0+tM$v+a%9iY+iRzww_CdLsL;ZQlUDzv+QMa$POUsz*ty+9`Mtg{A5 zvOFp(Y6sc9F_j}RLQjxRYv00=3#R0tT?}Om$bT|Tsq$So!w!i<#202J@)_&vSGYz+ zw2rL$G{wSzA(2!2unxOV~&3gGKESqvPc`*-nRGyCixA42q| ztFMdM`RRJ*tbY-g<^r=RFw0IZ0hXGwH@4^B2OhwjwY3Xas-E+z;ys|zP;7XtSS31w z4cOqV1Wvk1G}tqLP-rmo6!ebZP+7dhTxG9VvJG$%QXH#5p{&O?k9m_zI2?j6aZbAL zH))BUX1C$ANh*Ttf`O%6!%^T+xk7`rYOU9$Y|lx5fD_|9z{PyP^)pkwrh28WyP4zX zk)=KpI0R|Y@?kP)e3IdFgc@+XtXtiGUX5wX2jH5X2UjH?KLwTG4Zu43nXtc2;Tqs# ztl6oN(hb6u^Za{(YqkoSUw!?R1gt%?f$fjw)>c-hc68aC=X3zpioH6g*F9)n8KW1U zXCme9F-yxiL@iYb#`}-9C2a3 zuGw+{Scj-9woF&u>-b6LWb%3Y|9^NII;5}MzhCcmDFWC@P^ZSCjLT#&jc8SB~1oX z0FY#&9Jrts72qTxVOONIf zbwx-;P)Xo`u8aa8r2sF}<>PXF$tl18_ocuuyDA9$->tyj@2h1VxpS!k|8m1}yyRI9 zmhu50BVjir?2f$Xm3akxSPe(L+`S**hlj_+9%IBOoJdMaK9!o5mVV}JR?c4q*KQORvDwANB{y%DmX?;4 zm*2WwQBigG-u;@Ix(D@~hQ_9**0zqWS3F*CUtj;g;L!Vz{NaB`M#nyn3j`ArlT*{e zFEgUqxq0zdiDcnu6ek*jP)wqegO5w|{ajJNOR8G)b-z1Li>Ne=TiAf9b%aHKoPZ

ksG;z={S?jR-?C3|6sMG%yjHzv`S3Jv2<1I5sVu<`0O*AI9dM7jn&edR{bEndgj# z4U^rmF~0_So~OJr@)TNTqKB}77qhxU@;&av{F$RE4F9B*6xGy>SI@uP(kQNdRs+v= zmMNQ`rr*MkJNvcKcGXN8(D*dRMn(wlSTAB{$lG{kTKaxoZGBpxzVCC_LJ}8Ynp>gq z=<#p{gZaT=PrWZQ5nr@X1Al>^*c+UDQY>cwow{aEFvV=o$C#BjlZ0(dY=d2H+9_qD zvE+_z2liFR=x@S|oZL2O;>4(lEiMqnnT(e`sq)rTwCG>ktIc?HeKce42cm|U%;hOj zMBxMHZMH%y9v-$no_#fy<}u1!YiCtVfE4-*D}45ov5yM$;#1aZ2Vw}F?8>&?2NQZf zZ7AS9t*bLPaT{8pi#iiAH~wr+5N#V-Y8(8)>R?)rLW(N-A-8Ae)T`#8JgW62<5iVi z(<;t*!}!?<8+x1s<b z7hToj$Cu$*lp{DS+aRQAvrtqr(VAX?9dJI&%@TY`^gvinWzFhLceMPG5t!aUnEIs$ zsaG10(aX=+zIRCd0t@4!xVM8o;W@Y8w|73B$93$;*<9!5O;)}tsJ-UbY!f&o<}XGLZ1_a z(>)}hcXg~hQnsKo&w6v4>bfJTGd0S);PE?WcC?R#??1-8vv8fNl|qSrX6*=v{sV_f zth%{Ss`#~9Fq~aiD+x-d-dZg2uG+%P6VZq5t}qXE1XT~)^-Y(&oqIj=b$xf_#-D$( wfFs~44*X`2dq}{X5qY#PJhx=tgZ--q)A+V3!+zFc@MD39&hAbXyQs + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_orange_4.xml b/app/src/main/res/drawable/shape_orange_4.xml new file mode 100644 index 0000000..8ae904f --- /dev/null +++ b/app/src/main/res/drawable/shape_orange_4.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_white_8.xml b/app/src/main/res/drawable/shape_white_8.xml new file mode 100644 index 0000000..a312942 --- /dev/null +++ b/app/src/main/res/drawable/shape_white_8.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_waybill_detail.xml b/app/src/main/res/layout/activity_waybill_detail.xml index bb783ab..fa030e3 100644 --- a/app/src/main/res/layout/activity_waybill_detail.xml +++ b/app/src/main/res/layout/activity_waybill_detail.xml @@ -69,6 +69,7 @@ android:textSize="@dimen/sp_15" /> - - - + android:layout_marginTop="@dimen/dp_33" /> - + + + + + + + - + + + + + + + + + + - android:background="@drawable/icon_unload" /> + + + + + + + + + + - + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + @@ -167,12 +175,15 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" - android:text="122.5km" + tools:text="122.5km" + android:maxLength="10" + android:ellipsize="end" android:textColor="@color/black" android:textSize="@dimen/sp_16" android:textStyle="bold" /> @@ -246,7 +257,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" - android:layout_marginLeft="@dimen/dp_12" + android:layout_marginLeft="@dimen/dp_2" android:layout_toRightOf="@+id/tvUnloadDis" android:gravity="center" android:orientation="vertical"> @@ -343,15 +354,22 @@ android:textSize="@dimen/sp_15" /> + android:textSize="@dimen/sp_15" + tools:text="整车 4.2/6.2/6.8 米 高栏/厢式" /> + + - + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - + android:layout_marginTop="@dimen/dp_33" /> diff --git a/app/src/main/res/layout/activity_waybill_unload.xml b/app/src/main/res/layout/activity_waybill_unload.xml index 586777a..770daac 100644 --- a/app/src/main/res/layout/activity_waybill_unload.xml +++ b/app/src/main/res/layout/activity_waybill_unload.xml @@ -181,6 +181,7 @@ android:textSize="@dimen/sp_15" /> - - - - - - - - - - - + android:layout_marginTop="@dimen/dp_33" /> diff --git a/app/src/main/res/layout/activity_waybill_uppic.xml b/app/src/main/res/layout/activity_waybill_uppic.xml index 7ab1766..6aaa581 100644 --- a/app/src/main/res/layout/activity_waybill_uppic.xml +++ b/app/src/main/res/layout/activity_waybill_uppic.xml @@ -94,11 +94,12 @@ android:textSize="@dimen/sp_12" /> @@ -202,19 +203,19 @@ android:textColor="@color/black" android:textSize="@dimen/sp_15" /> - + android:overScrollMode="never" /> @@ -222,9 +223,9 @@ diff --git a/app/src/main/res/layout/empty_view.xml b/app/src/main/res/layout/empty_view.xml new file mode 100644 index 0000000..3074d51 --- /dev/null +++ b/app/src/main/res/layout/empty_view.xml @@ -0,0 +1,16 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index efac6ab..42b0cc4 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -1,189 +1,187 @@ - - + android:layout_height="wrap_content" + android:fillViewport="true"> - > + + + + + + + + + + + + + + + + + + + + + + + + + android:layout_marginTop="@dimen/dp_m_36" + android:gravity="center" + android:orientation="horizontal" + android:paddingLeft="@dimen/dp_14" + android:paddingRight="@dimen/dp_14"> + android:layout_width="@dimen/dp_160" + android:layout_height="@dimen/dp_96" + android:background="@drawable/home_all"> + - - + android:layout_height="1dp" + android:layout_weight="1"> - + - //搜索 + android:layout_marginRight="@dimen/dp_14" + android:background="@drawable/marquee_bg" + android:gravity="center_vertical"> + + + + + + + + + + + + + + + android:text="推荐货源" + android:textColor="@color/black" + android:textSize="@dimen/sp_18" + android:textStyle="bold" - - - //金刚区 + > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - \ No newline at end of file + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_waybill.xml b/app/src/main/res/layout/fragment_waybill.xml index bfdcf89..27a26ee 100644 --- a/app/src/main/res/layout/fragment_waybill.xml +++ b/app/src/main/res/layout/fragment_waybill.xml @@ -30,7 +30,21 @@ android:singleLine="true" android:textSize="@dimen/sp_14"> + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_waybill_node.xml b/app/src/main/res/layout/item_waybill_node.xml new file mode 100644 index 0000000..0da1ed1 --- /dev/null +++ b/app/src/main/res/layout/item_waybill_node.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mylibrary/build.gradle b/mylibrary/build.gradle index 0b8b7cc..4d7d83e 100644 --- a/mylibrary/build.gradle +++ b/mylibrary/build.gradle @@ -84,6 +84,8 @@ dependencies { api rootProject.ext.dependencies["AddressPicker"] api 'pub.devrel:easypermissions:3.0.0' api 'io.github.lucksiege:compress:v3.11.2' + api 'org.greenrobot:eventbus:3.3.1' + // api 'com.gyf.cactus:cactus:1.1.3-beta13' diff --git a/mylibrary/src/main/java/com/dahe/mylibrary/base/BaseActivity.java b/mylibrary/src/main/java/com/dahe/mylibrary/base/BaseActivity.java index 1e900dc..0c4dad3 100644 --- a/mylibrary/src/main/java/com/dahe/mylibrary/base/BaseActivity.java +++ b/mylibrary/src/main/java/com/dahe/mylibrary/base/BaseActivity.java @@ -31,6 +31,8 @@ import com.scwang.smart.refresh.layout.api.RefreshLayout; import com.scwang.smart.refresh.layout.constant.RefreshState; import com.scwang.smart.refresh.layout.listener.OnRefreshLoadMoreListener; +import org.greenrobot.eventbus.EventBus; + import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; @@ -324,6 +326,17 @@ public abstract class BaseActivity extends AppCompatActi return ContextCompat.getColor(this, id); } + + @Override + protected void onStart() { + super.onStart(); + } + + @Override + protected void onStop() { + super.onStop(); + } + @Override public void onResume() { super.onResume(); diff --git a/mylibrary/src/main/java/com/dahe/mylibrary/base/BaseFragment.java b/mylibrary/src/main/java/com/dahe/mylibrary/base/BaseFragment.java index 499fbce..c12c9e0 100644 --- a/mylibrary/src/main/java/com/dahe/mylibrary/base/BaseFragment.java +++ b/mylibrary/src/main/java/com/dahe/mylibrary/base/BaseFragment.java @@ -28,6 +28,8 @@ import com.scwang.smart.refresh.layout.api.RefreshLayout; import com.scwang.smart.refresh.layout.constant.RefreshState; import com.scwang.smart.refresh.layout.listener.OnRefreshLoadMoreListener; +import org.greenrobot.eventbus.EventBus; + import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; @@ -298,7 +300,15 @@ public abstract class BaseFragment extends Fragment { rootView = null; isReuseView = true; } + @Override + public void onStart() { + super.onStart(); + } + @Override + public void onStop() { + super.onStop(); + } @Override public void onPause() { isPause = true; diff --git a/mylibrary/src/main/java/com/dahe/mylibrary/pop/PopBottomPic.kt b/mylibrary/src/main/java/com/dahe/mylibrary/pop/PopBottomPic.kt index 09cf53a..bfe0c9f 100644 --- a/mylibrary/src/main/java/com/dahe/mylibrary/pop/PopBottomPic.kt +++ b/mylibrary/src/main/java/com/dahe/mylibrary/pop/PopBottomPic.kt @@ -90,7 +90,7 @@ class PopBottomPic( .setCompressEngine(ImageFileCompressEngine()) .isPreviewImage(true) .isMaxSelectEnabledMask(true) - .setMaxSelectNum(6) + .setMaxSelectNum(1) .isGif(false) .setSelectedData(myAdapter.data) selectionModel.forResult(object : OnResultCallbackListener {