From 6e08af9959e144df39036223558dd2fa1b0e59a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=B4=AA=E9=BE=99?= <599179587@qq.com> Date: Mon, 10 Jul 2017 11:41:07 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .classpath | 36 + .gitignore | 1 + .project | 47 + nb-configuration.xml | 24 + pom.xml | 299 ++++ .../java/com/ifish/action/AdInfoAction.java | 55 + .../com/ifish/action/CommodityAction.java | 97 ++ .../java/com/ifish/action/CouponAction.java | 63 + .../java/com/ifish/action/FileAction.java | 32 + .../java/com/ifish/action/GoldAction.java | 109 ++ .../java/com/ifish/action/GradeAction.java | 71 + .../com/ifish/action/IfishDoctorAction.java | 54 + .../com/ifish/action/IfishGoodsAction.java | 51 + .../com/ifish/action/InformationAction.java | 76 + .../java/com/ifish/action/LiveRoomAction.java | 209 +++ .../java/com/ifish/action/PageListAction.java | 85 + .../java/com/ifish/action/ShopsAction.java | 194 +++ .../com/ifish/action/UpdateUserAction.java | 76 + .../java/com/ifish/action/UserAction.java | 642 +++++++ .../com/ifish/action/UserActivityAction.java | 56 + .../java/com/ifish/action/UsersAction.java | 144 ++ .../java/com/ifish/apiVersion/ApiVersion.java | 15 + .../com/ifish/bean/CommodityInfoBean.java | 308 ++++ .../java/com/ifish/bean/DeviceUserBean.java | 228 +++ .../java/com/ifish/bean/VenderListBean.java | 243 +++ .../java/com/ifish/config/RedisConfig.java | 59 + src/main/java/com/ifish/dao/AdInfoDao.java | 12 + src/main/java/com/ifish/dao/BaseDao.java | 37 + .../java/com/ifish/dao/BrowseRoomDao.java | 14 + .../java/com/ifish/dao/CameraActiveDao.java | 13 + src/main/java/com/ifish/dao/CameraDao.java | 13 + .../java/com/ifish/dao/CameraUserDao.java | 20 + src/main/java/com/ifish/dao/CommentDao.java | 15 + src/main/java/com/ifish/dao/CouponDao.java | 12 + .../java/com/ifish/dao/CouponRecordDao.java | 26 + .../java/com/ifish/dao/DeviceCameraDao.java | 18 + src/main/java/com/ifish/dao/DeviceDao.java | 13 + .../java/com/ifish/dao/DeviceUserDao.java | 25 + .../java/com/ifish/dao/GoldControlDao.java | 13 + .../com/ifish/dao/GoldExpendRecordDao.java | 12 + .../java/com/ifish/dao/GoldGetRecordDao.java | 21 + src/main/java/com/ifish/dao/GoldRuleDao.java | 12 + .../java/com/ifish/dao/GradeControlDao.java | 13 + src/main/java/com/ifish/dao/GradeDao.java | 13 + .../java/com/ifish/dao/GradeRecordDao.java | 13 + src/main/java/com/ifish/dao/GradeRuleDao.java | 13 + .../java/com/ifish/dao/HardwareTypeDao.java | 13 + .../java/com/ifish/dao/IfishDoctorDao.java | 13 + .../java/com/ifish/dao/IfishGoodsDao.java | 12 + src/main/java/com/ifish/dao/IfishShopDao.java | 12 + .../java/com/ifish/dao/InformationDao.java | 14 + .../com/ifish/dao/InformationStatsDao.java | 12 + .../java/com/ifish/dao/LiveBannerDao.java | 13 + .../java/com/ifish/dao/LiveMessageDao.java | 21 + src/main/java/com/ifish/dao/LiveRoomDao.java | 62 + .../java/com/ifish/dao/LiveRoomZanDao.java | 20 + .../java/com/ifish/dao/LookReportDao.java | 13 + src/main/java/com/ifish/dao/PushListDao.java | 15 + .../com/ifish/dao/QuestionsFeedbackDao.java | 13 + src/main/java/com/ifish/dao/ShopsInfoDao.java | 35 + .../java/com/ifish/dao/ShopsUserInfoDao.java | 13 + src/main/java/com/ifish/dao/UeditorDao.java | 13 + .../java/com/ifish/dao/UserActivityDao.java | 12 + src/main/java/com/ifish/dao/UserAssetDao.java | 12 + src/main/java/com/ifish/dao/UserDao.java | 42 + .../java/com/ifish/dao/VenderListDao.java | 18 + src/main/java/com/ifish/dao/VersionDao.java | 15 + .../java/com/ifish/daoImpl/AdInfoDaoImpl.java | 20 + .../com/ifish/daoImpl/BrowseRoomDaoImpl.java | 25 + .../ifish/daoImpl/CameraActiveDaoImpl.java | 24 + .../java/com/ifish/daoImpl/CameraDaoImpl.java | 24 + .../com/ifish/daoImpl/CameraUserDaoImpl.java | 39 + .../com/ifish/daoImpl/CommentDaoImpl.java | 31 + .../java/com/ifish/daoImpl/CouponDaoImpl.java | 22 + .../ifish/daoImpl/CouponRecordDaoImpl.java | 37 + .../ifish/daoImpl/DeviceCameraDaoImpl.java | 35 + .../java/com/ifish/daoImpl/DeviceDaoImpl.java | 24 + .../com/ifish/daoImpl/DeviceUserDaoImpl.java | 47 + .../com/ifish/daoImpl/GoldControlDaoImpl.java | 23 + .../daoImpl/GoldExpendRecordDaoImpl.java | 22 + .../ifish/daoImpl/GoldGetRecordDaoImpl.java | 31 + .../java/com/ifish/daoImpl/GoldRuleImpl.java | 23 + .../ifish/daoImpl/GradeControlDaoImpl.java | 23 + .../java/com/ifish/daoImpl/GradeDaoImpl.java | 24 + .../com/ifish/daoImpl/GradeRecordDaoImpl.java | 24 + .../java/com/ifish/daoImpl/GradeRuleImpl.java | 24 + .../ifish/daoImpl/HardwareTypeDaoImpl.java | 25 + .../com/ifish/daoImpl/IfishDoctorDaoImpl.java | 24 + .../com/ifish/daoImpl/IfishGoodsDaoImpl.java | 22 + .../com/ifish/daoImpl/IfishShopDaoImpl.java | 22 + .../com/ifish/daoImpl/InformationDaoImpl.java | 24 + .../daoImpl/InformationStatsDaoImpl.java | 22 + .../com/ifish/daoImpl/LiveBannerImpl.java | 24 + .../com/ifish/daoImpl/LiveMessageDaoImpl.java | 32 + .../java/com/ifish/daoImpl/LiveRoomImpl.java | 203 +++ .../com/ifish/daoImpl/LiveRoomZanDaoImpl.java | 31 + .../com/ifish/daoImpl/LookReportDaoImpl.java | 24 + .../com/ifish/daoImpl/PushListDaoImpl.java | 51 + .../daoImpl/QuestionsFeedbackDaoImpl.java | 25 + .../com/ifish/daoImpl/ShopsInfoDaoImpl.java | 78 + .../ifish/daoImpl/ShopsUserInfoDaoImpl.java | 23 + .../com/ifish/daoImpl/UeditorDaoImpl.java | 24 + .../ifish/daoImpl/UserActivityDaoImpl.java | 22 + .../com/ifish/daoImpl/UserAssetDaoImpl.java | 17 + .../java/com/ifish/daoImpl/UserDaoImpl.java | 66 + .../com/ifish/daoImpl/VenderListDaoImpl.java | 41 + .../com/ifish/daoImpl/VersionDaoImpl.java | 44 + src/main/java/com/ifish/dto/AdInfoDto.java | 69 + src/main/java/com/ifish/dto/DeviceDto.java | 205 +++ .../java/com/ifish/dto/DeviceInfoDto.java | 43 + src/main/java/com/ifish/dto/GoldTaskDto.java | 62 + src/main/java/com/ifish/dto/GradeInfoDto.java | 62 + .../java/com/ifish/dto/GwellParamDto.java | 66 + .../java/com/ifish/dto/IfishGoodsDto.java | 102 ++ .../java/com/ifish/dto/InformationDto.java | 76 + src/main/java/com/ifish/dto/JsonResult.java | 49 + .../java/com/ifish/dto/LiveRoomInfoDto.java | 169 ++ .../java/com/ifish/dto/NeteaseParamDto.java | 42 + src/main/java/com/ifish/dto/PageingDto.java | 62 + src/main/java/com/ifish/dto/RuleInfoDto.java | 88 + .../java/com/ifish/dto/RuleRecordDto.java | 68 + src/main/java/com/ifish/dto/ShopsListDto.java | 143 ++ .../java/com/ifish/dto/ShopsLookUserDto.java | 53 + src/main/java/com/ifish/dto/ShopsUserDto.java | 68 + .../java/com/ifish/dto/ShopsUserInfoDto.java | 147 ++ .../java/com/ifish/dto/UserActivityDto.java | 93 + src/main/java/com/ifish/dto/UserAssetDto.java | 139 ++ src/main/java/com/ifish/dto/UserInfoDto.java | 133 ++ src/main/java/com/ifish/dto/VenderDto.java | 48 + src/main/java/com/ifish/entity/AdInfo.java | 120 ++ .../java/com/ifish/entity/BrowseRoom.java | 39 + .../java/com/ifish/entity/BrowseRoomId.java | 52 + src/main/java/com/ifish/entity/Camera.java | 56 + .../java/com/ifish/entity/CameraActive.java | 48 + .../java/com/ifish/entity/CameraUser.java | 72 + .../java/com/ifish/entity/CameraUserId.java | 52 + src/main/java/com/ifish/entity/Comment.java | 130 ++ src/main/java/com/ifish/entity/Coupon.java | 155 ++ .../java/com/ifish/entity/CouponRecord.java | 164 ++ src/main/java/com/ifish/entity/Device.java | 152 ++ .../java/com/ifish/entity/DeviceCamera.java | 22 + .../java/com/ifish/entity/DeviceCameraId.java | 47 + .../java/com/ifish/entity/DeviceUser.java | 84 + .../java/com/ifish/entity/DeviceUserId.java | 47 + .../java/com/ifish/entity/GoldControl.java | 71 + .../java/com/ifish/entity/GoldControlId.java | 60 + .../com/ifish/entity/GoldExpendRecord.java | 129 ++ .../java/com/ifish/entity/GoldGetRecord.java | 133 ++ src/main/java/com/ifish/entity/GoldTask.java | 101 ++ src/main/java/com/ifish/entity/Grade.java | 90 + .../java/com/ifish/entity/GradeControl.java | 71 + .../java/com/ifish/entity/GradeControlId.java | 60 + .../java/com/ifish/entity/GradeRecord.java | 115 ++ src/main/java/com/ifish/entity/GradeTask.java | 100 ++ .../java/com/ifish/entity/HardwareType.java | 144 ++ .../java/com/ifish/entity/IfishDoctor.java | 106 ++ .../java/com/ifish/entity/IfishGoods.java | 160 ++ src/main/java/com/ifish/entity/IfishShop.java | 48 + .../java/com/ifish/entity/Information.java | 142 ++ .../com/ifish/entity/InformationStats.java | 45 + .../java/com/ifish/entity/LiveBanner.java | 55 + .../java/com/ifish/entity/LiveMessage.java | 130 ++ src/main/java/com/ifish/entity/LiveRoom.java | 118 ++ .../java/com/ifish/entity/LiveRoomZan.java | 36 + .../java/com/ifish/entity/LiveRoomZanId.java | 47 + .../java/com/ifish/entity/LookReport.java | 153 ++ src/main/java/com/ifish/entity/PushList.java | 137 ++ .../com/ifish/entity/QuestionsFeedback.java | 64 + src/main/java/com/ifish/entity/ShopsInfo.java | 192 ++ .../java/com/ifish/entity/ShopsUserInfo.java | 164 ++ .../com/ifish/entity/ShopsUserInfoId.java | 47 + src/main/java/com/ifish/entity/Ueditor.java | 85 + src/main/java/com/ifish/entity/User.java | 293 ++++ .../java/com/ifish/entity/UserActivity.java | 74 + src/main/java/com/ifish/entity/UserAsset.java | 108 ++ .../java/com/ifish/entity/VenderList.java | 67 + src/main/java/com/ifish/entity/Version.java | 73 + .../com/ifish/entity/hbm/BrowseRoom.hbm.xml | 13 + .../java/com/ifish/entity/hbm/Camera.hbm.xml | 14 + .../com/ifish/entity/hbm/CameraActive.hbm.xml | 13 + .../com/ifish/entity/hbm/CameraUser.hbm.xml | 17 + .../java/com/ifish/entity/hbm/Device.hbm.xml | 26 + .../com/ifish/entity/hbm/DeviceCamera.hbm.xml | 11 + .../com/ifish/entity/hbm/DeviceUser.hbm.xml | 17 + .../com/ifish/entity/hbm/HardwareType.hbm.xml | 25 + .../com/ifish/entity/hbm/LiveBanner.hbm.xml | 14 + .../com/ifish/entity/hbm/LookReport.hbm.xml | 22 + .../com/ifish/entity/hbm/PushList.hbm.xml | 22 + .../entity/hbm/QuestionsFeedback.hbm.xml | 15 + .../com/ifish/entity/hbm/ShopsInfo.hbm.xml | 31 + .../java/com/ifish/entity/hbm/Version.hbm.xml | 16 + .../com/ifish/enums/ActivityTypeEnum.java | 62 + src/main/java/com/ifish/enums/AdTypeEnum.java | 43 + .../java/com/ifish/enums/AddTypeEnum.java | 53 + .../java/com/ifish/enums/BooleanEnum.java | 29 + .../com/ifish/enums/GoldExpendTypeEnum.java | 56 + .../java/com/ifish/enums/GoldGetTypeEnum.java | 73 + .../com/ifish/enums/GradeGetTypeEnum.java | 39 + src/main/java/com/ifish/enums/GwellEnum.java | 29 + .../com/ifish/enums/IfishShopPlaceEnum.java | 55 + src/main/java/com/ifish/enums/Index1Enum.java | 40 + src/main/java/com/ifish/enums/Index2Enum.java | 40 + src/main/java/com/ifish/enums/Index3Enum.java | 40 + .../ifish/enums/LiveRoomOrderTypeEnum.java | 45 + .../java/com/ifish/enums/MemberLevelEnum.java | 28 + .../java/com/ifish/enums/NeteaseEnum.java | 28 + .../java/com/ifish/enums/PayTourTypeEnum.java | 53 + .../java/com/ifish/enums/PhoneTypeEnum.java | 29 + .../java/com/ifish/enums/PushTypeEnum.java | 45 + src/main/java/com/ifish/enums/ResultEnum.java | 63 + .../java/com/ifish/enums/RoomStatusEnum.java | 30 + .../java/com/ifish/enums/SendTypeEnum.java | 34 + .../java/com/ifish/enums/ShopsStatusEnum.java | 31 + .../java/com/ifish/enums/SmsSignEnum.java | 32 + .../java/com/ifish/enums/SmsTemplateEnum.java | 34 + .../com/ifish/enums/SubDirectoryEnum.java | 40 + .../java/com/ifish/enums/UeditorTypeEnum.java | 39 + .../java/com/ifish/enums/UserTypeEnum.java | 29 + .../com/ifish/exception/ExceptionHandle.java | 37 + .../com/ifish/exception/IfishException.java | 26 + src/main/java/com/ifish/gwell/GwellApi.java | 224 +++ .../com/ifish/helper/CameraUserHelper.java | 79 + .../com/ifish/helper/CameraUserHelperI.java | 35 + .../com/ifish/helper/CommodityInfoHelper.java | 161 ++ .../ifish/helper/CommodityInfoHelperI.java | 62 + .../com/ifish/helper/DeviceUserHelper.java | 92 + .../com/ifish/helper/DeviceUserHelperI.java | 44 + .../java/com/ifish/helper/FastDFSClient.java | 169 ++ .../java/com/ifish/helper/FastDFSClientI.java | 64 + .../ifish/helper/HardWareVenderHelper.java | 78 + .../ifish/helper/HardWareVenderHelperI.java | 34 + .../java/com/ifish/helper/RedisHelper.java | 140 ++ .../java/com/ifish/helper/RedisHelperI.java | 68 + .../com/ifish/helper/ShopsInfoHelper.java | 49 + .../com/ifish/helper/ShopsInfoHelperI.java | 24 + .../com/ifish/helper/UserActivityHelper.java | 66 + .../com/ifish/helper/UserActivityHelperI.java | 34 + .../java/com/ifish/helper/UserHelper.java | 549 ++++++ .../java/com/ifish/helper/UserHelperI.java | 32 + .../com/ifish/hibernate/HibernateBaseDao.java | 165 ++ .../java/com/ifish/hibernate/Pagination.java | 82 + .../SecurityValidateInterceptor.java | 69 + src/main/java/com/ifish/jpush/SmsNumSend.java | 55 + src/main/java/com/ifish/mail/Mail.java | 200 +++ .../com/ifish/mapper/Tbl_Ad_Info_Mapper.java | 23 + .../com/ifish/mapper/Tbl_Camera_Mapper.java | 28 + .../ifish/mapper/Tbl_Camera_User_Mapper.java | 28 + .../mapper/Tbl_Commodity_Info_Mapper.java | 84 + .../mapper/Tbl_Commodity_Info_MapperSql.java | 82 + .../com/ifish/mapper/Tbl_Device_Mapper.java | 28 + .../ifish/mapper/Tbl_Device_User_Mapper.java | 38 + .../mapper/Tbl_Hardware_Type_Mapper.java | 28 + .../ifish/mapper/Tbl_Shops_Info_Mapper.java | 22 + .../mapper/Tbl_User_Activity_Mapper.java | 37 + .../com/ifish/mapper/Tbl_User_Mapper.java | 57 + .../com/ifish/mapper/Tbl_User_MapperSql.java | 92 + .../ifish/mapper/Tbl_Vender_list_Mapper.java | 27 + .../com/ifish/netease/CheckSumBuilder.java | 48 + .../java/com/ifish/netease/NeteaseIM.java | 343 ++++ .../serializer/CustomDateSerializer.java | 21 + .../com/ifish/serializer/DateSerializer.java | 21 + .../java/com/ifish/service/AdInfoService.java | 21 + .../com/ifish/service/AsyncTaskService.java | 29 + .../java/com/ifish/service/BaseService.java | 138 ++ .../java/com/ifish/service/CacheService.java | 85 + .../java/com/ifish/service/CameraService.java | 10 + .../java/com/ifish/service/CouponService.java | 33 + .../java/com/ifish/service/GoldService.java | 63 + .../java/com/ifish/service/GradeService.java | 46 + .../com/ifish/service/IfishDoctorService.java | 25 + .../com/ifish/service/IfishGoodsService.java | 26 + .../com/ifish/service/InformationService.java | 55 + .../com/ifish/service/LiveRoomService.java | 74 + .../com/ifish/service/PageListService.java | 22 + .../java/com/ifish/service/ShopsService.java | 71 + .../ifish/service/UserActivityService.java | 22 + .../java/com/ifish/service/UserService.java | 83 + .../ifish/serviceImpl/AdInfoServiceImpl.java | 59 + .../serviceImpl/AsyncTaskServiceImpl.java | 100 ++ .../ifish/serviceImpl/BaseServiceImpl.java | 1544 +++++++++++++++++ .../ifish/serviceImpl/CacheServiceImpl.java | 190 ++ .../ifish/serviceImpl/CameraServiceImpl.java | 13 + .../ifish/serviceImpl/CouponServiceImpl.java | 181 ++ .../ifish/serviceImpl/GoldServiceImpl.java | 430 +++++ .../ifish/serviceImpl/GradeServicempl.java | 221 +++ .../serviceImpl/IfishDoctorServiceImpl.java | 139 ++ .../serviceImpl/IfishGoodsServiceImpl.java | 71 + .../serviceImpl/InformationServiceImpl.java | 197 +++ .../serviceImpl/LiveRoomServiceImpl.java | 554 ++++++ .../serviceImpl/PageListServiceImpl.java | 39 + .../ifish/serviceImpl/ShopsServiceImpl.java | 475 +++++ .../serviceImpl/UserActivityServiceImpl.java | 82 + .../ifish/serviceImpl/UserServiceImpl.java | 1072 ++++++++++++ .../java/com/ifish/util/IfishFilePath.java | 90 + .../java/com/ifish/util/IfishFileUtils.java | 43 + src/main/java/com/ifish/util/IfishUtil.java | 488 ++++++ src/main/java/com/ifish/util/RedisKey.java | 60 + src/main/java/com/ifish/util/ResultUtil.java | 66 + src/main/java/com/ifish/util/StringUtil.java | 229 +++ .../com/ifish/validator/AddValueParam.java | 50 + .../com/ifish/validator/LiveRoomParam.java | 75 + .../java/com/ifish/validator/LoginParam.java | 64 + .../java/com/ifish/validator/PageParam.java | 61 + .../com/ifish/validator/RegisterParam.java | 106 ++ .../ifish/validator/ShopsUserInfoParam.java | 108 ++ .../com/ifish/validator/ValidateUtil.java | 23 + src/main/resources/application-context.xml | 101 ++ src/main/resources/ehcache-setting.xml | 50 + src/main/resources/fdfs_client_ifish7.conf | 7 + .../resources/fdfs_client_zhangxinyanv5.conf | 8 + src/main/resources/ifish.properties | 6 + src/main/resources/jdbc.properties | 29 + src/main/resources/logback.xml | 38 + src/main/resources/mybatis-config.xml | 7 + src/main/resources/property.properties | 34 + src/main/resources/spring-mybatis.xml | 73 + src/main/resources/springmvc-servlet.xml | 72 + src/main/webapp/META-INF/MANIFEST.MF | 3 + src/main/webapp/META-INF/context.xml | 2 + .../webapp/WEB-INF/lib/commons-codec-1.4.jar | Bin 0 -> 58160 bytes .../WEB-INF/lib/fastdfs-client-java-1.25.jar | Bin 0 -> 91061 bytes .../WEB-INF/lib/mysql-connector-5.1.8.jar | Bin 0 -> 723660 bytes ...o-sdk-java-auto_1444640346387-20151013.jar | Bin 0 -> 543502 bytes src/main/webapp/WEB-INF/web.xml | 50 + src/main/webapp/index.jsp | 11 + src/main/webapp/static/css/jquery.alerts.css | 57 + src/main/webapp/static/js/jquery-1.8.2.min.js | 2 + src/main/webapp/static/js/jquery.alert.js | 224 +++ src/main/webapp/static/js/jquery.form.js | 1277 ++++++++++++++ .../serviceImpl/AdInfoServiceImplTest.java | 26 + .../serviceImpl/GoldServiceImplTest.java | 25 + .../InformationServiceImplTest.java | 34 + .../UserActivityServiceImplTest.java | 29 + .../serviceImpl/UserServiceImplTest.java | 31 + 334 files changed, 26855 insertions(+) create mode 100644 .classpath create mode 100644 .gitignore create mode 100644 .project create mode 100644 nb-configuration.xml create mode 100644 pom.xml create mode 100644 src/main/java/com/ifish/action/AdInfoAction.java create mode 100644 src/main/java/com/ifish/action/CommodityAction.java create mode 100644 src/main/java/com/ifish/action/CouponAction.java create mode 100644 src/main/java/com/ifish/action/FileAction.java create mode 100644 src/main/java/com/ifish/action/GoldAction.java create mode 100644 src/main/java/com/ifish/action/GradeAction.java create mode 100644 src/main/java/com/ifish/action/IfishDoctorAction.java create mode 100644 src/main/java/com/ifish/action/IfishGoodsAction.java create mode 100644 src/main/java/com/ifish/action/InformationAction.java create mode 100644 src/main/java/com/ifish/action/LiveRoomAction.java create mode 100644 src/main/java/com/ifish/action/PageListAction.java create mode 100644 src/main/java/com/ifish/action/ShopsAction.java create mode 100644 src/main/java/com/ifish/action/UpdateUserAction.java create mode 100644 src/main/java/com/ifish/action/UserAction.java create mode 100644 src/main/java/com/ifish/action/UserActivityAction.java create mode 100644 src/main/java/com/ifish/action/UsersAction.java create mode 100644 src/main/java/com/ifish/apiVersion/ApiVersion.java create mode 100644 src/main/java/com/ifish/bean/CommodityInfoBean.java create mode 100644 src/main/java/com/ifish/bean/DeviceUserBean.java create mode 100644 src/main/java/com/ifish/bean/VenderListBean.java create mode 100644 src/main/java/com/ifish/config/RedisConfig.java create mode 100644 src/main/java/com/ifish/dao/AdInfoDao.java create mode 100644 src/main/java/com/ifish/dao/BaseDao.java create mode 100644 src/main/java/com/ifish/dao/BrowseRoomDao.java create mode 100644 src/main/java/com/ifish/dao/CameraActiveDao.java create mode 100644 src/main/java/com/ifish/dao/CameraDao.java create mode 100644 src/main/java/com/ifish/dao/CameraUserDao.java create mode 100644 src/main/java/com/ifish/dao/CommentDao.java create mode 100644 src/main/java/com/ifish/dao/CouponDao.java create mode 100644 src/main/java/com/ifish/dao/CouponRecordDao.java create mode 100644 src/main/java/com/ifish/dao/DeviceCameraDao.java create mode 100644 src/main/java/com/ifish/dao/DeviceDao.java create mode 100644 src/main/java/com/ifish/dao/DeviceUserDao.java create mode 100644 src/main/java/com/ifish/dao/GoldControlDao.java create mode 100644 src/main/java/com/ifish/dao/GoldExpendRecordDao.java create mode 100644 src/main/java/com/ifish/dao/GoldGetRecordDao.java create mode 100644 src/main/java/com/ifish/dao/GoldRuleDao.java create mode 100644 src/main/java/com/ifish/dao/GradeControlDao.java create mode 100644 src/main/java/com/ifish/dao/GradeDao.java create mode 100644 src/main/java/com/ifish/dao/GradeRecordDao.java create mode 100644 src/main/java/com/ifish/dao/GradeRuleDao.java create mode 100644 src/main/java/com/ifish/dao/HardwareTypeDao.java create mode 100644 src/main/java/com/ifish/dao/IfishDoctorDao.java create mode 100644 src/main/java/com/ifish/dao/IfishGoodsDao.java create mode 100644 src/main/java/com/ifish/dao/IfishShopDao.java create mode 100644 src/main/java/com/ifish/dao/InformationDao.java create mode 100644 src/main/java/com/ifish/dao/InformationStatsDao.java create mode 100644 src/main/java/com/ifish/dao/LiveBannerDao.java create mode 100644 src/main/java/com/ifish/dao/LiveMessageDao.java create mode 100644 src/main/java/com/ifish/dao/LiveRoomDao.java create mode 100644 src/main/java/com/ifish/dao/LiveRoomZanDao.java create mode 100644 src/main/java/com/ifish/dao/LookReportDao.java create mode 100644 src/main/java/com/ifish/dao/PushListDao.java create mode 100644 src/main/java/com/ifish/dao/QuestionsFeedbackDao.java create mode 100644 src/main/java/com/ifish/dao/ShopsInfoDao.java create mode 100644 src/main/java/com/ifish/dao/ShopsUserInfoDao.java create mode 100644 src/main/java/com/ifish/dao/UeditorDao.java create mode 100644 src/main/java/com/ifish/dao/UserActivityDao.java create mode 100644 src/main/java/com/ifish/dao/UserAssetDao.java create mode 100644 src/main/java/com/ifish/dao/UserDao.java create mode 100644 src/main/java/com/ifish/dao/VenderListDao.java create mode 100644 src/main/java/com/ifish/dao/VersionDao.java create mode 100644 src/main/java/com/ifish/daoImpl/AdInfoDaoImpl.java create mode 100644 src/main/java/com/ifish/daoImpl/BrowseRoomDaoImpl.java create mode 100644 src/main/java/com/ifish/daoImpl/CameraActiveDaoImpl.java create mode 100644 src/main/java/com/ifish/daoImpl/CameraDaoImpl.java create mode 100644 src/main/java/com/ifish/daoImpl/CameraUserDaoImpl.java create mode 100644 src/main/java/com/ifish/daoImpl/CommentDaoImpl.java create mode 100644 src/main/java/com/ifish/daoImpl/CouponDaoImpl.java create mode 100644 src/main/java/com/ifish/daoImpl/CouponRecordDaoImpl.java create mode 100644 src/main/java/com/ifish/daoImpl/DeviceCameraDaoImpl.java create mode 100644 src/main/java/com/ifish/daoImpl/DeviceDaoImpl.java create mode 100644 src/main/java/com/ifish/daoImpl/DeviceUserDaoImpl.java create mode 100644 src/main/java/com/ifish/daoImpl/GoldControlDaoImpl.java create mode 100644 src/main/java/com/ifish/daoImpl/GoldExpendRecordDaoImpl.java create mode 100644 src/main/java/com/ifish/daoImpl/GoldGetRecordDaoImpl.java create mode 100644 src/main/java/com/ifish/daoImpl/GoldRuleImpl.java create mode 100644 src/main/java/com/ifish/daoImpl/GradeControlDaoImpl.java create mode 100644 src/main/java/com/ifish/daoImpl/GradeDaoImpl.java create mode 100644 src/main/java/com/ifish/daoImpl/GradeRecordDaoImpl.java create mode 100644 src/main/java/com/ifish/daoImpl/GradeRuleImpl.java create mode 100644 src/main/java/com/ifish/daoImpl/HardwareTypeDaoImpl.java create mode 100644 src/main/java/com/ifish/daoImpl/IfishDoctorDaoImpl.java create mode 100644 src/main/java/com/ifish/daoImpl/IfishGoodsDaoImpl.java create mode 100644 src/main/java/com/ifish/daoImpl/IfishShopDaoImpl.java create mode 100644 src/main/java/com/ifish/daoImpl/InformationDaoImpl.java create mode 100644 src/main/java/com/ifish/daoImpl/InformationStatsDaoImpl.java create mode 100644 src/main/java/com/ifish/daoImpl/LiveBannerImpl.java create mode 100644 src/main/java/com/ifish/daoImpl/LiveMessageDaoImpl.java create mode 100644 src/main/java/com/ifish/daoImpl/LiveRoomImpl.java create mode 100644 src/main/java/com/ifish/daoImpl/LiveRoomZanDaoImpl.java create mode 100644 src/main/java/com/ifish/daoImpl/LookReportDaoImpl.java create mode 100644 src/main/java/com/ifish/daoImpl/PushListDaoImpl.java create mode 100644 src/main/java/com/ifish/daoImpl/QuestionsFeedbackDaoImpl.java create mode 100644 src/main/java/com/ifish/daoImpl/ShopsInfoDaoImpl.java create mode 100644 src/main/java/com/ifish/daoImpl/ShopsUserInfoDaoImpl.java create mode 100644 src/main/java/com/ifish/daoImpl/UeditorDaoImpl.java create mode 100644 src/main/java/com/ifish/daoImpl/UserActivityDaoImpl.java create mode 100644 src/main/java/com/ifish/daoImpl/UserAssetDaoImpl.java create mode 100644 src/main/java/com/ifish/daoImpl/UserDaoImpl.java create mode 100644 src/main/java/com/ifish/daoImpl/VenderListDaoImpl.java create mode 100644 src/main/java/com/ifish/daoImpl/VersionDaoImpl.java create mode 100644 src/main/java/com/ifish/dto/AdInfoDto.java create mode 100644 src/main/java/com/ifish/dto/DeviceDto.java create mode 100644 src/main/java/com/ifish/dto/DeviceInfoDto.java create mode 100644 src/main/java/com/ifish/dto/GoldTaskDto.java create mode 100644 src/main/java/com/ifish/dto/GradeInfoDto.java create mode 100644 src/main/java/com/ifish/dto/GwellParamDto.java create mode 100644 src/main/java/com/ifish/dto/IfishGoodsDto.java create mode 100644 src/main/java/com/ifish/dto/InformationDto.java create mode 100644 src/main/java/com/ifish/dto/JsonResult.java create mode 100644 src/main/java/com/ifish/dto/LiveRoomInfoDto.java create mode 100644 src/main/java/com/ifish/dto/NeteaseParamDto.java create mode 100644 src/main/java/com/ifish/dto/PageingDto.java create mode 100644 src/main/java/com/ifish/dto/RuleInfoDto.java create mode 100644 src/main/java/com/ifish/dto/RuleRecordDto.java create mode 100644 src/main/java/com/ifish/dto/ShopsListDto.java create mode 100644 src/main/java/com/ifish/dto/ShopsLookUserDto.java create mode 100644 src/main/java/com/ifish/dto/ShopsUserDto.java create mode 100644 src/main/java/com/ifish/dto/ShopsUserInfoDto.java create mode 100644 src/main/java/com/ifish/dto/UserActivityDto.java create mode 100644 src/main/java/com/ifish/dto/UserAssetDto.java create mode 100644 src/main/java/com/ifish/dto/UserInfoDto.java create mode 100644 src/main/java/com/ifish/dto/VenderDto.java create mode 100644 src/main/java/com/ifish/entity/AdInfo.java create mode 100644 src/main/java/com/ifish/entity/BrowseRoom.java create mode 100644 src/main/java/com/ifish/entity/BrowseRoomId.java create mode 100644 src/main/java/com/ifish/entity/Camera.java create mode 100644 src/main/java/com/ifish/entity/CameraActive.java create mode 100644 src/main/java/com/ifish/entity/CameraUser.java create mode 100644 src/main/java/com/ifish/entity/CameraUserId.java create mode 100644 src/main/java/com/ifish/entity/Comment.java create mode 100644 src/main/java/com/ifish/entity/Coupon.java create mode 100644 src/main/java/com/ifish/entity/CouponRecord.java create mode 100644 src/main/java/com/ifish/entity/Device.java create mode 100644 src/main/java/com/ifish/entity/DeviceCamera.java create mode 100644 src/main/java/com/ifish/entity/DeviceCameraId.java create mode 100644 src/main/java/com/ifish/entity/DeviceUser.java create mode 100644 src/main/java/com/ifish/entity/DeviceUserId.java create mode 100644 src/main/java/com/ifish/entity/GoldControl.java create mode 100644 src/main/java/com/ifish/entity/GoldControlId.java create mode 100644 src/main/java/com/ifish/entity/GoldExpendRecord.java create mode 100644 src/main/java/com/ifish/entity/GoldGetRecord.java create mode 100644 src/main/java/com/ifish/entity/GoldTask.java create mode 100644 src/main/java/com/ifish/entity/Grade.java create mode 100644 src/main/java/com/ifish/entity/GradeControl.java create mode 100644 src/main/java/com/ifish/entity/GradeControlId.java create mode 100644 src/main/java/com/ifish/entity/GradeRecord.java create mode 100644 src/main/java/com/ifish/entity/GradeTask.java create mode 100644 src/main/java/com/ifish/entity/HardwareType.java create mode 100644 src/main/java/com/ifish/entity/IfishDoctor.java create mode 100644 src/main/java/com/ifish/entity/IfishGoods.java create mode 100644 src/main/java/com/ifish/entity/IfishShop.java create mode 100644 src/main/java/com/ifish/entity/Information.java create mode 100644 src/main/java/com/ifish/entity/InformationStats.java create mode 100644 src/main/java/com/ifish/entity/LiveBanner.java create mode 100644 src/main/java/com/ifish/entity/LiveMessage.java create mode 100644 src/main/java/com/ifish/entity/LiveRoom.java create mode 100644 src/main/java/com/ifish/entity/LiveRoomZan.java create mode 100644 src/main/java/com/ifish/entity/LiveRoomZanId.java create mode 100644 src/main/java/com/ifish/entity/LookReport.java create mode 100644 src/main/java/com/ifish/entity/PushList.java create mode 100644 src/main/java/com/ifish/entity/QuestionsFeedback.java create mode 100644 src/main/java/com/ifish/entity/ShopsInfo.java create mode 100644 src/main/java/com/ifish/entity/ShopsUserInfo.java create mode 100644 src/main/java/com/ifish/entity/ShopsUserInfoId.java create mode 100644 src/main/java/com/ifish/entity/Ueditor.java create mode 100644 src/main/java/com/ifish/entity/User.java create mode 100644 src/main/java/com/ifish/entity/UserActivity.java create mode 100644 src/main/java/com/ifish/entity/UserAsset.java create mode 100644 src/main/java/com/ifish/entity/VenderList.java create mode 100644 src/main/java/com/ifish/entity/Version.java create mode 100644 src/main/java/com/ifish/entity/hbm/BrowseRoom.hbm.xml create mode 100644 src/main/java/com/ifish/entity/hbm/Camera.hbm.xml create mode 100644 src/main/java/com/ifish/entity/hbm/CameraActive.hbm.xml create mode 100644 src/main/java/com/ifish/entity/hbm/CameraUser.hbm.xml create mode 100644 src/main/java/com/ifish/entity/hbm/Device.hbm.xml create mode 100644 src/main/java/com/ifish/entity/hbm/DeviceCamera.hbm.xml create mode 100644 src/main/java/com/ifish/entity/hbm/DeviceUser.hbm.xml create mode 100644 src/main/java/com/ifish/entity/hbm/HardwareType.hbm.xml create mode 100644 src/main/java/com/ifish/entity/hbm/LiveBanner.hbm.xml create mode 100644 src/main/java/com/ifish/entity/hbm/LookReport.hbm.xml create mode 100644 src/main/java/com/ifish/entity/hbm/PushList.hbm.xml create mode 100644 src/main/java/com/ifish/entity/hbm/QuestionsFeedback.hbm.xml create mode 100644 src/main/java/com/ifish/entity/hbm/ShopsInfo.hbm.xml create mode 100644 src/main/java/com/ifish/entity/hbm/Version.hbm.xml create mode 100644 src/main/java/com/ifish/enums/ActivityTypeEnum.java create mode 100644 src/main/java/com/ifish/enums/AdTypeEnum.java create mode 100644 src/main/java/com/ifish/enums/AddTypeEnum.java create mode 100644 src/main/java/com/ifish/enums/BooleanEnum.java create mode 100644 src/main/java/com/ifish/enums/GoldExpendTypeEnum.java create mode 100644 src/main/java/com/ifish/enums/GoldGetTypeEnum.java create mode 100644 src/main/java/com/ifish/enums/GradeGetTypeEnum.java create mode 100644 src/main/java/com/ifish/enums/GwellEnum.java create mode 100644 src/main/java/com/ifish/enums/IfishShopPlaceEnum.java create mode 100644 src/main/java/com/ifish/enums/Index1Enum.java create mode 100644 src/main/java/com/ifish/enums/Index2Enum.java create mode 100644 src/main/java/com/ifish/enums/Index3Enum.java create mode 100644 src/main/java/com/ifish/enums/LiveRoomOrderTypeEnum.java create mode 100644 src/main/java/com/ifish/enums/MemberLevelEnum.java create mode 100644 src/main/java/com/ifish/enums/NeteaseEnum.java create mode 100644 src/main/java/com/ifish/enums/PayTourTypeEnum.java create mode 100644 src/main/java/com/ifish/enums/PhoneTypeEnum.java create mode 100644 src/main/java/com/ifish/enums/PushTypeEnum.java create mode 100644 src/main/java/com/ifish/enums/ResultEnum.java create mode 100644 src/main/java/com/ifish/enums/RoomStatusEnum.java create mode 100644 src/main/java/com/ifish/enums/SendTypeEnum.java create mode 100644 src/main/java/com/ifish/enums/ShopsStatusEnum.java create mode 100644 src/main/java/com/ifish/enums/SmsSignEnum.java create mode 100644 src/main/java/com/ifish/enums/SmsTemplateEnum.java create mode 100644 src/main/java/com/ifish/enums/SubDirectoryEnum.java create mode 100644 src/main/java/com/ifish/enums/UeditorTypeEnum.java create mode 100644 src/main/java/com/ifish/enums/UserTypeEnum.java create mode 100644 src/main/java/com/ifish/exception/ExceptionHandle.java create mode 100644 src/main/java/com/ifish/exception/IfishException.java create mode 100644 src/main/java/com/ifish/gwell/GwellApi.java create mode 100644 src/main/java/com/ifish/helper/CameraUserHelper.java create mode 100644 src/main/java/com/ifish/helper/CameraUserHelperI.java create mode 100644 src/main/java/com/ifish/helper/CommodityInfoHelper.java create mode 100644 src/main/java/com/ifish/helper/CommodityInfoHelperI.java create mode 100644 src/main/java/com/ifish/helper/DeviceUserHelper.java create mode 100644 src/main/java/com/ifish/helper/DeviceUserHelperI.java create mode 100644 src/main/java/com/ifish/helper/FastDFSClient.java create mode 100644 src/main/java/com/ifish/helper/FastDFSClientI.java create mode 100644 src/main/java/com/ifish/helper/HardWareVenderHelper.java create mode 100644 src/main/java/com/ifish/helper/HardWareVenderHelperI.java create mode 100644 src/main/java/com/ifish/helper/RedisHelper.java create mode 100644 src/main/java/com/ifish/helper/RedisHelperI.java create mode 100644 src/main/java/com/ifish/helper/ShopsInfoHelper.java create mode 100644 src/main/java/com/ifish/helper/ShopsInfoHelperI.java create mode 100644 src/main/java/com/ifish/helper/UserActivityHelper.java create mode 100644 src/main/java/com/ifish/helper/UserActivityHelperI.java create mode 100644 src/main/java/com/ifish/helper/UserHelper.java create mode 100644 src/main/java/com/ifish/helper/UserHelperI.java create mode 100644 src/main/java/com/ifish/hibernate/HibernateBaseDao.java create mode 100644 src/main/java/com/ifish/hibernate/Pagination.java create mode 100644 src/main/java/com/ifish/interceptor/SecurityValidateInterceptor.java create mode 100644 src/main/java/com/ifish/jpush/SmsNumSend.java create mode 100644 src/main/java/com/ifish/mail/Mail.java create mode 100644 src/main/java/com/ifish/mapper/Tbl_Ad_Info_Mapper.java create mode 100644 src/main/java/com/ifish/mapper/Tbl_Camera_Mapper.java create mode 100644 src/main/java/com/ifish/mapper/Tbl_Camera_User_Mapper.java create mode 100644 src/main/java/com/ifish/mapper/Tbl_Commodity_Info_Mapper.java create mode 100644 src/main/java/com/ifish/mapper/Tbl_Commodity_Info_MapperSql.java create mode 100644 src/main/java/com/ifish/mapper/Tbl_Device_Mapper.java create mode 100644 src/main/java/com/ifish/mapper/Tbl_Device_User_Mapper.java create mode 100644 src/main/java/com/ifish/mapper/Tbl_Hardware_Type_Mapper.java create mode 100644 src/main/java/com/ifish/mapper/Tbl_Shops_Info_Mapper.java create mode 100644 src/main/java/com/ifish/mapper/Tbl_User_Activity_Mapper.java create mode 100644 src/main/java/com/ifish/mapper/Tbl_User_Mapper.java create mode 100644 src/main/java/com/ifish/mapper/Tbl_User_MapperSql.java create mode 100644 src/main/java/com/ifish/mapper/Tbl_Vender_list_Mapper.java create mode 100644 src/main/java/com/ifish/netease/CheckSumBuilder.java create mode 100644 src/main/java/com/ifish/netease/NeteaseIM.java create mode 100644 src/main/java/com/ifish/serializer/CustomDateSerializer.java create mode 100644 src/main/java/com/ifish/serializer/DateSerializer.java create mode 100644 src/main/java/com/ifish/service/AdInfoService.java create mode 100644 src/main/java/com/ifish/service/AsyncTaskService.java create mode 100644 src/main/java/com/ifish/service/BaseService.java create mode 100644 src/main/java/com/ifish/service/CacheService.java create mode 100644 src/main/java/com/ifish/service/CameraService.java create mode 100644 src/main/java/com/ifish/service/CouponService.java create mode 100644 src/main/java/com/ifish/service/GoldService.java create mode 100644 src/main/java/com/ifish/service/GradeService.java create mode 100644 src/main/java/com/ifish/service/IfishDoctorService.java create mode 100644 src/main/java/com/ifish/service/IfishGoodsService.java create mode 100644 src/main/java/com/ifish/service/InformationService.java create mode 100644 src/main/java/com/ifish/service/LiveRoomService.java create mode 100644 src/main/java/com/ifish/service/PageListService.java create mode 100644 src/main/java/com/ifish/service/ShopsService.java create mode 100644 src/main/java/com/ifish/service/UserActivityService.java create mode 100644 src/main/java/com/ifish/service/UserService.java create mode 100644 src/main/java/com/ifish/serviceImpl/AdInfoServiceImpl.java create mode 100644 src/main/java/com/ifish/serviceImpl/AsyncTaskServiceImpl.java create mode 100644 src/main/java/com/ifish/serviceImpl/BaseServiceImpl.java create mode 100644 src/main/java/com/ifish/serviceImpl/CacheServiceImpl.java create mode 100644 src/main/java/com/ifish/serviceImpl/CameraServiceImpl.java create mode 100644 src/main/java/com/ifish/serviceImpl/CouponServiceImpl.java create mode 100644 src/main/java/com/ifish/serviceImpl/GoldServiceImpl.java create mode 100644 src/main/java/com/ifish/serviceImpl/GradeServicempl.java create mode 100644 src/main/java/com/ifish/serviceImpl/IfishDoctorServiceImpl.java create mode 100644 src/main/java/com/ifish/serviceImpl/IfishGoodsServiceImpl.java create mode 100644 src/main/java/com/ifish/serviceImpl/InformationServiceImpl.java create mode 100644 src/main/java/com/ifish/serviceImpl/LiveRoomServiceImpl.java create mode 100644 src/main/java/com/ifish/serviceImpl/PageListServiceImpl.java create mode 100644 src/main/java/com/ifish/serviceImpl/ShopsServiceImpl.java create mode 100644 src/main/java/com/ifish/serviceImpl/UserActivityServiceImpl.java create mode 100644 src/main/java/com/ifish/serviceImpl/UserServiceImpl.java create mode 100644 src/main/java/com/ifish/util/IfishFilePath.java create mode 100644 src/main/java/com/ifish/util/IfishFileUtils.java create mode 100644 src/main/java/com/ifish/util/IfishUtil.java create mode 100644 src/main/java/com/ifish/util/RedisKey.java create mode 100644 src/main/java/com/ifish/util/ResultUtil.java create mode 100644 src/main/java/com/ifish/util/StringUtil.java create mode 100644 src/main/java/com/ifish/validator/AddValueParam.java create mode 100644 src/main/java/com/ifish/validator/LiveRoomParam.java create mode 100644 src/main/java/com/ifish/validator/LoginParam.java create mode 100644 src/main/java/com/ifish/validator/PageParam.java create mode 100644 src/main/java/com/ifish/validator/RegisterParam.java create mode 100644 src/main/java/com/ifish/validator/ShopsUserInfoParam.java create mode 100644 src/main/java/com/ifish/validator/ValidateUtil.java create mode 100644 src/main/resources/application-context.xml create mode 100644 src/main/resources/ehcache-setting.xml create mode 100644 src/main/resources/fdfs_client_ifish7.conf create mode 100644 src/main/resources/fdfs_client_zhangxinyanv5.conf create mode 100644 src/main/resources/ifish.properties create mode 100644 src/main/resources/jdbc.properties create mode 100644 src/main/resources/logback.xml create mode 100644 src/main/resources/mybatis-config.xml create mode 100644 src/main/resources/property.properties create mode 100644 src/main/resources/spring-mybatis.xml create mode 100644 src/main/resources/springmvc-servlet.xml create mode 100644 src/main/webapp/META-INF/MANIFEST.MF create mode 100644 src/main/webapp/META-INF/context.xml create mode 100644 src/main/webapp/WEB-INF/lib/commons-codec-1.4.jar create mode 100644 src/main/webapp/WEB-INF/lib/fastdfs-client-java-1.25.jar create mode 100644 src/main/webapp/WEB-INF/lib/mysql-connector-5.1.8.jar create mode 100644 src/main/webapp/WEB-INF/lib/taobao-sdk-java-auto_1444640346387-20151013.jar create mode 100644 src/main/webapp/WEB-INF/web.xml create mode 100644 src/main/webapp/index.jsp create mode 100644 src/main/webapp/static/css/jquery.alerts.css create mode 100644 src/main/webapp/static/js/jquery-1.8.2.min.js create mode 100644 src/main/webapp/static/js/jquery.alert.js create mode 100644 src/main/webapp/static/js/jquery.form.js create mode 100644 src/test/java/com/ifish/serviceImpl/AdInfoServiceImplTest.java create mode 100644 src/test/java/com/ifish/serviceImpl/GoldServiceImplTest.java create mode 100644 src/test/java/com/ifish/serviceImpl/InformationServiceImplTest.java create mode 100644 src/test/java/com/ifish/serviceImpl/UserActivityServiceImplTest.java create mode 100644 src/test/java/com/ifish/serviceImpl/UserServiceImplTest.java diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..a25cb9e --- /dev/null +++ b/.classpath @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9f97022 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +target/ \ No newline at end of file diff --git a/.project b/.project new file mode 100644 index 0000000..fd7063b --- /dev/null +++ b/.project @@ -0,0 +1,47 @@ + + + ifish + + + + + + org.eclipse.wst.jsdt.core.javascriptValidator + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.ui.externaltools.ExternalToolBuilder + full,incremental, + + + LaunchConfigHandle + <project>/.externalToolBuilders/org.eclipse.wst.validation.validationbuilder.launch + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + org.eclipse.wst.common.project.facet.core.nature + org.eclipse.wst.jsdt.core.jsNature + + diff --git a/nb-configuration.xml b/nb-configuration.xml new file mode 100644 index 0000000..d8d4a97 --- /dev/null +++ b/nb-configuration.xml @@ -0,0 +1,24 @@ + + + + + + Tomcat + + + + src/main/resources/redis-config.xml + + + + diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..5ac5917 --- /dev/null +++ b/pom.xml @@ -0,0 +1,299 @@ + + 4.0.0 + ifish + ifish + war + 0.0.1-SNAPSHOT + ifish Maven Webapp + http://mvnrepository.com + + + + org.springframework + spring-core + 4.3.8.RELEASE + jar + + + + org.springframework + spring-context + 4.1.6.RELEASE + + + + org.springframework + spring-orm + 4.1.6.RELEASE + + + + org.aspectj + aspectjweaver + 1.8.5 + + + + org.springframework + spring-webmvc + 4.1.6.RELEASE + + + + org.springframework + spring-context-support + 4.1.6.RELEASE + + + + + + redis.clients + jedis + 2.9.0 + + + + org.hibernate + hibernate-core + 4.3.11.Final + + + + org.jboss.logging + jboss-logging-annotations + 2.0.1.Final + + + + commons-fileupload + commons-fileupload + 1.3.1 + + + + c3p0 + c3p0 + 0.9.1.2 + + + + org.apache.commons + commons-lang3 + 3.5 + + + + com.fasterxml.jackson.core + jackson-core + 2.5.3 + + + + org.codehaus.jackson + jackson-mapper-asl + 1.9.13 + + + + com.fasterxml.jackson.core + jackson-databind + 2.5.3 + + + + org.slf4j + slf4j-api + 1.7.12 + + + + ch.qos.logback + logback-core + 1.1.2 + + + + ch.qos.logback + logback-classic + 1.1.2 + + + + org.apache.mina + mina-core + 2.0.7 + + + + javax.servlet + servlet-api + 3.0-alpha-1 + + + + jstl + jstl + 1.2 + + + + org.apache.httpcomponents + httpclient + 4.3.5 + + + + javax.mail + mail + 1.4.7 + + + + com.alibaba + fastjson + 1.2.28 + + + + net.sf.ehcache + ehcache + 2.10.3 + + + + javax.validation + validation-api + 1.1.0.Final + + + + org.hibernate + hibernate-validator + 5.2.4.Final + + + + junit + junit + 4.12 + test + + + + org.springframework + spring-test + 4.1.6.RELEASE + test + + + com + taobao-sdk + 1.0 + system + ${basedir}/src/main/webapp/WEB-INF/lib/taobao-sdk-java-auto_1444640346387-20151013.jar + + + org.mybatis + mybatis + 3.4.4 + + + + org.mybatis + mybatis-spring + 1.3.1 + + + org.csource + fastdfs-client-java + 1.25 + system + ${basedir}/src/main/webapp/WEB-INF/lib/fastdfs-client-java-1.25.jar + + + org.apache.maven.plugins + maven-resources-plugin + 2.5 + jar + + + log4j + log4j + 1.2.17 + jar + + + org.springframework.data + spring-data-redis + 1.7.1.RELEASE + jar + + + + ifish + + + org.apache.maven.plugins + maven-war-plugin + 2.4 + + + + src/main/webapp + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.5.1 + + 1.7 + 1.7 + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.19.1 + + true + + + + + + src/main/java + + **/*.hbm.xml + + + + src/main/resources + + **/*.xml + **/*.properties + **/*.conf + + + + + + + UTF-8 + + + diff --git a/src/main/java/com/ifish/action/AdInfoAction.java b/src/main/java/com/ifish/action/AdInfoAction.java new file mode 100644 index 0000000..a91d62e --- /dev/null +++ b/src/main/java/com/ifish/action/AdInfoAction.java @@ -0,0 +1,55 @@ +package com.ifish.action; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.ifish.dto.JsonResult; +import com.ifish.enums.AdTypeEnum; +import com.ifish.enums.ResultEnum; +import com.ifish.exception.IfishException; +import com.ifish.service.AdInfoService; + +/** + * 广告信息 + * + * @author Administrator + * + */ +@Controller +@RequestMapping(value = "/adInfos") +@ResponseBody +public class AdInfoAction { + + @Autowired + private AdInfoService adInfoService; + + /** + * 根据类型获取广告信息 + * + * @param adType + * @return + */ + @RequestMapping(value = "/type/{adType}", method = RequestMethod.GET) + public JsonResult getAdInfosByType(@PathVariable("adType") int adType) { + //校验类型 + AdTypeEnum adTypeEnum = AdTypeEnum.getAdTypeEnum(adType); + if (adTypeEnum == null) { + throw new IfishException(ResultEnum.error401); + } + return adInfoService.getAdInfosByType(adTypeEnum); + } + + /** + * 获取广告信息表最大ID + * + * @return + */ + @RequestMapping(value = "getMaxInfo", method = RequestMethod.GET) + public JsonResult getMaxInfo() { + return adInfoService.getMaxInfo(); + } +} diff --git a/src/main/java/com/ifish/action/CommodityAction.java b/src/main/java/com/ifish/action/CommodityAction.java new file mode 100644 index 0000000..3e9d9ca --- /dev/null +++ b/src/main/java/com/ifish/action/CommodityAction.java @@ -0,0 +1,97 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ifish.action; + +import com.ifish.bean.CommodityInfoBean; +import com.ifish.dto.JsonResult; +import com.ifish.dto.PageingDto; +import com.ifish.enums.ResultEnum; +import com.ifish.exception.IfishException; +import com.ifish.helper.CommodityInfoHelperI; +import com.ifish.helper.RedisHelperI; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +/** + * + * @author Administrator + */ +@RestController +public class CommodityAction { + + @Autowired + private CommodityInfoHelperI commodityInfoHelperI; + + /** + * 创建商品 + * + * @param commodityInfoBean + * @return + */ + @RequestMapping(value = "/createCommodity", method = RequestMethod.POST) + public JsonResult createCommodityInfo(CommodityInfoBean commodityInfoBean, MultipartFile img, MultipartFile video) { + return commodityInfoHelperI.createCommodityInfo(commodityInfoBean, img, video); + } + + /** + * 修改商品 + * + * @param commodityInfoBean + * @return + */ + @RequestMapping(value = "/updateCommodity", method = RequestMethod.POST) + public JsonResult updateCommodityInfo(CommodityInfoBean commodityInfoBean) { + return commodityInfoHelperI.updateCommodityInfo(commodityInfoBean); + } + + /** + * 根据商品ID查询商品详情 + * + * @param commodityId + * @return + */ + @RequestMapping(value = "/getCommodityById", method = RequestMethod.GET) + public JsonResult getCommodityInfo(Integer commodityId) { + return commodityInfoHelperI.getCommodityInfo(commodityId); + } + + /** + * 根据店铺ID分页获取商品列表 + * + * @param pageSize + * @param firstResult + * @param shopId + * @param commodityState + * @return + */ + @RequestMapping(value = "/getCommodityInfoByPage", method = RequestMethod.GET) + public PageingDto getCommodityInfoByPage(Integer pageSize, Integer firstResult, Integer shopId, Integer commodityState, String orderBy) { + //参数校验 + if (firstResult < 0 || (pageSize < 1 || pageSize > 20)) { + throw new IfishException(ResultEnum.error401); + } + if (commodityState == null) { + commodityState = 1; + } + return commodityInfoHelperI.getCommodityInfoByPage(pageSize, firstResult, shopId, commodityState, orderBy); + } + + /** + * 删除商品 + * + * @param commodityId + * @return + */ + @RequestMapping(value = "/deleteCommodityById", method = RequestMethod.POST) + public JsonResult deleteCommodityInfo(Integer commodityId) { + return commodityInfoHelperI.deleteCommodityInfo(commodityId); + } +} diff --git a/src/main/java/com/ifish/action/CouponAction.java b/src/main/java/com/ifish/action/CouponAction.java new file mode 100644 index 0000000..3496e5a --- /dev/null +++ b/src/main/java/com/ifish/action/CouponAction.java @@ -0,0 +1,63 @@ +package com.ifish.action; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.BindingResult; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import com.ifish.dto.JsonResult; +import com.ifish.dto.PageingDto; +import com.ifish.enums.ResultEnum; +import com.ifish.exception.IfishException; +import com.ifish.service.CouponService; +import com.ifish.validator.PageParam; + +/** + * 优惠券 + * @author Administrator + * + */ +@RestController +public class CouponAction { + + @Autowired + private CouponService couponService; + + /** + * 获取所有有效优惠券 + * @return + */ + @RequestMapping(value="/validatingCoupons",method=RequestMethod.GET) + public JsonResult getAllValidCoupon(){ + return couponService.getAllValidCoupon(); + } + + /** + * 兑换优惠券 + * @param userId + * @param couponId + * @return + */ + @RequestMapping(value="/exchangeCoupon/{userId}/{couponId}",method=RequestMethod.POST)// + public JsonResult exchangeCoupon(@PathVariable("userId")Integer userId,@PathVariable("couponId")Integer couponId){ + return couponService.exchangeCoupon(userId, couponId); + } + + /** + * 分页获取兑换记录 + * @param param + * @return + */ + @RequestMapping(value="/couponRecords",method=RequestMethod.GET) + public PageingDto getCouponRecordByPage(@Validated PageParam param,BindingResult result){ + //参数校验 + if(result.hasErrors()){ + throw new IfishException(ResultEnum.error401); + } + return couponService.getCouponRecordByPage(param); + } + +} diff --git a/src/main/java/com/ifish/action/FileAction.java b/src/main/java/com/ifish/action/FileAction.java new file mode 100644 index 0000000..865cab1 --- /dev/null +++ b/src/main/java/com/ifish/action/FileAction.java @@ -0,0 +1,32 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ifish.action; + +import com.ifish.helper.FastDFSClientI; +import java.io.IOException; +import javax.servlet.http.HttpServletRequest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +/** + * + * @author Administrator + */ +@RestController +@RequestMapping("/file") +public class FileAction { + + @Autowired + private FastDFSClientI fastDFSClientI; + + @RequestMapping(value = "/fileupload", method = RequestMethod.POST) + public Object testfile(MultipartFile uploadFile, HttpServletRequest request) throws IOException { + return fastDFSClientI.uploadFileToFastDFS(uploadFile); + } +} diff --git a/src/main/java/com/ifish/action/GoldAction.java b/src/main/java/com/ifish/action/GoldAction.java new file mode 100644 index 0000000..b6ffdbf --- /dev/null +++ b/src/main/java/com/ifish/action/GoldAction.java @@ -0,0 +1,109 @@ +package com.ifish.action; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.validation.BindingResult; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.ifish.dto.JsonResult; +import com.ifish.enums.ResultEnum; +import com.ifish.exception.IfishException; +import com.ifish.service.GoldService; +import com.ifish.validator.AddValueParam; +import com.ifish.validator.PageParam; + +/** + * 金币 + * @author Administrator + * + */ +@Controller +@RequestMapping("/gold") +@ResponseBody +public class GoldAction { + + @Autowired + private GoldService goldService; + + /** + * 新增金币 + * @param addValueParam + * @param result + * @return + */ + @RequestMapping(value="/goldValue.do",method=RequestMethod.POST) + public Object addGoldValue(@Validated AddValueParam addValueParam,BindingResult result) { + //参数校验 + if(result.hasErrors()){ + throw new IfishException(ResultEnum.error401); + } + return goldService.addGoldValue(addValueParam); + } + + /** + * 分页金币获取记录 + * @param pageParam + * @param result + * @return + */ + @RequestMapping(value="/goldGetRecord.do",method=RequestMethod.GET) + public Object getGoldGetRecordByPage(@Validated PageParam pageParam,BindingResult result){ + //参数校验 + if(result.hasErrors()){ + throw new IfishException(ResultEnum.error401); + } + return goldService.getGoldGetRecordByPage(pageParam); + } + + /** + * 分页金币消耗记录 + * @param pageParam + * @param result + * @return + */ + @RequestMapping(value="/goldExpendRecord.do",method=RequestMethod.GET) + public Object getGoldExpendRecordByPage(@Validated PageParam pageParam,BindingResult result){ + //参数校验 + if(result.hasErrors()){ + throw new IfishException(ResultEnum.error401); + } + return goldService.getGoldExpendRecordByPage(pageParam); + } + + /** + * 签到 + * @param userId + * @return + */ + @RequestMapping(value="/signin.do",method=RequestMethod.POST) + public Object signin(@RequestParam Integer userId) { + return goldService.signin(userId); + } + + /** + * 砸金蛋 + * @param userId + * @return + */ + @RequestMapping(value="/hitGoldenEgg.do",method=RequestMethod.POST) + public Object hitGoldenEgg(@RequestParam Integer userId){ + return goldService.hitGoldenEgg(userId); + } + + /** + * 爱鱼看看金币打赏 + * @param userId 打赏人用户ID + * @param userId2 被打赏人用户ID + * @return + */ + @RequestMapping(value="/liveRoomReward/{userId}/{userId2}",method=RequestMethod.POST) + public JsonResult liveRoomReward(@PathVariable("userId")Integer userId,@PathVariable("userId2")Integer userId2){ + return goldService.liveRoomReward(userId, userId2); + } + +} diff --git a/src/main/java/com/ifish/action/GradeAction.java b/src/main/java/com/ifish/action/GradeAction.java new file mode 100644 index 0000000..287fca4 --- /dev/null +++ b/src/main/java/com/ifish/action/GradeAction.java @@ -0,0 +1,71 @@ +package com.ifish.action; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.validation.BindingResult; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.ifish.enums.ResultEnum; +import com.ifish.exception.IfishException; +import com.ifish.service.GradeService; +import com.ifish.validator.AddValueParam; +import com.ifish.validator.PageParam; + +/** + * 等级 + * @author Administrator + * + */ +@Controller +@RequestMapping("/grade") +@ResponseBody +public class GradeAction { + + @Autowired + private GradeService gradeService; + + /** + * 新增经验值 + * @param addValueParam + * @param result + * @return + */ + @RequestMapping(value="/gradeValue.do",method=RequestMethod.POST) + public Object addGradeValue(@Validated AddValueParam addValueParam,BindingResult result) { + //参数校验 + if(result.hasErrors()){ + throw new IfishException(ResultEnum.error401); + } + return this.gradeService.addGradeValue(addValueParam); + } + + /** + * 获取规则等级信息 + * @param version + * @return + */ + @RequestMapping(value="/gradeRuleInfo.do",method=RequestMethod.GET) + public Object gradeRuleInfo(@RequestParam Integer userId){ + return this.gradeService.getGradeRuleInfo(userId); + } + + /** + * 分页经验值获取记录 + * @param pageParam + * @param result + * @return + */ + @RequestMapping(value="/gradeRecord.do",method=RequestMethod.GET) + public Object getGradeRecordByPage(@Validated PageParam pageParam,BindingResult result){ + //参数校验 + if(result.hasErrors()){ + throw new IfishException(ResultEnum.error401); + } + return this.gradeService.getGradeRecordByPage(pageParam); + } + +} \ No newline at end of file diff --git a/src/main/java/com/ifish/action/IfishDoctorAction.java b/src/main/java/com/ifish/action/IfishDoctorAction.java new file mode 100644 index 0000000..e449a75 --- /dev/null +++ b/src/main/java/com/ifish/action/IfishDoctorAction.java @@ -0,0 +1,54 @@ +package com.ifish.action; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.validation.BindingResult; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.ifish.dto.JsonResult; +import com.ifish.entity.IfishDoctor; +import com.ifish.enums.ResultEnum; +import com.ifish.exception.IfishException; +import com.ifish.service.IfishDoctorService; + +/** + * + * @author ggw + * + */ +@Controller +@RequestMapping("/ifishDoctor") +@ResponseBody +public class IfishDoctorAction { + + @Autowired + private IfishDoctorService ifishDoctorService; + + /** + * 提交问题 + * @param ifishDoctor + * @return + */ + @RequestMapping(value="/v3/saveIfishDoctor.do",method=RequestMethod.POST) + public Object saveIfishDoctor(IfishDoctor ifishDoctor) { + return ifishDoctorService.saveIfishDoctor(ifishDoctor); + } + + /** + * 金币打赏提交问题 + * @param ifishDoctor + * @param result + * @return + */ + @RequestMapping(value="/payTourQuestion",method=RequestMethod.POST) + public JsonResult payTourSubmitQuestion(String payTourType,@Validated IfishDoctor ifishDoctor,BindingResult result){ + if(result.hasErrors()){ + throw new IfishException(ResultEnum.error401); + } + return ifishDoctorService.payTourSubmitQuestion(ifishDoctor,payTourType); + } + +} \ No newline at end of file diff --git a/src/main/java/com/ifish/action/IfishGoodsAction.java b/src/main/java/com/ifish/action/IfishGoodsAction.java new file mode 100644 index 0000000..610989b --- /dev/null +++ b/src/main/java/com/ifish/action/IfishGoodsAction.java @@ -0,0 +1,51 @@ +package com.ifish.action; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import com.ifish.dto.JsonResult; +import com.ifish.enums.IfishShopPlaceEnum; +import com.ifish.enums.ResultEnum; +import com.ifish.exception.IfishException; +import com.ifish.service.IfishGoodsService; + +/** + * 商品信息Controller + * @author Administrator + * + */ +@RestController +public class IfishGoodsAction { + + @Autowired + private IfishGoodsService ifishGoodsService; + + /** + * 根据位置获取商品信息 + * @param goodsPlace + * @return + */ + @RequestMapping(value="/ifishGoods/type/{goodsType}",method=RequestMethod.GET) + public JsonResult getIfishGoodsByGoodsPlace(@PathVariable("goodsType") Integer goodsPlace){ + //校验类型 + IfishShopPlaceEnum shopPlaceEnum = IfishShopPlaceEnum.getAdTypeEnum(goodsPlace); + if(shopPlaceEnum==null){ + throw new IfishException(ResultEnum.error401); + } + return ifishGoodsService.getIfishGoodsByGoodsPlace(shopPlaceEnum); + } + + /** + * 增加商品点击数 + * @param goodsId + * @return + */ + @RequestMapping(value="/ifishGoods/{goodsId}/additionClickNum",method=RequestMethod.POST) + public JsonResult addClickNum(@PathVariable("goodsId") Integer goodsId){ + return ifishGoodsService.addClickNum(goodsId); + } + +} diff --git a/src/main/java/com/ifish/action/InformationAction.java b/src/main/java/com/ifish/action/InformationAction.java new file mode 100644 index 0000000..f24c492 --- /dev/null +++ b/src/main/java/com/ifish/action/InformationAction.java @@ -0,0 +1,76 @@ +package com.ifish.action; + +import javax.servlet.http.HttpServletResponse; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.validation.BindingResult; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.ifish.dto.JsonResult; +import com.ifish.dto.PageingDto; +import com.ifish.entity.Comment; +import com.ifish.enums.ResultEnum; +import com.ifish.exception.IfishException; +import com.ifish.service.InformationService; +import com.ifish.validator.PageParam; + + +@Controller +@ResponseBody +public class InformationAction { + @Autowired + private InformationService informationService; + + /** + * 获取用户评论 + * @param comment + * @return + */ + @RequestMapping(value="/information/v3/findCommentsByUeditorId.do",method=RequestMethod.POST) + public Object findCommentsByUeditorId(Integer ueditorId,Integer firstResult,Integer pageSize,HttpServletResponse response){ + response.setHeader("Access-Control-Allow-Origin", "*"); + return informationService.findCommentsByUeditorId(ueditorId, firstResult, pageSize); + } + + /** + * 保存评论 + * @param comment + * @return + */ + @RequestMapping(value="/information/v3/saveComment.do",method=RequestMethod.POST) + public Object saveComment(Comment comment,HttpServletResponse response){ + response.setHeader("Access-Control-Allow-Origin", "*"); + return informationService.saveComment(comment); + } + + /** + * 分页获取资讯 + * @param pageParam + * @param result + * @return + */ + @RequestMapping(value="/informations",method=RequestMethod.GET) + public PageingDto getInformationsByPage(@Validated PageParam pageParam,BindingResult result){ + //参数校验 + if(result.hasErrors()){ + throw new IfishException(ResultEnum.error401); + } + return informationService.getInformationsByPage(pageParam); + } + + /** + * 增加点击数 + * @param infoId + * @return + */ + @RequestMapping(value="/informations/{infoId}/additionClickNum",method=RequestMethod.POST) + public JsonResult addClickNum(@PathVariable("infoId") Integer infoId){ + return informationService.addClickNum(infoId); + } + +} \ No newline at end of file diff --git a/src/main/java/com/ifish/action/LiveRoomAction.java b/src/main/java/com/ifish/action/LiveRoomAction.java new file mode 100644 index 0000000..1d0d209 --- /dev/null +++ b/src/main/java/com/ifish/action/LiveRoomAction.java @@ -0,0 +1,209 @@ +package com.ifish.action; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.BindingResult; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import com.alibaba.fastjson.JSONObject; +import com.ifish.dto.JsonResult; +import com.ifish.dto.PageingDto; +import com.ifish.entity.LiveBanner; +import com.ifish.entity.LiveMessage; +import com.ifish.enums.LiveRoomOrderTypeEnum; +import com.ifish.enums.ResultEnum; +import com.ifish.enums.SubDirectoryEnum; +import com.ifish.exception.IfishException; +import com.ifish.service.LiveRoomService; +import com.ifish.util.IfishFilePath; +import com.ifish.util.IfishFileUtils; +import com.ifish.util.IfishUtil; +import com.ifish.util.ResultUtil; +import com.ifish.validator.LiveRoomParam; +import com.ifish.validator.PageParam; + +/** + * + * @author ggw + * + */ +@RestController +public class LiveRoomAction { + @Autowired + private LiveRoomService liveRoomService; + + /** + * 新增直播间 + * @param liveRoom + * @param fileUpload + * @return + */ + @RequestMapping(value="/liveRoom/v3/addLiveRoom.do",method=RequestMethod.POST) + public JsonResult addLiveRoom(MultipartFile fileUpload,LiveRoomParam liveRoomParam,BindingResult result){ + //校验参数 + if(result.hasErrors() || fileUpload==null){ + throw new IfishException(ResultEnum.error401); + } + //上传封面不能大于1M + if(fileUpload.getSize()>1048576){ + throw new IfishException(ResultEnum.warn206); + } + //新增直播间 + JSONObject json = liveRoomService.addLiveRoom(liveRoomParam); + //图片名称 + String picName = json.getInteger("roomId")+".png"; + try { + //上传文件 + IfishFileUtils.uploadFile(IfishFilePath.path_room_img, picName, fileUpload); + } catch (Exception e) { + throw new RuntimeException(e); + } + return ResultUtil.success(json); + } + /** + * 修改直播间 + * @param liveRoom + * @param fileUpload + * @return + */ + @RequestMapping(value="/liveRoom/v3/updateLiveRoom.do",method=RequestMethod.POST) + public JsonResult updateLiveRoom(MultipartFile fileUpload,@RequestParam("roomId")Integer roomId,LiveRoomParam liveRoomParam,BindingResult result){ + //校验参数 + if(result.hasErrors()){ + throw new IfishException(ResultEnum.error401); + } + //上传的图片不能大于1M + if(fileUpload!=null && fileUpload.getSize()>1048576){ + throw new IfishException(ResultEnum.warn206); + } + //更新 + JsonResult jsonResult = liveRoomService.updateLiveRoom(roomId,liveRoomParam); + //更新文件 + if(fileUpload!=null){ + //图片名称 + String picName = roomId+".png"; + try { + //上传文件 + IfishFileUtils.uploadFile(IfishFilePath.path_room_img, picName, fileUpload); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + return jsonResult; + } + + /** + * 直播间人气加一 + * @param roomId + * @return + */ + @RequestMapping(value="/liveRoom/v3/popularityValue.do",method=RequestMethod.POST) + public Object popularityValue(Integer roomId,Integer userId){ + return liveRoomService.popularityValue(roomId,userId); + } + + /** + * 获取直播间信息(修改直播间信息) + * @param roomId + * @return + */ + @RequestMapping(value="/liveRoom/v3/getLiveRoomInfo.do",method=RequestMethod.POST) + public Object getLiveRoomInfo(Integer userId){ + return liveRoomService.getLiveRoomInfo(userId); + } + + /** + * 获取直播列表 + * @param firstResult + * @param pageSize + * @return + */ + @RequestMapping(value="/liveRoom/v3/getLiveRooms.do",method=RequestMethod.POST) + public Object popularityValue(Integer firstResult,Integer pageSize,Integer userId,String orders){ + return liveRoomService.getLiveRoomsByPage(firstResult, pageSize,userId,orders); + } + + /** + * 获取直播banner图 + * @return + */ + @RequestMapping(value="/liveRoom/v3/getLiveBanners.do",method=RequestMethod.POST) + public Object getLiveBanners(){ + List list = liveRoomService.getLiveBanners(); + if(list!=null){ + for (LiveBanner liveBanner : list) { + liveBanner.setBannerImg(IfishFilePath.getPath(SubDirectoryEnum.banner,liveBanner.getBannerImg())); + } + return IfishUtil.toJson(ResultEnum.success.getKey(), list); + } + return IfishUtil.toJson(ResultEnum.fail101.getKey(), ""); + } + + /** + * 直播间留言 + * @param liveMessage + * @return + */ + @RequestMapping(value="/liveRoom/v3/leaveMessage.do",method=RequestMethod.POST) + public Object leaveMessage(LiveMessage liveMessage){ + return liveRoomService.leaveMessage(liveMessage); + } + + /** + * 留言列表 + * @param liveMessage + * @return + */ + @RequestMapping(value="/liveRoom/v3/getLiveMessage.do",method=RequestMethod.POST) + public Object getLiveMessageByPage(Integer roomId,Integer firstResult,Integer pageSize){ + return liveRoomService.getLiveMessageByPage(firstResult, pageSize, roomId); + } + + /** + * 按类型分页获取直播间信息 + * @param pageParam + * @param result + * @return + */ + @RequestMapping(value="/liveRooms",method=RequestMethod.GET) + public PageingDto getLiveRoomByPate(@RequestParam("orderType") Integer orderType,@Validated PageParam pageParam,BindingResult result){ + //参数校验 + if(result.hasErrors()){ + throw new IfishException(ResultEnum.error401); + } + //按时间倒序 + if(LiveRoomOrderTypeEnum.one.getKey().equals(orderType)){ + return liveRoomService.getLiveRoomsByTime(pageParam); + } + //人气值倒序 + else if(LiveRoomOrderTypeEnum.two.getKey().equals(orderType)){ + return liveRoomService.getLiveRoomsByPopularityValue(pageParam); + } + //后台推荐顺序倒序 + else if(LiveRoomOrderTypeEnum.three.getKey().equals(orderType)){ + return liveRoomService.getLiveRoomsByTuijian(pageParam); + } + else{ + throw new IfishException(ResultEnum.error402); + } + } + + /** + * 直播间点赞 + * @param roomId + * @param userId + * @return + */ + @RequestMapping(value="/liveRoomZan/{roomId}/{userId}",method=RequestMethod.POST) + public JsonResult liveRoomsZan(@PathVariable("roomId")Integer roomId,@PathVariable("userId")Integer userId){ + return liveRoomService.liveRoomsZan(roomId, userId); + } + +} diff --git a/src/main/java/com/ifish/action/PageListAction.java b/src/main/java/com/ifish/action/PageListAction.java new file mode 100644 index 0000000..53881ff --- /dev/null +++ b/src/main/java/com/ifish/action/PageListAction.java @@ -0,0 +1,85 @@ +package com.ifish.action; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.ifish.dto.ShopsLookUserDto; +import com.ifish.entity.PushList; +import com.ifish.hibernate.Pagination; +import com.ifish.service.PageListService; +import com.ifish.util.IfishUtil; + +/** + * @ClassName: PageListAction + * @Description: TODO + * @author ggw + */ +@Controller +@RequestMapping("/pageList") +public class PageListAction { + + @Autowired + private PageListService pageListService; + + private static Logger log = LoggerFactory.getLogger(PageListAction.class); + + /** + * 推送信息列表 + * + * @param createDate + * @param userId + * @param firstResult + * @param pageSize + * @return + */ + @RequestMapping("/pushListInf.do") + @ResponseBody + public Object pushListInf(Integer pushId, Integer userId, Integer firstResult, Integer pageSize) { + try { + if (firstResult == null) { + firstResult = 0; + } + if (pageSize == null) { + pageSize = 10; + } + Pagination page = this.pageListService.getPushListByPage(pushId, userId, firstResult, pageSize); + return IfishUtil.returnPageData(page); + } catch (Exception e) { + log.error("get pushListInf page information:error message:{}", e.toString()); + } + return null; + } + + /** + * 看护工作台 + * + * @param createDate + * @param userId + * @param firstResult + * @param pageSize + * @return + */ + @RequestMapping("/lookList.do") + @ResponseBody + public Object lookList(Integer shopsUserId, Integer firstResult, Integer pageSize) { + try { + if (firstResult == null) { + firstResult = 0; + } + if (pageSize == null) { + pageSize = 10; + } + Pagination page = this.pageListService.getLookListByPage(shopsUserId, firstResult, pageSize); + return IfishUtil.returnPageData(page); + } catch (Exception e) { + e.printStackTrace(); + log.error("lookList:error message:{}", e.toString()); + } + return null; + } + +} diff --git a/src/main/java/com/ifish/action/ShopsAction.java b/src/main/java/com/ifish/action/ShopsAction.java new file mode 100644 index 0000000..e6d344d --- /dev/null +++ b/src/main/java/com/ifish/action/ShopsAction.java @@ -0,0 +1,194 @@ +package com.ifish.action; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.BindingResult; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import com.ifish.dto.JsonResult; +import com.ifish.dto.PageingDto; +import com.ifish.entity.ShopsInfo; +import com.ifish.enums.ResultEnum; +import com.ifish.exception.IfishException; +import com.ifish.service.ShopsService; +import com.ifish.util.IfishUtil; +import com.ifish.validator.PageParam; +import com.ifish.validator.ShopsUserInfoParam; + +/** + * + * @author ggw + * + */ +@RestController +public class ShopsAction { + + @Autowired + private ShopsService shopsService; + + /** + * 保存商户信息 + * @param shopsInfo + * @param file1 + * @param file2 + * @param file3 + * @return + */ + @RequestMapping(value="/shops/v3/saveShopsInfo.do",method=RequestMethod.POST) + public Object saveShopsInfo(ShopsInfo shopsInfo,MultipartFile file1,MultipartFile file2,MultipartFile file3) { + if(file1.getSize()>3145728 || file2.getSize()>3145728 || file3.getSize()>3145728){ + return IfishUtil.returnJson(ResultEnum.warn206.getKey(), ""); + } + else{ + return this.shopsService.saveShopsInfo(shopsInfo,file1,file2,file3); + } + } + + /** + * 审核失败后修改商户信息 + * @param shopsInfo + * @param file1 + * @param file2 + * @param file3 + * @return + */ + @RequestMapping(value="/shops/v3/updateShopsInfo.do",method=RequestMethod.POST) + public Object updateShopsInfo(ShopsInfo shopsInfo,MultipartFile file1,MultipartFile file2,MultipartFile file3) { + if(file1!=null && !file1.isEmpty() && file1.getSize()>3145728){ + return IfishUtil.returnJson(ResultEnum.warn206.getKey(), ""); + } + if(file2!=null && !file2.isEmpty() && file2.getSize()>3145728){ + return IfishUtil.returnJson(ResultEnum.warn206.getKey(), ""); + } + if(file3!=null && !file3.isEmpty() && file3.getSize()>3145728){ + return IfishUtil.returnJson(ResultEnum.warn206.getKey(), ""); + } + else{ + return this.shopsService.updateShopsInfo(shopsInfo,file1,file2,file3); + } + } + + /** + * 审核成功后修改商户信息 + * @param shopsInfo + * @param file4 + * @return + */ + @RequestMapping(value="/shops/v3/updateBaseShopsInfo.do",method=RequestMethod.POST) + public Object updateBaseShopsInfo(ShopsInfo shopsInfo,MultipartFile file4) { + if(file4!=null && !file4.isEmpty() && file4.getSize()>3145728){ + return IfishUtil.returnJson(ResultEnum.warn206.getKey(), ""); + } + else{ + return this.shopsService.updateBaseShopsInfo(shopsInfo,file4); + } + } + + /** + * 查询审核状态 + * @param shopsId + * @return + */ + @RequestMapping(value="/shops/v3/getShopsStatus.do",method=RequestMethod.POST) + public Object getShopsStatus(Integer shopsId) { + return this.shopsService.getShopsStatus(shopsId); + } + + /** + * 看护商家列表 + * @param firstResult + * @param pageSize + * @return + */ + @RequestMapping(value="/shops/v3/getShopsInfo.do",method=RequestMethod.POST) + public Object pushListInf(Integer userId,Integer firstResult,Integer pageSize) { + return this.shopsService.getShopsInfoByPage(userId,firstResult, pageSize); + } + + /** + * 选择看护商家 + * @param shopsUserId + * @param userId + * @return + */ + @RequestMapping(value="/shops/v3/choiceShops.do",method=RequestMethod.POST) + public Object choiceShops(@RequestParam Integer shopsUserId,@RequestParam Integer userId) { + return this.shopsService.choiceShops(shopsUserId,userId); + } + + /** + * 解除看护关系 + * @param shopsUserId + * @param userId + * @return + */ + @RequestMapping(value="/shops/v3/removeLook.do",method=RequestMethod.POST) + public Object removeLook(Integer userId) { + return this.shopsService.removeLook(userId); + } + + /** + * 获取商家会员信息 + * @param userId + * @param shopsId + * @return + */ + @RequestMapping(value="/shopsUserInfo/{userId}/{shopsId}",method=RequestMethod.GET) + public JsonResult getShopsUserInfoById(@PathVariable("userId")Integer userId,@PathVariable("shopsId")Integer shopsId){ + return shopsService.getShopsUserInfoById(userId, shopsId); + } + + /** + * 更新商家会员信息 + * @param userId + * @param shopsId + * @param result + * @param info + * @return + */ + @RequestMapping(value="/shopsUserInfo/{userId}/{shopsId}",method=RequestMethod.POST) + public JsonResult updateShopsUserInfo(@PathVariable("userId")Integer userId, + @PathVariable("shopsId")Integer shopsId, + @Validated ShopsUserInfoParam param, + BindingResult result){ + //参数校验 + if(result.hasErrors()){ + throw new IfishException(ResultEnum.error401); + } + return shopsService.updateShopsUserInfo(userId,shopsId,param); + } + + /** + * 分页获取商家会员信息 + * @param pageParam + * @param result + * @return + */ + @RequestMapping(value="/shopsUserInfo",method=RequestMethod.GET) + public PageingDto getShopsUserInfoById(@RequestParam("shopsId")Integer shopsId, + @Validated PageParam pageParam, + BindingResult result){ + //参数校验 + if(result.hasErrors()){ + throw new IfishException(ResultEnum.error401); + } + return shopsService.getShopsUserInfoByPage(shopsId,pageParam); + } + + /** + * 成为商家会员 + * @param userId + * @param shopsId + * @return + */ + @RequestMapping(value="/becomingShopsUser/{userId}/{shopsId}",method=RequestMethod.POST) + public JsonResult becomeShopsUser(@PathVariable("userId")Integer userId,@PathVariable("shopsId")Integer shopsId){ + return shopsService.becomeShopsUser(userId, shopsId); + } + +} \ No newline at end of file diff --git a/src/main/java/com/ifish/action/UpdateUserAction.java b/src/main/java/com/ifish/action/UpdateUserAction.java new file mode 100644 index 0000000..9a7a15b --- /dev/null +++ b/src/main/java/com/ifish/action/UpdateUserAction.java @@ -0,0 +1,76 @@ +package com.ifish.action; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.multipart.MultipartFile; + +import com.ifish.entity.User; +import com.ifish.enums.ResultEnum; +import com.ifish.service.BaseService; +import com.ifish.util.IfishUtil; + +/** + * @ClassName: UpdateUserAction + * @Description: TODO + * @author ggw + */ + +@Controller +@RequestMapping("/updateUser") +public class UpdateUserAction { + + @Autowired + private BaseService baseService; + + private static Logger log = LoggerFactory.getLogger(UpdateUserAction.class); + + @ModelAttribute("user") + public User getUser(@RequestParam Integer userId) { + return baseService.findById(userId); + } + /** + * 更新用户信息 + * @param user + * @return + */ + @RequestMapping("/updateUser.do") + @ResponseBody + public Object update(@ModelAttribute("user") User user){ + try { + return baseService.updateInfo(user); + } catch (Exception e) { + log.error("update userinfo:userId:{},error message:{}",user.getUserId(),e.toString()); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + /** + * 上传头像 + * @param user + * @param fileUpload + * @return + * @throws Exception + */ + @RequestMapping(value = "/uploadFile.do") + @ResponseBody + public Object upload(@ModelAttribute("user") User user,@RequestParam MultipartFile fileUpload){ + try { + if(fileUpload.getSize()>1048576){ + return IfishUtil.returnJson(ResultEnum.warn206.getKey(), ""); + } + else{ + return baseService.uploadFile(user,fileUpload); + } + } catch (Exception e) { + log.error("upload images:userId:{},error message:{}",user.getUserId(),e.toString()); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + +} diff --git a/src/main/java/com/ifish/action/UserAction.java b/src/main/java/com/ifish/action/UserAction.java new file mode 100644 index 0000000..158a561 --- /dev/null +++ b/src/main/java/com/ifish/action/UserAction.java @@ -0,0 +1,642 @@ +package com.ifish.action; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import com.ifish.entity.CameraUserId; +import com.ifish.entity.Device; +import com.ifish.entity.DeviceUser; +import com.ifish.entity.QuestionsFeedback; +import com.ifish.entity.ShopsInfo; +import com.ifish.entity.User; +import com.ifish.enums.ResultEnum; +import com.ifish.helper.UserHelperI; +import com.ifish.service.BaseService; +import com.ifish.service.UserService; +import com.ifish.util.IfishFilePath; +import com.ifish.util.IfishUtil; + +/** + * @ClassName:UserAction + * @Description:TODO + * @author ggw + */ +@RestController +@RequestMapping("/user") +public class UserAction { + + @Autowired + private UserService userService; + @Autowired + private BaseService baseService; + @Autowired + private UserHelperI userHelperI; + + private static Logger log = LoggerFactory.getLogger(UserAction.class); + + /** + * 获取验证码 + * + * @param sendType + * @param phoneNumber + * @return + */ + @Deprecated + @RequestMapping("/getSecurityCode.do") + public Object getSecurityCode(@RequestParam String sendType, @RequestParam String phoneNumber) { + try { + return this.baseService.getSecurityCode(phoneNumber, sendType); + } catch (Exception e) { + log.error("send sms:phoneNumber:{},error message:{}", phoneNumber, e.toString()); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + /** + * 通过短信验证后新增注册用户信息 + * + * @param user + * @return + */ + @Deprecated + @RequestMapping("/addUser.do") + public Object addUser(User user) { + try { + return this.baseService.save(user); + } catch (Exception e) { + e.printStackTrace(); + log.error("user register:phoneNumber:{},error message:{}", user.getPhoneNumber(), e.toString()); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + /** + * 通过短信验证后修改密码 + * + * @param user + * @return + */ + @RequestMapping("/resetPassword.do") + public Object resetPassword(User user) { + try { + return this.baseService.resetPassword(user); + } catch (Exception e) { + log.error("forget password:phoneNumber:{},error message:{}", user.getPhoneNumber(), e.toString()); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + /** + * 用户登录 + */ + @Deprecated + @RequestMapping("/userLogin.do") + public Object userLogin(User user) { + try { + return userHelperI.login(user); + } catch (Exception e) { + log.error("user login:phoneNumber:{},error message:{}", user.getPhoneNumber(), e.toString()); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + /** + * 用户登录 + */ + @Deprecated + @RequestMapping("/userLoginold.do") + public Object userLogin1(User user) { + try { + return this.baseService.login(user); + } catch (Exception e) { + log.error("user login:phoneNumber:{},error message:{}", user.getPhoneNumber(), e.toString()); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + /** + * 验证原密码后修改密码 + * + * @param oldPassword + * @param user + * @return + */ + @RequestMapping("/updatePwd.do") + public Object updatePwd(@RequestParam String oldPassword, User user) { + try { + return baseService.updatePwd(user, oldPassword); + } catch (Exception e) { + log.error("change password:userId:{},error message:{}", user.getUserId(), e.toString()); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + /** + * 问题反馈 + * + * @param questionsFeedback + * @return + */ + @Deprecated + @RequestMapping("/questionsFeedback.do") + public Object questionsFeedback(QuestionsFeedback questionsFeedback) { + try { + return this.baseService.saveQuestionsFeedback(questionsFeedback); + } catch (Exception e) { + log.error("submit questions:userId:{},error message:{}", questionsFeedback.getUserId(), e.toString()); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + /** + * 绑定设备 + * + * @param user + * @param macAddress + * @return + */ + @Deprecated + @RequestMapping("/bindDevice.do") + public Object bindDevice(User user, String macAddress) { + try { + return baseService.bindDevice(user, macAddress.toLowerCase()); + } catch (Exception e) { + log.error("bind device:userId:{},macAddress:{},error message:{}", user.getUserId(), macAddress.toLowerCase(), e.toString()); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + /** + * 绑定摄像头 + * + * @param user + * @param macAddress + * @return + */ + @RequestMapping("/bindCamera.do") + public Object bindCamera(Integer userId, String cameraId) { + return baseService.bindCamera(userId, cameraId); + } + + /** + * 关联设备和摄像头 + * + * @param user + * @param macAddress + * @return + */ + @RequestMapping("/deviceBindCamera.do") + public Object deviceBindCamera(Integer deviceId, String cameraId) { + try { + return baseService.deviceBindCamera(deviceId, cameraId); + } catch (Exception e) { + log.error("DeviceBindCamera:cameraId:{},error message:{}", deviceId, cameraId, e.toString()); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + /** + * 关联设备和摄像头1 + * + * @param user + * @param macAddress + * @return + */ + @RequestMapping("/deviceBindCamera1.do") + public Object deviceBindCamera1(Integer userId, Integer deviceId, String cameraId) { + try { + return baseService.deviceBindCamera1(userId, deviceId, cameraId); + } catch (Exception e) { + log.error("DeviceBindCamera1:userId:{},cameraId:{},error message:{}", userId, deviceId, cameraId, e.toString()); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + /** + * 激活摄像头 + * + * @param user + * @param macAddress + * @return + */ + @RequestMapping("/activeCamera.do") + public Object activeCamera(String activeCode, String cameraId) { + try { + return baseService.activeCamera(activeCode, cameraId); + } catch (Exception e) { + log.error("activeCamera:activeCode:{},cameraId:{},error message:{}", activeCode, cameraId, e.toString()); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + /** + * 保存自定义图标 + * + * @param user + * @param macAddress + * @return + */ + @RequestMapping("/saveCustomIcon.do") + public Object saveCustomIcon(DeviceUser deviceUser) { + try { + return baseService.updateCustomIcon(deviceUser); + } catch (Exception e) { + log.error("saveCustomIcon:userId:{},deviceId:{},error message:{}", deviceUser.getPriId().getUserId(), deviceUser.getPriId().getDeviceId(), e.toString()); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + /** + * 获取单个设备信息 + * + * @param user + * @return + */ + @RequestMapping("/getSingleDeviceInf.do") + public Object getSingleDeviceInf(DeviceUser deviceUser) { + try { + return baseService.getSingleDeviceInf(deviceUser); + } catch (Exception e) { + log.error("get getDeviceInfByMacAddress Information:userId:{},deviceId:{},error message:{}", deviceUser.getPriId().getUserId(), deviceUser.getPriId().getDeviceId(), e.toString()); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + /** + * 修改设备信息 + * + * @param deviceUser + * @return + */ + @RequestMapping("/updateDeviceUser.do") + public Object updateDeviceUser(DeviceUser deviceUser) { + try { + return baseService.update(deviceUser); + } catch (Exception e) { + log.error("update device Information:userId:{},deviceId:{},error message:{}", deviceUser.getPriId().getUserId(), deviceUser.getPriId().getDeviceId(), e.toString()); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + /** + * 修改摄像头信息 + * + * @param deviceUser + * @return + */ + @RequestMapping("/updateCameraUser.do") + public Object updateCameraUser(Integer userId, String cameraId, String showName) { + try { + CameraUserId id = new CameraUserId(userId, cameraId); + return baseService.update(id, showName); + } catch (Exception e) { + log.error("updateCameraUser:userId:{},cameraId:{},error message:{}", userId, cameraId, e.toString()); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + /** + * 删除绑定设备 + * + * @param deviceUser + * @return + */ + @RequestMapping("/deleteDeviceUser.do") + public Object deleteDeviceUser(DeviceUser deviceUser) { + try { + return baseService.deleteDeviceUser(deviceUser); + } catch (Exception e) { + log.error("delete the binding device:userId:{},deviceId:{},error message:{}", deviceUser.getPriId().getUserId(), deviceUser.getPriId().getDeviceId(), e.toString()); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + /** + * 删除绑定的摄像头 + * + * @param deviceUser + * @return + */ + @RequestMapping("/deleteCameraUser.do") + public Object deleteCameraUser(Integer userId, String cameraId) { + try { + return baseService.deleteCameraUser(userId, cameraId); + } catch (Exception e) { + log.error("delete the binding camera:userId:{},cameraId:{},error message:{}", userId, cameraId, e.toString()); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + /** + * 删除设备和摄像头关联 + * + * @param deviceUser + * @return + */ + @RequestMapping("/deleteDeviceCamera.do") + public Object deleteDeviceCamera(Integer deviceId, String cameraId) { + try { + return baseService.deleteDeviceCamera(deviceId, cameraId); + } catch (Exception e) { + log.error("deleteDeviceCamera:deviceId:{},cameraId:{},error message:{}", deviceId, cameraId, e.toString()); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + /** + * 扫一扫分享设备 + * + * @param user + * @param device + * @return + */ + @Deprecated + @RequestMapping("/shareDeviceByQrCode.do") + public Object shareDeviceByQrCode(Integer userId, Integer deviceId) { + try { + return baseService.shareDeviceByQrCode(userId, deviceId); + } catch (Exception e) { + log.error("share device by qrCode:userId:{},deviceId:{},error message:{}", userId, deviceId, e.toString()); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + /** + * 获取最新版本信息 + */ + @RequestMapping("/getNewestVersion.do") + public Object getNewest(String phoneType) { + try { + return this.baseService.getNewestVersionInf(phoneType.toLowerCase()); + } catch (Exception e) { + log.error("get the latest version information:error message:{}", e.toString()); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + /** + * 获取换水提醒信息 + * + * @param deviceId + * @return + */ + @RequestMapping("/getRemindWaterInf.do") + public Object getRemindWaterInf(Integer deviceId) { + try { + return this.baseService.getRemindWaterInf(deviceId); + } catch (Exception e) { + log.error("getRemindWaterInf:deviceId:{},error message:{}", deviceId, e.toString()); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + /** + * 设置换水提醒信息 + * + * @param deviceId + * @return + */ + @RequestMapping("/setRemindWaterInf.do") + public Object setRemindWaterInf(Device device) { + try { + return this.baseService.setRemindWaterInf(device); + } catch (Exception e) { + log.error("setRemindWaterInf:deviceId:{},error message:{}", device.getDeviceId(), e.toString()); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + /** + * 保存商户信息 + * + * @param shopsInfo + * @param file1 + * @param file2 + * @param file3 + * @return + */ + @RequestMapping("/saveShopsInfo.do") + public Object saveShopsInfo(ShopsInfo shopsInfo, MultipartFile file1, MultipartFile file2, MultipartFile file3) { + try { + if (file1.getSize() > 3145728 || file2.getSize() > 3145728 || file3.getSize() > 3145728) { + return IfishUtil.returnJson(ResultEnum.warn206.getKey(), ""); + } else { + return this.baseService.saveShopsInfo(shopsInfo, file1, file2, file3); + } + } catch (Exception e) { + log.error("saveShopsInfo:error message:{}", e.toString()); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + /** + * 审核失败后修改商户信息 + * + * @param shopsInfo + * @param file1 + * @param file2 + * @param file3 + * @return + */ + @RequestMapping("/updateShopsInfo.do") + public Object updateShopsInfo(ShopsInfo shopsInfo, MultipartFile file1, MultipartFile file2, MultipartFile file3) { + try { + if (file1 != null && !file1.isEmpty() && file1.getSize() > 3145728) { + return IfishUtil.returnJson(ResultEnum.warn206.getKey(), ""); + } + if (file2 != null && !file2.isEmpty() && file2.getSize() > 3145728) { + return IfishUtil.returnJson(ResultEnum.warn206.getKey(), ""); + } + if (file3 != null && !file3.isEmpty() && file3.getSize() > 3145728) { + return IfishUtil.returnJson(ResultEnum.warn206.getKey(), ""); + } else { + return this.baseService.updateShopsInfo(shopsInfo, file1, file2, file3); + } + } catch (Exception e) { + log.error("updateShopsInfo:error message:{}", e.toString()); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + /** + * 审核成功后修改商户信息 + * + * @param shopsInfo + * @param file1 + * @param file2 + * @param file3 + * @return + */ + @RequestMapping("/updateBaseShopsInfo.do") + public Object updateBaseShopsInfo(ShopsInfo shopsInfo, MultipartFile file4) { + try { + if (file4 != null && !file4.isEmpty() && file4.getSize() > 3145728) { + return IfishUtil.returnJson(ResultEnum.warn206.getKey(), ""); + } else { + return this.baseService.updateBaseShopsInfo(shopsInfo, file4); + } + } catch (Exception e) { + log.error("updateBaseShopsInfo:error message:{}", e.toString()); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + /** + * 查询审核状态 + * + * @param shopsId + * @return + */ + @RequestMapping("/getShopsStatus.do") + public Object getShopsStatus(Integer shopsId) { + try { + return this.baseService.getShopsStatus(shopsId); + } catch (Exception e) { + log.error("getShopsStatus:error message:{}", e.toString()); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + /** + * 选择看护商家 + * + * @param phoneNumber + * @param userId + * @return + */ + @RequestMapping("/choiceShops.do") + public Object choiceShops(String phoneNumber, Integer userId) { + try { + return this.baseService.choiceShops(phoneNumber, userId); + } catch (Exception e) { + e.printStackTrace(); + log.error("choiceShops:error message:{}", e.toString()); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + /** + * 关闭看护摄像头 + * + * @param cameraId + * @param userId + * @param status + * @return + */ + @RequestMapping("/onoffLook.do") + public Object closeLook(String cameraId, Integer userId, String status) { + try { + return this.baseService.onoffLook(cameraId, userId, status); + } catch (Exception e) { + log.error("closeLook:error message:{}", e.toString()); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + /** + * 生成微信分享页面 + * + * @param title + * @param base64 + * @return + */ + @RequestMapping("/getHtmlFile.do") + public Object getHtmlFile(@RequestParam String title, @RequestParam MultipartFile fileUpload) { + try { + if (fileUpload != null && fileUpload.getSize() > 3145728) { + return IfishUtil.returnJson(ResultEnum.warn206.getKey(), ""); + } + String pngName = IfishUtil.uploadFile(fileUpload, IfishFilePath.path_share_img); + if (pngName != null && !pngName.equals("")) { + String fileName = IfishUtil.getHtmlFile(title, pngName, IfishFilePath.html_name, IfishFilePath.path_share_html); + if (fileName != null && !fileName.equals("")) { + return IfishUtil.returnJson(ResultEnum.success.getKey(), fileName); + } + } + } catch (Exception e) { + log.error("getHtmlFile:error message:{}", e.toString()); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + /** + * 生成看护报告 + * + * @param index1 + * @param index2 + * @param index3 + * @param suggestion + * @return + */ + @RequestMapping("/getLookReport.do") + public Object getLookReport(Integer userId, String index1, String index2, String index3, String suggestion, MultipartFile fileUpload) { + try { + if (fileUpload != null && fileUpload.getSize() > 3145728) { + return IfishUtil.returnJson(ResultEnum.warn206.getKey(), ""); + } + return this.baseService.lookReport(userId, index1, index2, index3, suggestion, fileUpload); + } catch (Exception e) { + log.error("getLookReport:error message:{}", e.toString()); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + /** + * 发送看护报告给用户(旧) + * + * @param userId + * @param fileName + * @return + */ + @Deprecated + @RequestMapping("/sendReport.do") + public Object sendReport(Integer userId, String fileName) { + try { + return this.baseService.sendReport(userId, fileName); + } catch (Exception e) { + log.error("sendReport message:{}", e.toString()); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + /** + * 发送看护报告给用户(新) + * + * @param userId + * @param fileName + * @param reportId + * @return + */ + @RequestMapping("/sendReport1.do") + public Object sendReport1(Integer userId, String fileName, Integer reportId) { + try { + return this.baseService.sendReport(userId, fileName, reportId); + } catch (Exception e) { + log.error("sendReport1 message:{}", e.toString()); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + /** + * 根据ID查询看护报告详情 + * + * @param reportId + * @return + */ + @RequestMapping("/getLookReportById.do") + public Object getLookReportById(Integer reportId) { + try { + return this.baseService.getLookReportById(reportId); + } catch (Exception e) { + log.error("getLookReportById message:{}", e.toString()); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + +} diff --git a/src/main/java/com/ifish/action/UserActivityAction.java b/src/main/java/com/ifish/action/UserActivityAction.java new file mode 100644 index 0000000..992dd54 --- /dev/null +++ b/src/main/java/com/ifish/action/UserActivityAction.java @@ -0,0 +1,56 @@ +package com.ifish.action; + +import com.ifish.dto.JsonResult; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import com.ifish.dto.PageingDto; +import com.ifish.enums.ResultEnum; +import com.ifish.exception.IfishException; +import com.ifish.helper.UserActivityHelperI; +import com.ifish.service.UserActivityService; +import org.apache.ibatis.annotations.Param; + +/** + * 用户动态 + * + * @author Administrator + * + */ +@RestController +public class UserActivityAction { + + @Autowired + private UserActivityService userActivityService; + + @Autowired + private UserActivityHelperI userActivityHelperI; + + /** + * 分页获取用户动态 + * + * @param param + * @param result + * @return + */ + @RequestMapping(value = "/userActivities", method = RequestMethod.GET) + public PageingDto getUserActivityByPage(Integer pageSize, Integer firstResult) { + //参数校验 + if (firstResult < 0 || (pageSize < 1 || pageSize > 20)) { + throw new IfishException(ResultEnum.error401); + } + return userActivityHelperI.getUserActivityByPage(pageSize, firstResult); + } + + @RequestMapping(value = "/userActivitiesMaxCount", method = RequestMethod.GET) + public JsonResult getUserActivityMaxCount() { + try { + return userActivityHelperI.getUserActivityMaxCount(); + } catch (Exception e) { + throw new IfishException(ResultEnum.fail101); + } + + } +} diff --git a/src/main/java/com/ifish/action/UsersAction.java b/src/main/java/com/ifish/action/UsersAction.java new file mode 100644 index 0000000..765157f --- /dev/null +++ b/src/main/java/com/ifish/action/UsersAction.java @@ -0,0 +1,144 @@ +package com.ifish.action; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.BindingResult; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import com.ifish.dto.JsonResult; +import com.ifish.entity.User; +import com.ifish.enums.ResultEnum; +import com.ifish.exception.IfishException; +import com.ifish.service.UserService; +import com.ifish.validator.LoginParam; +import com.ifish.validator.RegisterParam; + +/** + * @ClassName:UsersAction + * @author ggw + */ + +@RestController +@RequestMapping("/users") +public class UsersAction { + + @Autowired + private UserService userService; + + /** + * 获取验证码 + * @param sendType + * @param phoneNumber + * @return + */ + @RequestMapping(value="/v3/getVerificateCode.do",method=RequestMethod.POST) + public JsonResult getVerificateCode(String sendType,String phoneNumber){ + return userService.getVerificateCode(phoneNumber, sendType); + } + + /** + * 用户注册 + * @param version + * @param userParam + * @param result + * @return + */ + @RequestMapping(value={"/v3/register.do","register.do"},method=RequestMethod.POST) + public JsonResult register(@Validated RegisterParam registerParam,BindingResult result) { + //参数校验 + if(result.hasErrors()){ + throw new IfishException(ResultEnum.error401); + } + return userService.register(registerParam); + } + + /** + * 用户登录 + * @param version + * @param userParam + * @param result + * @return + */ + @RequestMapping(value={"/v3/login.do","/login.do"},method=RequestMethod.POST) + public JsonResult login(@Validated LoginParam loginParam,BindingResult result) { + //参数校验 + if(result.hasErrors()){ + throw new IfishException(ResultEnum.error401); + } + return userService.login(loginParam); + } + + /** + * 登陆验证 + * @param loginParam + * @param result + * @return + */ + @RequestMapping(value="/loginValidation",method=RequestMethod.POST) + public JsonResult loginValidate(@Validated LoginParam loginParam,BindingResult result) { + //参数校验 + if(result.hasErrors()){ + throw new IfishException(ResultEnum.error401); + } + return userService.loginValidate(loginParam); + } + + /** + * 更多用户数据 + * @param userId + * @return + */ + @RequestMapping(value="/moreUserData/{userId}",method=RequestMethod.GET) + public JsonResult moreUserData(@PathVariable("userId") Integer userId) { + return userService.moreUserData(userId); + } + + /** + * 绑定设备 + * @param userId + * @param macAddress + * @return + */ + @RequestMapping(value="/bindingDevice/{userId}",method=RequestMethod.POST) + public JsonResult bindDevice(@PathVariable("userId") Integer userId,@RequestParam("macAddress") String macAddress) { + return userService.bindDevice(userId, macAddress); + } + + /** + * 扫一扫分享设备 + * @param userId + * @param macAddress + * @return + */ + @RequestMapping(value="/sharingDevice/{userId}",method=RequestMethod.POST) + public JsonResult shareDevice(@PathVariable("userId") Integer userId,@RequestParam("deviceId") Integer deviceId) { + return userService.shareDevice(userId, deviceId); + } + + /** + * 修改用户信息 + * @param user + * @return + */ + @RequestMapping(value="/v3/updateInfo.do",method=RequestMethod.POST) + public JsonResult updateInfo(User user) { + return userService.updateInfo(user); + } + + /** + * 上传用户头像 + * @param userId + * @param fileUpload + * @return + */ + @RequestMapping(value="/v3/uploadUserImg.do",method=RequestMethod.POST) + public JsonResult uploadUserImg(@RequestParam("userId")Integer userId,MultipartFile fileUpload) { + return userService.uploadUserImg(userId,fileUpload); + } + +} diff --git a/src/main/java/com/ifish/apiVersion/ApiVersion.java b/src/main/java/com/ifish/apiVersion/ApiVersion.java new file mode 100644 index 0000000..bb47e53 --- /dev/null +++ b/src/main/java/com/ifish/apiVersion/ApiVersion.java @@ -0,0 +1,15 @@ +package com.ifish.apiVersion; + +/** + * 接口版本号 + * @author Administrator + * + */ +public class ApiVersion { + //1.0 + public static final String version1_0 = "1.0"; + //1.1 + public static final String version1_1 = "1.1"; + //1.2 + public static final String version1_2 = "1.2"; +} diff --git a/src/main/java/com/ifish/bean/CommodityInfoBean.java b/src/main/java/com/ifish/bean/CommodityInfoBean.java new file mode 100644 index 0000000..73eae7a --- /dev/null +++ b/src/main/java/com/ifish/bean/CommodityInfoBean.java @@ -0,0 +1,308 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ifish.bean; + +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +/** + * + * @author Administrator + */ +@Entity +@Table(name = "tbl_commodity_info") +public class CommodityInfoBean implements java.io.Serializable { + + /** + * 版本号 + */ + private static final long serialVersionUID = -5102166720334127839L; + + /** + * 商品详情表ID + */ + @Id + @Column(name = "commodity_id", unique = true, nullable = false, length = 10) + private Integer commodityId; + + public CommodityInfoBean(Integer commodityId, Integer shopId, Integer userId, String commodityName, String commodityDetail, String commodityImg, String commodityVideo, Integer commodityStatus, Date createTime, Integer click, Integer backstageStatus) { + this.commodityId = commodityId; + this.shopId = shopId; + this.userId = userId; + this.commodityName = commodityName; + this.commodityDetail = commodityDetail; + this.commodityImg = commodityImg; + this.commodityVideo = commodityVideo; + this.commodityStatus = commodityStatus; + this.createTime = createTime; + this.click = click; + this.backstageStatus = backstageStatus; + } + + public CommodityInfoBean() { + } + + /** + * 店铺ID + */ + @Column(name = "shop_id", nullable = false, length = 10) + private Integer shopId; + + /** + * 用户ID + */ + @Column(name = "user_id", nullable = false, length = 10) + private Integer userId; + + /** + * 商品名称 + */ + @Column(name = "commodity_name", nullable = false, length = 20) + private String commodityName; + + /** + * 商品描述 + */ + @Column(name = "commodity_detail", nullable = true, length = 100) + private String commodityDetail; + + /** + * 商品图片 + */ + @Column(name = "commodity_img", nullable = true, length = 100) + private String commodityImg; + + /** + * 商品视频 + */ + @Column(name = "commodity_video", nullable = true, length = 100) + private String commodityVideo; + + /** + * 商品状态(用户管理) + */ + @Column(name = "commodity_status", nullable = false, length = 10) + private Integer commodityStatus; + + /** + * 创建时间 + */ + @Column(name = "create_time", nullable = false) + private Date createTime; + + /** + * 商品点击数 + */ + @Column(name = "click", nullable = true, length = 10) + private Integer click; + + /** + * 后台管理商品状态 + */ + @Column(name = "backstage_status", nullable = false, length = 10) + private Integer backstageStatus; + + /** + * 获取商品详情表ID + * + * @return 商品详情表ID + */ + public Integer getCommodityId() { + return this.commodityId; + } + + /** + * 设置商品详情表ID + * + * @param commodityId 商品详情表ID + */ + public void setCommodityId(Integer commodityId) { + this.commodityId = commodityId; + } + + /** + * 获取店铺ID + * + * @return 店铺ID + */ + public Integer getShopId() { + return this.shopId; + } + + /** + * 设置店铺ID + * + * @param shopId 店铺ID + */ + public void setShopId(Integer shopId) { + this.shopId = shopId; + } + + /** + * 获取用户ID + * + * @return 用户ID + */ + public Integer getUserId() { + return this.userId; + } + + /** + * 设置用户ID + * + * @param userId 用户ID + */ + public void setUserId(Integer userId) { + this.userId = userId; + } + + /** + * 获取商品名称 + * + * @return 商品名称 + */ + public String getCommodityName() { + return this.commodityName; + } + + /** + * 设置商品名称 + * + * @param commodityName 商品名称 + */ + public void setCommodityName(String commodityName) { + this.commodityName = commodityName; + } + + /** + * 获取商品描述 + * + * @return 商品描述 + */ + public String getCommodityDetail() { + return this.commodityDetail; + } + + /** + * 设置商品描述 + * + * @param commodityDetail 商品描述 + */ + public void setCommodityDetail(String commodityDetail) { + this.commodityDetail = commodityDetail; + } + + /** + * 获取商品图片 + * + * @return 商品图片 + */ + public String getCommodityImg() { + return this.commodityImg; + } + + /** + * 设置商品图片 + * + * @param commodityImg 商品图片 + */ + public void setCommodityImg(String commodityImg) { + this.commodityImg = commodityImg; + } + + /** + * 获取商品视频 + * + * @return 商品视频 + */ + public String getCommodityVideo() { + return this.commodityVideo; + } + + /** + * 设置商品视频 + * + * @param commodityVideo 商品视频 + */ + public void setCommodityVideo(String commodityVideo) { + this.commodityVideo = commodityVideo; + } + + /** + * 获取商品状态(用户管理) + * + * @return 商品状态(用户管理) + */ + public Integer getCommodityStatus() { + return this.commodityStatus; + } + + /** + * 设置商品状态(用户管理) + * + * @param commodityStatus 商品状态(用户管理) + */ + public void setCommodityStatus(Integer commodityStatus) { + this.commodityStatus = commodityStatus; + } + + /** + * 获取创建时间 + * + * @return 创建时间 + */ + public Date getCreateTime() { + return this.createTime; + } + + /** + * 设置创建时间 + * + * @param createTime 创建时间 + */ + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + /** + * 获取商品点击数 + * + * @return 商品点击数 + */ + public Integer getClick() { + return this.click; + } + + /** + * 设置商品点击数 + * + * @param click 商品点击数 + */ + public void setClick(Integer click) { + this.click = click; + } + + /** + * 获取后台管理商品状态 + * + * @return 后台管理商品状态 + */ + public Integer getBackstageStatus() { + return this.backstageStatus; + } + + /** + * 设置后台管理商品状态 + * + * @param backstageStatus 后台管理商品状态 + */ + public void setBackstageStatus(Integer backstageStatus) { + this.backstageStatus = backstageStatus; + } +} diff --git a/src/main/java/com/ifish/bean/DeviceUserBean.java b/src/main/java/com/ifish/bean/DeviceUserBean.java new file mode 100644 index 0000000..bceefcd --- /dev/null +++ b/src/main/java/com/ifish/bean/DeviceUserBean.java @@ -0,0 +1,228 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ifish.bean; + +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +/** + * + * @author Administrator + */ +@Entity +@Table(name = "tbl_device_user") +public class DeviceUserBean implements java.io.Serializable { + + /** + * 版本号 + */ + private static final long serialVersionUID = -8887049051247467842L; + + /** + * + */ + @Id + @Column(name = "user_id", unique = true, nullable = false, length = 10) + private Integer userId; + + /** + * + */ + @Id + @Column(name = "device_id", unique = true, nullable = false, length = 10) + private Integer deviceId; + + /** + * + */ + @Column(name = "is_master", nullable = true, length = 1) + private String isMaster; + + /** + * + */ + @Column(name = "show_name", nullable = true, length = 50) + private String showName; + + /** + * + */ + @Column(name = "create_time", nullable = true) + private Date createTime; + + /** + * + */ + @Column(name = "update_time", nullable = true) + private Date updateTime; + + /** + * + */ + @Column(name = "custom_icon_name", nullable = true, length = 100) + private String customIconName; + + /** + * + */ + @Column(name = "custom_show_name", nullable = true, length = 100) + private String customShowName; + + /** + * 获取 + * + * @return + */ + public Integer getUserId() { + return this.userId; + } + + /** + * 设置 + * + * @param userId + * + */ + public void setUserId(Integer userId) { + this.userId = userId; + } + + /** + * 获取 + * + * @return + */ + public Integer getDeviceId() { + return this.deviceId; + } + + /** + * 设置 + * + * @param deviceId + * + */ + public void setDeviceId(Integer deviceId) { + this.deviceId = deviceId; + } + + /** + * 获取 + * + * @return + */ + public String getIsMaster() { + return this.isMaster; + } + + /** + * 设置 + * + * @param isMaster + * + */ + public void setIsMaster(String isMaster) { + this.isMaster = isMaster; + } + + /** + * 获取 + * + * @return + */ + public String getShowName() { + return this.showName; + } + + /** + * 设置 + * + * @param showName + * + */ + public void setShowName(String showName) { + this.showName = showName; + } + + /** + * 获取 + * + * @return + */ + public Date getCreateTime() { + return this.createTime; + } + + /** + * 设置 + * + * @param createTime + * + */ + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + /** + * 获取 + * + * @return + */ + public Date getUpdateTime() { + return this.updateTime; + } + + /** + * 设置 + * + * @param updateTime + * + */ + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + /** + * 获取 + * + * @return + */ + public String getCustomIconName() { + return this.customIconName; + } + + /** + * 设置 + * + * @param customIconName + * + */ + public void setCustomIconName(String customIconName) { + this.customIconName = customIconName; + } + + /** + * 获取 + * + * @return + */ + public String getCustomShowName() { + return this.customShowName; + } + + /** + * 设置 + * + * @param customShowName + * + */ + public void setCustomShowName(String customShowName) { + this.customShowName = customShowName; + } +} diff --git a/src/main/java/com/ifish/bean/VenderListBean.java b/src/main/java/com/ifish/bean/VenderListBean.java new file mode 100644 index 0000000..13c55bc --- /dev/null +++ b/src/main/java/com/ifish/bean/VenderListBean.java @@ -0,0 +1,243 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ifish.bean; + +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +/** + * + * @author Administrator + */ +@Entity +@Table(name = "tbl_vender_list") +public class VenderListBean implements java.io.Serializable { + + /** + * 版本号 + */ + private static final long serialVersionUID = 190528374520461795L; + + /** + * */ + @Column(name = "brand_logo", nullable = true, length = 100) + private String brandLogo; + + /** + * */ + @Column(name = "brand_name", nullable = false, length = 20) + private String brandName; + + /** + * */ + @Column(name = "brand_introduce", nullable = true, length = 100) + private String brandIntroduce; + + /** + * */ + @Column(name = "app_show", nullable = true, length = 1) + private String appShow; + + /** + * */ + @Id + @Column(name = "brand_code", unique = true, nullable = false, length = 20) + private String brandCode; + + /** + * */ + @Column(name = "contact_phone", nullable = true, length = 30) + private String contactPhone; + + /** + * */ + @Column(name = "contact_address", nullable = true, length = 50) + private String contactAddress; + + /** + * */ + @Column(name = "update_time", nullable = true) + private Date updateTime; + + /** + * */ + @Column(name = "create_time", nullable = true) + private Date createTime; + + /** + * 获取 + * + * @return + */ + public String getBrandLogo() { + return this.brandLogo; + } + + /** + * 设置 + * + * @param brandLogo + * + */ + public void setBrandLogo(String brandLogo) { + this.brandLogo = brandLogo; + } + + /** + * 获取 + * + * @return + */ + public String getBrandName() { + return this.brandName; + } + + /** + * 设置 + * + * @param brandName + * + */ + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + /** + * 获取 + * + * @return + */ + public String getBrandIntroduce() { + return this.brandIntroduce; + } + + /** + * 设置 + * + * @param brandIntroduce + * + */ + public void setBrandIntroduce(String brandIntroduce) { + this.brandIntroduce = brandIntroduce; + } + + /** + * 获取 + * + * @return + */ + public String getAppShow() { + return this.appShow; + } + + /** + * 设置 + * + * @param appShow + * + */ + public void setAppShow(String appShow) { + this.appShow = appShow; + } + + /** + * 获取 + * + * @return + */ + public String getBrandCode() { + return this.brandCode; + } + + /** + * 设置 + * + * @param brandCode + * + */ + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + /** + * 获取 + * + * @return + */ + public String getContactPhone() { + return this.contactPhone; + } + + /** + * 设置 + * + * @param contactPhone + * + */ + public void setContactPhone(String contactPhone) { + this.contactPhone = contactPhone; + } + + /** + * 获取 + * + * @return + */ + public String getContactAddress() { + return this.contactAddress; + } + + /** + * 设置 + * + * @param contactAddress + * + */ + public void setContactAddress(String contactAddress) { + this.contactAddress = contactAddress; + } + + /** + * 获取 + * + * @return + */ + public Date getUpdateTime() { + return this.updateTime; + } + + /** + * 设置 + * + * @param updateTime + * + */ + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + /** + * 获取 + * + * @return + */ + public Date getCreateTime() { + return this.createTime; + } + + /** + * 设置 + * + * @param createTime + * + */ + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } +} diff --git a/src/main/java/com/ifish/config/RedisConfig.java b/src/main/java/com/ifish/config/RedisConfig.java new file mode 100644 index 0000000..94b5b84 --- /dev/null +++ b/src/main/java/com/ifish/config/RedisConfig.java @@ -0,0 +1,59 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ifish.config; + +import com.ifish.util.IfishFilePath; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.StringRedisTemplate; + +/** + * + * @author Administrator + */ +@Configuration +public class RedisConfig { + + @Bean + public RedisConnectionFactory redisCF() { + JedisConnectionFactory cf = new JedisConnectionFactory(); + +// //获取当前操作系统(servers_os为服务器设置的属性JAVA_OPTS=%JAVA_OPTS% -Dservers_os=online84) +// String servers_os = System.getProperty("servers_os") == null ? "" : System.getProperty("servers_os"); + if (IfishFilePath.link_img_head.contains("ifish7")) { + //114.55.42.84 站点线上服务器 + cf.setHostName("120.55.190.56");//本机访问 +// cf.setHostName("10.25.172.5");//内网ip地址,用于多服务器负载 + cf.setPort(3796); + cf.setPassword("ifish7myredis"); + } else { + //192.168.1.237 站点测试服务器 + cf.setHostName("139.196.24.156"); + cf.setPort(3796); + cf.setPassword("ifish7myredis"); +// FileUtil.writeLinesByLog("测试缓存连接"); + } + + return cf; + } + + @Bean + public RedisTemplate redisTemplate(RedisConnectionFactory cf) { + RedisTemplate redis = new RedisTemplate(); + redis.setConnectionFactory(cf); + return redis; + } + + @Bean + public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory cf) { + StringRedisTemplate redis = new StringRedisTemplate(); + redis.setConnectionFactory(cf); + return redis; + } +} diff --git a/src/main/java/com/ifish/dao/AdInfoDao.java b/src/main/java/com/ifish/dao/AdInfoDao.java new file mode 100644 index 0000000..335a082 --- /dev/null +++ b/src/main/java/com/ifish/dao/AdInfoDao.java @@ -0,0 +1,12 @@ +package com.ifish.dao; + +import com.ifish.entity.AdInfo; + +/** + * 广告信息 + * @author Administrator + * + */ +public interface AdInfoDao extends BaseDao{ + +} diff --git a/src/main/java/com/ifish/dao/BaseDao.java b/src/main/java/com/ifish/dao/BaseDao.java new file mode 100644 index 0000000..352bc19 --- /dev/null +++ b/src/main/java/com/ifish/dao/BaseDao.java @@ -0,0 +1,37 @@ +package com.ifish.dao; + +import java.io.Serializable; +import java.util.List; + +import org.hibernate.criterion.Criterion; +import org.hibernate.criterion.Order; + +import com.ifish.hibernate.Pagination; + +/** + * @ClassName: BaseDao + * @Description: TODO + * @author ggw + * + */ +public interface BaseDao { + + public T get(ID id); + + public T save(T t); + + public T update(T t); + + public T saveOrUpdate(T t); + + public void delete(T t); + + public List findByProperty(Criterion... criterions); + + public List findByProperty(Order order,Criterion... criterions); + + public T findUniqueByProperty(Criterion... criterions); + + public Pagination findByCriteria(Integer firstResult,Integer pageSize,Order order,Criterion... criterion); + +} diff --git a/src/main/java/com/ifish/dao/BrowseRoomDao.java b/src/main/java/com/ifish/dao/BrowseRoomDao.java new file mode 100644 index 0000000..205ad1f --- /dev/null +++ b/src/main/java/com/ifish/dao/BrowseRoomDao.java @@ -0,0 +1,14 @@ +package com.ifish.dao; + +import com.ifish.entity.BrowseRoom; +import com.ifish.entity.BrowseRoomId; + +/** + * @ClassName: BrowseRoomDao + * @Description: TODO + * @author ggw + * + */ +public interface BrowseRoomDao extends BaseDao{ + +} diff --git a/src/main/java/com/ifish/dao/CameraActiveDao.java b/src/main/java/com/ifish/dao/CameraActiveDao.java new file mode 100644 index 0000000..e7b47ce --- /dev/null +++ b/src/main/java/com/ifish/dao/CameraActiveDao.java @@ -0,0 +1,13 @@ +package com.ifish.dao; + +import com.ifish.entity.CameraActive; + +/** + * @ClassName: CameraActiveDao + * @Description: TODO + * @author ggw + * + */ +public interface CameraActiveDao extends BaseDao{ + +} diff --git a/src/main/java/com/ifish/dao/CameraDao.java b/src/main/java/com/ifish/dao/CameraDao.java new file mode 100644 index 0000000..1ff34a8 --- /dev/null +++ b/src/main/java/com/ifish/dao/CameraDao.java @@ -0,0 +1,13 @@ +package com.ifish.dao; + +import com.ifish.entity.Camera; + +/** + * @ClassName: CameraDao + * @Description: TODO + * @author ggw + * + */ +public interface CameraDao extends BaseDao{ + +} diff --git a/src/main/java/com/ifish/dao/CameraUserDao.java b/src/main/java/com/ifish/dao/CameraUserDao.java new file mode 100644 index 0000000..453c62c --- /dev/null +++ b/src/main/java/com/ifish/dao/CameraUserDao.java @@ -0,0 +1,20 @@ +package com.ifish.dao; + +import com.ifish.entity.CameraUser; +import com.ifish.entity.CameraUserId; + +/** + * @ClassName: CameraUserDao + * @Description: TODO + * @author ggw + * + */ +public interface CameraUserDao extends BaseDao{ + + /** + * 查询用户的摄像头数量 + * @param userId + * @return + */ + public int getCameraNumById(Integer userId); +} diff --git a/src/main/java/com/ifish/dao/CommentDao.java b/src/main/java/com/ifish/dao/CommentDao.java new file mode 100644 index 0000000..c53dc8a --- /dev/null +++ b/src/main/java/com/ifish/dao/CommentDao.java @@ -0,0 +1,15 @@ +package com.ifish.dao; + +import com.ifish.entity.Comment; + +/** + * @ClassName: CommentDao + * @Description: TODO + * @author ggw + * + */ +public interface CommentDao extends BaseDao{ + + public Integer getPinglunNum(Integer ueditorId); + +} diff --git a/src/main/java/com/ifish/dao/CouponDao.java b/src/main/java/com/ifish/dao/CouponDao.java new file mode 100644 index 0000000..9e715b0 --- /dev/null +++ b/src/main/java/com/ifish/dao/CouponDao.java @@ -0,0 +1,12 @@ +package com.ifish.dao; + +import com.ifish.entity.Coupon; + +/** + * 优惠券 + * @author Administrator + * + */ +public interface CouponDao extends BaseDao { + +} diff --git a/src/main/java/com/ifish/dao/CouponRecordDao.java b/src/main/java/com/ifish/dao/CouponRecordDao.java new file mode 100644 index 0000000..d953c6f --- /dev/null +++ b/src/main/java/com/ifish/dao/CouponRecordDao.java @@ -0,0 +1,26 @@ +package com.ifish.dao; + +import com.ifish.entity.CouponRecord; + +/** + * 优惠券兑换记录 + * @author Administrator + * + */ +public interface CouponRecordDao extends BaseDao { + + /** + * 查询兑换券的兑换数量 + * @param couponId + * @return + */ + int getCouponRecordCountByCouponId(Integer couponId); + + /** + * 查询用户的兑换数量 + * @param couponId + * @return + */ + int getCouponRecordCountByUser(Integer userId,Integer couponId); + +} diff --git a/src/main/java/com/ifish/dao/DeviceCameraDao.java b/src/main/java/com/ifish/dao/DeviceCameraDao.java new file mode 100644 index 0000000..ca8760d --- /dev/null +++ b/src/main/java/com/ifish/dao/DeviceCameraDao.java @@ -0,0 +1,18 @@ +package com.ifish.dao; + +import java.util.List; + +import com.ifish.entity.DeviceCamera; +import com.ifish.entity.DeviceCameraId; + +/** + * @ClassName: DeviceCameraDao + * @Description: TODO + * @author ggw + * + */ +public interface DeviceCameraDao extends BaseDao{ + + public void removeAll(List list); + +} diff --git a/src/main/java/com/ifish/dao/DeviceDao.java b/src/main/java/com/ifish/dao/DeviceDao.java new file mode 100644 index 0000000..8ae152a --- /dev/null +++ b/src/main/java/com/ifish/dao/DeviceDao.java @@ -0,0 +1,13 @@ +package com.ifish.dao; + +import com.ifish.entity.Device; + +/** + * @ClassName: DeviceDao + * @Description: TODO + * @author ggw + * + */ +public interface DeviceDao extends BaseDao{ + +} diff --git a/src/main/java/com/ifish/dao/DeviceUserDao.java b/src/main/java/com/ifish/dao/DeviceUserDao.java new file mode 100644 index 0000000..fe0e099 --- /dev/null +++ b/src/main/java/com/ifish/dao/DeviceUserDao.java @@ -0,0 +1,25 @@ +package com.ifish.dao; + +import java.util.List; + +import com.ifish.entity.DeviceUser; +import com.ifish.entity.DeviceUserId; + +/** + * @ClassName: DeviceUserDao + * @Description: TODO + * @author ggw + * + */ +public interface DeviceUserDao extends BaseDao{ + + public void removeAll(List list); + + /** + * 查询用户的设备数量 + * @param userId + * @return + */ + public int getDeviceNumById(Integer userId); + +} diff --git a/src/main/java/com/ifish/dao/GoldControlDao.java b/src/main/java/com/ifish/dao/GoldControlDao.java new file mode 100644 index 0000000..485e4af --- /dev/null +++ b/src/main/java/com/ifish/dao/GoldControlDao.java @@ -0,0 +1,13 @@ +package com.ifish.dao; + +import com.ifish.entity.GoldControl; +import com.ifish.entity.GoldControlId; + +/** + * 金币控制信息 + * @author Administrator + * + */ +public interface GoldControlDao extends BaseDao { + +} diff --git a/src/main/java/com/ifish/dao/GoldExpendRecordDao.java b/src/main/java/com/ifish/dao/GoldExpendRecordDao.java new file mode 100644 index 0000000..92ad178 --- /dev/null +++ b/src/main/java/com/ifish/dao/GoldExpendRecordDao.java @@ -0,0 +1,12 @@ +package com.ifish.dao; + +import com.ifish.entity.GoldExpendRecord; + +/** + * 金币消耗记录 + * @author Administrator + * + */ +public interface GoldExpendRecordDao extends BaseDao{ + +} diff --git a/src/main/java/com/ifish/dao/GoldGetRecordDao.java b/src/main/java/com/ifish/dao/GoldGetRecordDao.java new file mode 100644 index 0000000..32fe85e --- /dev/null +++ b/src/main/java/com/ifish/dao/GoldGetRecordDao.java @@ -0,0 +1,21 @@ +package com.ifish.dao; + +import java.math.BigDecimal; + +import com.ifish.entity.GoldGetRecord; + +/** + * 获取金币记录 + * @author Administrator + * + */ +public interface GoldGetRecordDao extends BaseDao{ + + /** + * 打赏金额数量 + * @param userId + * @return + */ + BigDecimal getQuestionPayTourGoldValue(Integer userId); + +} diff --git a/src/main/java/com/ifish/dao/GoldRuleDao.java b/src/main/java/com/ifish/dao/GoldRuleDao.java new file mode 100644 index 0000000..58adbfe --- /dev/null +++ b/src/main/java/com/ifish/dao/GoldRuleDao.java @@ -0,0 +1,12 @@ +package com.ifish.dao; + +import com.ifish.entity.GoldTask; + +/** + * 金币获取规则 + * @author Administrator + * + */ +public interface GoldRuleDao extends BaseDao { + +} diff --git a/src/main/java/com/ifish/dao/GradeControlDao.java b/src/main/java/com/ifish/dao/GradeControlDao.java new file mode 100644 index 0000000..1257a27 --- /dev/null +++ b/src/main/java/com/ifish/dao/GradeControlDao.java @@ -0,0 +1,13 @@ +package com.ifish.dao; + +import com.ifish.entity.GradeControl; +import com.ifish.entity.GradeControlId; + +/** + * 等级经验控制 + * @author Administrator + * + */ +public interface GradeControlDao extends BaseDao { + +} diff --git a/src/main/java/com/ifish/dao/GradeDao.java b/src/main/java/com/ifish/dao/GradeDao.java new file mode 100644 index 0000000..4978827 --- /dev/null +++ b/src/main/java/com/ifish/dao/GradeDao.java @@ -0,0 +1,13 @@ +package com.ifish.dao; + +import com.ifish.entity.Grade; + +/** + * @ClassName: GradeDao + * @Description: TODO + * @author ggw + * + */ +public interface GradeDao extends BaseDao{ + +} diff --git a/src/main/java/com/ifish/dao/GradeRecordDao.java b/src/main/java/com/ifish/dao/GradeRecordDao.java new file mode 100644 index 0000000..9d2e84b --- /dev/null +++ b/src/main/java/com/ifish/dao/GradeRecordDao.java @@ -0,0 +1,13 @@ +package com.ifish.dao; + +import com.ifish.entity.GradeRecord; + +/** + * @ClassName: GradeRecordDao + * @Description: TODO + * @author ggw + * + */ +public interface GradeRecordDao extends BaseDao{ + +} diff --git a/src/main/java/com/ifish/dao/GradeRuleDao.java b/src/main/java/com/ifish/dao/GradeRuleDao.java new file mode 100644 index 0000000..c74c2d1 --- /dev/null +++ b/src/main/java/com/ifish/dao/GradeRuleDao.java @@ -0,0 +1,13 @@ +package com.ifish.dao; + +import com.ifish.entity.GradeTask; + +/** + * @ClassName: GradeRuleDao + * @Description: TODO + * @author ggw + * + */ +public interface GradeRuleDao extends BaseDao{ + +} diff --git a/src/main/java/com/ifish/dao/HardwareTypeDao.java b/src/main/java/com/ifish/dao/HardwareTypeDao.java new file mode 100644 index 0000000..fc8ff58 --- /dev/null +++ b/src/main/java/com/ifish/dao/HardwareTypeDao.java @@ -0,0 +1,13 @@ +package com.ifish.dao; + +import com.ifish.entity.HardwareType; + +/** + * @ClassName: HardwareTypeDao + * @Description: TODO + * @author ggw + * + */ +public interface HardwareTypeDao extends BaseDao{ + +} diff --git a/src/main/java/com/ifish/dao/IfishDoctorDao.java b/src/main/java/com/ifish/dao/IfishDoctorDao.java new file mode 100644 index 0000000..7670714 --- /dev/null +++ b/src/main/java/com/ifish/dao/IfishDoctorDao.java @@ -0,0 +1,13 @@ +package com.ifish.dao; + +import com.ifish.entity.IfishDoctor; + +/** + * @ClassName: IfishDoctorDao + * @Description: TODO + * @author ggw + * + */ +public interface IfishDoctorDao extends BaseDao{ + +} diff --git a/src/main/java/com/ifish/dao/IfishGoodsDao.java b/src/main/java/com/ifish/dao/IfishGoodsDao.java new file mode 100644 index 0000000..35227e8 --- /dev/null +++ b/src/main/java/com/ifish/dao/IfishGoodsDao.java @@ -0,0 +1,12 @@ +package com.ifish.dao; + +import com.ifish.entity.IfishGoods; + +/** + * 商品管理dao + * @author Administrator + * + */ +public interface IfishGoodsDao extends BaseDao { + +} diff --git a/src/main/java/com/ifish/dao/IfishShopDao.java b/src/main/java/com/ifish/dao/IfishShopDao.java new file mode 100644 index 0000000..d485f66 --- /dev/null +++ b/src/main/java/com/ifish/dao/IfishShopDao.java @@ -0,0 +1,12 @@ +package com.ifish.dao; + +import com.ifish.entity.IfishShop; + +/** + * 店铺管理dao + * @author Administrator + * + */ +public interface IfishShopDao extends BaseDao { + +} diff --git a/src/main/java/com/ifish/dao/InformationDao.java b/src/main/java/com/ifish/dao/InformationDao.java new file mode 100644 index 0000000..e51f5fb --- /dev/null +++ b/src/main/java/com/ifish/dao/InformationDao.java @@ -0,0 +1,14 @@ +package com.ifish.dao; + +import com.ifish.entity.Information; + + +/** + * @ClassName: InformationDao + * @Description: TODO + * @author ggw + * + */ +public interface InformationDao extends BaseDao{ + +} \ No newline at end of file diff --git a/src/main/java/com/ifish/dao/InformationStatsDao.java b/src/main/java/com/ifish/dao/InformationStatsDao.java new file mode 100644 index 0000000..17cc337 --- /dev/null +++ b/src/main/java/com/ifish/dao/InformationStatsDao.java @@ -0,0 +1,12 @@ +package com.ifish.dao; + +import com.ifish.entity.InformationStats; + +/** + * 资讯数据统计 + * @author Administrator + * + */ +public interface InformationStatsDao extends BaseDao { + +} diff --git a/src/main/java/com/ifish/dao/LiveBannerDao.java b/src/main/java/com/ifish/dao/LiveBannerDao.java new file mode 100644 index 0000000..ffb67e0 --- /dev/null +++ b/src/main/java/com/ifish/dao/LiveBannerDao.java @@ -0,0 +1,13 @@ +package com.ifish.dao; + +import com.ifish.entity.LiveBanner; + +/** + * @ClassName: LiveBannerDao + * @Description: TODO + * @author ggw + * + */ +public interface LiveBannerDao extends BaseDao{ + +} diff --git a/src/main/java/com/ifish/dao/LiveMessageDao.java b/src/main/java/com/ifish/dao/LiveMessageDao.java new file mode 100644 index 0000000..c5e33ea --- /dev/null +++ b/src/main/java/com/ifish/dao/LiveMessageDao.java @@ -0,0 +1,21 @@ +package com.ifish.dao; + +import com.ifish.entity.LiveMessage; + + +/** + * @ClassName: LiveMessageDao + * @Description: TODO + * @author ggw + * + */ +public interface LiveMessageDao extends BaseDao{ + + /** + * 获取直播间评论数 + * @param roomId + * @return + */ + public int getLiveMessageCount(Integer roomId); + +} diff --git a/src/main/java/com/ifish/dao/LiveRoomDao.java b/src/main/java/com/ifish/dao/LiveRoomDao.java new file mode 100644 index 0000000..93e908e --- /dev/null +++ b/src/main/java/com/ifish/dao/LiveRoomDao.java @@ -0,0 +1,62 @@ +package com.ifish.dao; + +import java.util.List; + +import com.ifish.dto.LiveRoomInfoDto; +import com.ifish.entity.LiveRoom; +import com.ifish.hibernate.Pagination; + +/** + * @ClassName: LiveRoomDao + * @Description: TODO + * @author ggw + * + */ +public interface LiveRoomDao extends BaseDao{ + + /** + * 获取离用户最近的5条记录 + * @param longitude + * @param latitude + * @return + */ + public List findByDistance(Double longitude,Double latitude); + + /** + * 获取用户最近浏览的5条记录 + * @param userId + * @return + */ + public List findByBrowse(Integer userId); + + /** + * 获取人气值最高的5条记录 + * @return + */ + public List findByPopularityValue(); + + /** + * 根据开播时间倒序 + * @param firstResult + * @param pageSize + * @return + */ + public Pagination findByTime(Integer firstResult,Integer pageSize,String orders); + + /** + * 根据人气值倒序 + * @param firstResult + * @param pageSize + * @return + */ + public Pagination findByPopularityValue(Integer firstResult,Integer pageSize); + + /** + * 根据推荐顺序 + * @param firstResult + * @param pageSize + * @return + */ + public Pagination getLiveRoomsByTuijian(Integer firstResult,Integer pageSize); + +} diff --git a/src/main/java/com/ifish/dao/LiveRoomZanDao.java b/src/main/java/com/ifish/dao/LiveRoomZanDao.java new file mode 100644 index 0000000..f6e43e7 --- /dev/null +++ b/src/main/java/com/ifish/dao/LiveRoomZanDao.java @@ -0,0 +1,20 @@ +package com.ifish.dao; + +import com.ifish.entity.LiveRoomZan; +import com.ifish.entity.LiveRoomZanId; + +/** + * 直播间点赞 + * @author Administrator + * + */ +public interface LiveRoomZanDao extends BaseDao { + + /** + * 点赞数量 + * @param roomId + * @return + */ + public Integer getZanNum(Integer roomId); + +} diff --git a/src/main/java/com/ifish/dao/LookReportDao.java b/src/main/java/com/ifish/dao/LookReportDao.java new file mode 100644 index 0000000..6d91e69 --- /dev/null +++ b/src/main/java/com/ifish/dao/LookReportDao.java @@ -0,0 +1,13 @@ +package com.ifish.dao; + +import com.ifish.entity.LookReport; + +/** + * @ClassName: LookReportDao + * @Description: TODO + * @author ggw + * + */ +public interface LookReportDao extends BaseDao{ + +} diff --git a/src/main/java/com/ifish/dao/PushListDao.java b/src/main/java/com/ifish/dao/PushListDao.java new file mode 100644 index 0000000..e67297b --- /dev/null +++ b/src/main/java/com/ifish/dao/PushListDao.java @@ -0,0 +1,15 @@ +package com.ifish.dao; + +import com.ifish.entity.PushList; +import com.ifish.hibernate.Pagination; + +/** + * @ClassName: PushListDao + * @Description: TODO + * @author ggw + * + */ +public interface PushListDao extends BaseDao{ + + public Pagination findByCriteria(Integer pushId,Integer userId,Integer firstResult,Integer pageSize); +} diff --git a/src/main/java/com/ifish/dao/QuestionsFeedbackDao.java b/src/main/java/com/ifish/dao/QuestionsFeedbackDao.java new file mode 100644 index 0000000..828ec47 --- /dev/null +++ b/src/main/java/com/ifish/dao/QuestionsFeedbackDao.java @@ -0,0 +1,13 @@ +package com.ifish.dao; + +import com.ifish.entity.QuestionsFeedback; + +/** + * @ClassName: QuestionsFeedbackDao + * @Description: TODO + * @author ggw + * + */ +public interface QuestionsFeedbackDao extends BaseDao{ + +} diff --git a/src/main/java/com/ifish/dao/ShopsInfoDao.java b/src/main/java/com/ifish/dao/ShopsInfoDao.java new file mode 100644 index 0000000..9bf0e87 --- /dev/null +++ b/src/main/java/com/ifish/dao/ShopsInfoDao.java @@ -0,0 +1,35 @@ +package com.ifish.dao; + +import java.util.List; + +import com.ifish.dto.ShopsListDto; +import com.ifish.entity.ShopsInfo; +import com.ifish.hibernate.Pagination; + + +/** + * @ClassName: ShopsInfoDao + * @Description: TODO + * @author ggw + * + */ +public interface ShopsInfoDao extends BaseDao{ + + /** + * 根据距离获取数据 + * @param longitude + * @param latitude + * @param firstResult + * @param pageSize + * @return + */ + public Pagination findByDistance(Double longitude,Double latitude,Integer firstResult,Integer pageSize); + + + /** + * 随机取得用户ID + * @return + */ + public List getShopsUserIdByRand(Integer userId); + +} diff --git a/src/main/java/com/ifish/dao/ShopsUserInfoDao.java b/src/main/java/com/ifish/dao/ShopsUserInfoDao.java new file mode 100644 index 0000000..38a0bb4 --- /dev/null +++ b/src/main/java/com/ifish/dao/ShopsUserInfoDao.java @@ -0,0 +1,13 @@ +package com.ifish.dao; + +import com.ifish.entity.ShopsUserInfo; +import com.ifish.entity.ShopsUserInfoId; + +/** + * 商家会员信息dao + * @author Administrator + * + */ +public interface ShopsUserInfoDao extends BaseDao{ + +} diff --git a/src/main/java/com/ifish/dao/UeditorDao.java b/src/main/java/com/ifish/dao/UeditorDao.java new file mode 100644 index 0000000..38679fc --- /dev/null +++ b/src/main/java/com/ifish/dao/UeditorDao.java @@ -0,0 +1,13 @@ +package com.ifish.dao; + +import com.ifish.entity.Ueditor; + +/** + * @ClassName: UeditorDao + * @Description: TODO + * @author ggw + * + */ +public interface UeditorDao extends BaseDao{ + +} diff --git a/src/main/java/com/ifish/dao/UserActivityDao.java b/src/main/java/com/ifish/dao/UserActivityDao.java new file mode 100644 index 0000000..0427f51 --- /dev/null +++ b/src/main/java/com/ifish/dao/UserActivityDao.java @@ -0,0 +1,12 @@ +package com.ifish.dao; + +import com.ifish.entity.UserActivity; + +/** + * 用户动态 + * @author Administrator + * + */ +public interface UserActivityDao extends BaseDao{ + +} diff --git a/src/main/java/com/ifish/dao/UserAssetDao.java b/src/main/java/com/ifish/dao/UserAssetDao.java new file mode 100644 index 0000000..f3e2611 --- /dev/null +++ b/src/main/java/com/ifish/dao/UserAssetDao.java @@ -0,0 +1,12 @@ +package com.ifish.dao; + +import com.ifish.entity.UserAsset; + +/** + * 用户资产(金币,经验值等信息) + * @author Administrator + * + */ +public interface UserAssetDao extends BaseDao{ + +} diff --git a/src/main/java/com/ifish/dao/UserDao.java b/src/main/java/com/ifish/dao/UserDao.java new file mode 100644 index 0000000..827d803 --- /dev/null +++ b/src/main/java/com/ifish/dao/UserDao.java @@ -0,0 +1,42 @@ +package com.ifish.dao; + +import java.util.List; + +import com.ifish.dto.ShopsLookUserDto; +import com.ifish.entity.User; +import com.ifish.hibernate.Pagination; + +/** + * @ClassName: UserDao + * @Description: TODO + * @author ggw + * + */ +public interface UserDao extends BaseDao{ + + /** + * 商家看护下的某个用户的所有摄像头 + * @param shopsUserId + * @param firstResult + * @param pageSize + * @return + */ + public Pagination findByCriteria(Integer shopsUserId,Integer firstResult,Integer pageSize); + + + /** + * 更新用户登陆时间和登陆次数 + * @param userId + * @return + */ + public int executeLoginUpdate(Integer userId,String loginType); + + /** + * 获取用户ID + * @param userId + * @param firstResult + * @param maxResults + * @return + */ + public List getUserIds(Integer userId,Integer firstResult,int maxResults); +} diff --git a/src/main/java/com/ifish/dao/VenderListDao.java b/src/main/java/com/ifish/dao/VenderListDao.java new file mode 100644 index 0000000..d146eeb --- /dev/null +++ b/src/main/java/com/ifish/dao/VenderListDao.java @@ -0,0 +1,18 @@ +package com.ifish.dao; + +import com.ifish.entity.VenderList; +import com.ifish.hibernate.Pagination; + +/** + * @ClassName: VenderListDao + * @Description: TODO + * @author ggw + * + */ +public interface VenderListDao extends BaseDao{ + + public VenderList getDefaultVenderList(); + + public Pagination findByCriteria(Integer firstResult,Integer pageSize); + +} diff --git a/src/main/java/com/ifish/dao/VersionDao.java b/src/main/java/com/ifish/dao/VersionDao.java new file mode 100644 index 0000000..eaab4c5 --- /dev/null +++ b/src/main/java/com/ifish/dao/VersionDao.java @@ -0,0 +1,15 @@ +package com.ifish.dao; + +import com.ifish.entity.Version; + +/** + * @ClassName: UserDao + * @Description: TODO + * @author ggw + * + */ +public interface VersionDao { + + public Version getNewestVersion(String phoneType); + +} diff --git a/src/main/java/com/ifish/daoImpl/AdInfoDaoImpl.java b/src/main/java/com/ifish/daoImpl/AdInfoDaoImpl.java new file mode 100644 index 0000000..06e2d3e --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/AdInfoDaoImpl.java @@ -0,0 +1,20 @@ +package com.ifish.daoImpl; + +import org.springframework.stereotype.Repository; + +import com.ifish.dao.AdInfoDao; +import com.ifish.entity.AdInfo; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * 广告信息 + */ +@Repository +public class AdInfoDaoImpl extends HibernateBaseDao implements AdInfoDao { + + @Override + protected Class getEntityClass() { + return AdInfo.class; + } + +} diff --git a/src/main/java/com/ifish/daoImpl/BrowseRoomDaoImpl.java b/src/main/java/com/ifish/daoImpl/BrowseRoomDaoImpl.java new file mode 100644 index 0000000..eaf2c45 --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/BrowseRoomDaoImpl.java @@ -0,0 +1,25 @@ +package com.ifish.daoImpl; + +import org.springframework.stereotype.Repository; + +import com.ifish.dao.BrowseRoomDao; +import com.ifish.entity.BrowseRoom; +import com.ifish.entity.BrowseRoomId; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * @ClassName: CameraDaoImpl + * @Description: TODO + * @author ggw + * + */ + +@Repository +public class BrowseRoomDaoImpl extends HibernateBaseDao implements BrowseRoomDao { + + @Override + protected Class getEntityClass() { + return BrowseRoom.class; + } + +} diff --git a/src/main/java/com/ifish/daoImpl/CameraActiveDaoImpl.java b/src/main/java/com/ifish/daoImpl/CameraActiveDaoImpl.java new file mode 100644 index 0000000..4cbdab1 --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/CameraActiveDaoImpl.java @@ -0,0 +1,24 @@ +package com.ifish.daoImpl; + +import org.springframework.stereotype.Repository; + +import com.ifish.dao.CameraActiveDao; +import com.ifish.entity.CameraActive; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * @ClassName: CameraActiveDao + * @Description: TODO + * @author ggw + * + */ + +@Repository +public class CameraActiveDaoImpl extends HibernateBaseDao implements CameraActiveDao { + + @Override + public Class getEntityClass() { + return CameraActive.class; + } + +} diff --git a/src/main/java/com/ifish/daoImpl/CameraDaoImpl.java b/src/main/java/com/ifish/daoImpl/CameraDaoImpl.java new file mode 100644 index 0000000..19cef6a --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/CameraDaoImpl.java @@ -0,0 +1,24 @@ +package com.ifish.daoImpl; + +import org.springframework.stereotype.Repository; + +import com.ifish.dao.CameraDao; +import com.ifish.entity.Camera; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * @ClassName: CameraDaoImpl + * @Description: TODO + * @author ggw + * + */ + +@Repository +public class CameraDaoImpl extends HibernateBaseDao implements CameraDao { + + @Override + protected Class getEntityClass() { + return Camera.class; + } + +} diff --git a/src/main/java/com/ifish/daoImpl/CameraUserDaoImpl.java b/src/main/java/com/ifish/daoImpl/CameraUserDaoImpl.java new file mode 100644 index 0000000..5b63f2b --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/CameraUserDaoImpl.java @@ -0,0 +1,39 @@ +package com.ifish.daoImpl; + +import java.math.BigInteger; + +import org.springframework.stereotype.Repository; + +import com.ifish.dao.CameraUserDao; +import com.ifish.entity.CameraUser; +import com.ifish.entity.CameraUserId; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * @ClassName: CameraUserDaoImpl + * @Description: TODO + * @author ggw + * + */ + +@Repository +public class CameraUserDaoImpl extends HibernateBaseDao implements CameraUserDao { + + @Override + protected Class getEntityClass() { + return CameraUser.class; + } + + /** + * 查询用户的摄像头数量 + * @param userId + * @return + */ + @Override + public int getCameraNumById(Integer userId) { + String sql = "select count(*) from tbl_camera_user where user_id=?"; + int deviceNum = ((BigInteger)this.getSession().createSQLQuery(sql).setInteger(0, userId).uniqueResult()).intValue(); + return deviceNum; + } + +} diff --git a/src/main/java/com/ifish/daoImpl/CommentDaoImpl.java b/src/main/java/com/ifish/daoImpl/CommentDaoImpl.java new file mode 100644 index 0000000..7e6e04a --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/CommentDaoImpl.java @@ -0,0 +1,31 @@ +package com.ifish.daoImpl; + +import org.springframework.stereotype.Repository; + +import com.ifish.dao.CommentDao; +import com.ifish.entity.Comment; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * @ClassName: CommentDaoImpl + * @Description: TODO + * @author ggw + * + */ + +@Repository() +public class CommentDaoImpl extends HibernateBaseDao implements CommentDao { + + @Override + protected Class getEntityClass() { + return Comment.class; + } + + @Override + public Integer getPinglunNum(Integer ueditorId) { + //查询评论数据 + String sql = "SELECT count(*) FROM tbl_comment where ueditor_id=?"; + return ((Number)getSession().createSQLQuery(sql).setInteger(0, ueditorId).uniqueResult()).intValue(); + } + +} diff --git a/src/main/java/com/ifish/daoImpl/CouponDaoImpl.java b/src/main/java/com/ifish/daoImpl/CouponDaoImpl.java new file mode 100644 index 0000000..4bf719e --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/CouponDaoImpl.java @@ -0,0 +1,22 @@ +package com.ifish.daoImpl; + +import org.springframework.stereotype.Repository; + +import com.ifish.dao.CouponDao; +import com.ifish.entity.Coupon; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * 优惠券 + * @author Administrator + * + */ +@Repository +public class CouponDaoImpl extends HibernateBaseDao implements CouponDao { + + @Override + protected Class getEntityClass() { + return Coupon.class; + } + +} diff --git a/src/main/java/com/ifish/daoImpl/CouponRecordDaoImpl.java b/src/main/java/com/ifish/daoImpl/CouponRecordDaoImpl.java new file mode 100644 index 0000000..7c88270 --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/CouponRecordDaoImpl.java @@ -0,0 +1,37 @@ +package com.ifish.daoImpl; + +import java.math.BigInteger; + +import org.springframework.stereotype.Repository; + +import com.ifish.dao.CouponRecordDao; +import com.ifish.entity.CouponRecord; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * 优惠价兑换记录 + * @author Administrator + * + */ +@Repository +public class CouponRecordDaoImpl extends HibernateBaseDao implements CouponRecordDao { + + @Override + protected Class getEntityClass() { + return CouponRecord.class; + } + + @Override + public int getCouponRecordCountByCouponId(Integer couponId) { + String sql = "select count(*) from tbl_coupon_record where coupon_id=?"; + return ((BigInteger)getSession().createSQLQuery(sql).setInteger(0, couponId).uniqueResult()).intValue(); + } + + @Override + public int getCouponRecordCountByUser(Integer userId, Integer couponId) { + String sql = "select count(*) from tbl_coupon_record where user_id=? and coupon_id=?"; + return ((BigInteger)getSession().createSQLQuery(sql).setInteger(0, userId).setInteger(1, couponId).uniqueResult()).intValue(); + } + + +} diff --git a/src/main/java/com/ifish/daoImpl/DeviceCameraDaoImpl.java b/src/main/java/com/ifish/daoImpl/DeviceCameraDaoImpl.java new file mode 100644 index 0000000..bb0529a --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/DeviceCameraDaoImpl.java @@ -0,0 +1,35 @@ +package com.ifish.daoImpl; + +import java.util.List; + +import org.springframework.stereotype.Repository; + +import com.ifish.dao.DeviceCameraDao; +import com.ifish.entity.DeviceCamera; +import com.ifish.entity.DeviceCameraId; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * @ClassName: DeviceCameraDaoImpl + * @Description: TODO + * @author ggw + * + */ + +@Repository +public class DeviceCameraDaoImpl extends HibernateBaseDao implements DeviceCameraDao { + + + @Override + protected Class getEntityClass() { + return DeviceCamera.class; + } + + @Override + public void removeAll(List list) { + for (DeviceCamera deviceCamera:list) { + delete(deviceCamera); + } + } + +} diff --git a/src/main/java/com/ifish/daoImpl/DeviceDaoImpl.java b/src/main/java/com/ifish/daoImpl/DeviceDaoImpl.java new file mode 100644 index 0000000..77e704f --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/DeviceDaoImpl.java @@ -0,0 +1,24 @@ +package com.ifish.daoImpl; + +import org.springframework.stereotype.Repository; + +import com.ifish.dao.DeviceDao; +import com.ifish.entity.Device; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * @ClassName: DeviceDaoImpl + * @Description: TODO + * @author ggw + * + */ + +@Repository +public class DeviceDaoImpl extends HibernateBaseDao implements DeviceDao { + + @Override + protected Class getEntityClass() { + return Device.class; + } + +} diff --git a/src/main/java/com/ifish/daoImpl/DeviceUserDaoImpl.java b/src/main/java/com/ifish/daoImpl/DeviceUserDaoImpl.java new file mode 100644 index 0000000..db544aa --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/DeviceUserDaoImpl.java @@ -0,0 +1,47 @@ +package com.ifish.daoImpl; + +import java.math.BigInteger; +import java.util.List; + +import org.springframework.stereotype.Repository; + +import com.ifish.dao.DeviceUserDao; +import com.ifish.entity.DeviceUser; +import com.ifish.entity.DeviceUserId; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * @ClassName: DeviceUserDaoImpl + * @Description: TODO + * @author ggw + * + */ + +@Repository +public class DeviceUserDaoImpl extends HibernateBaseDao implements DeviceUserDao { + + @Override + protected Class getEntityClass() { + return DeviceUser.class; + } + + @Override + public void removeAll(List list) { + for (DeviceUser deviceUser:list) { + delete(deviceUser); + } + } + + /** + * 查询用户的设备数量 + * @param userId + * @return + */ + @Override + public int getDeviceNumById(Integer userId) { + String sql = "select count(*) from tbl_device_user where user_id=?"; + int deviceNum = ((BigInteger)this.getSession().createSQLQuery(sql).setInteger(0, userId).uniqueResult()).intValue(); + return deviceNum; + } + +} diff --git a/src/main/java/com/ifish/daoImpl/GoldControlDaoImpl.java b/src/main/java/com/ifish/daoImpl/GoldControlDaoImpl.java new file mode 100644 index 0000000..42fcc77 --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/GoldControlDaoImpl.java @@ -0,0 +1,23 @@ +package com.ifish.daoImpl; + +import org.springframework.stereotype.Repository; + +import com.ifish.dao.GoldControlDao; +import com.ifish.entity.GoldControl; +import com.ifish.entity.GoldControlId; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * 金币控制信息 + * @author Administrator + * + */ +@Repository +public class GoldControlDaoImpl extends HibernateBaseDao implements GoldControlDao{ + + @Override + protected Class getEntityClass() { + return GoldControl.class; + } + +} diff --git a/src/main/java/com/ifish/daoImpl/GoldExpendRecordDaoImpl.java b/src/main/java/com/ifish/daoImpl/GoldExpendRecordDaoImpl.java new file mode 100644 index 0000000..e0882be --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/GoldExpendRecordDaoImpl.java @@ -0,0 +1,22 @@ +package com.ifish.daoImpl; + +import org.springframework.stereotype.Repository; + +import com.ifish.dao.GoldExpendRecordDao; +import com.ifish.entity.GoldExpendRecord; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * 金币消耗记录 + * @author Administrator + * + */ +@Repository +public class GoldExpendRecordDaoImpl extends HibernateBaseDao implements GoldExpendRecordDao { + + @Override + protected Class getEntityClass() { + return GoldExpendRecord.class; + } + +} diff --git a/src/main/java/com/ifish/daoImpl/GoldGetRecordDaoImpl.java b/src/main/java/com/ifish/daoImpl/GoldGetRecordDaoImpl.java new file mode 100644 index 0000000..c940a05 --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/GoldGetRecordDaoImpl.java @@ -0,0 +1,31 @@ +package com.ifish.daoImpl; + +import java.math.BigDecimal; + +import org.springframework.stereotype.Repository; + +import com.ifish.dao.GoldGetRecordDao; +import com.ifish.entity.GoldGetRecord; +import com.ifish.enums.GoldGetTypeEnum; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * 金币获取记录 + * @author Administrator + * + */ +@Repository +public class GoldGetRecordDaoImpl extends HibernateBaseDao implements GoldGetRecordDao { + + @Override + protected Class getEntityClass() { + return GoldGetRecord.class; + } + + @Override + public BigDecimal getQuestionPayTourGoldValue(Integer userId) { + String sql = "select sum(get_value) from tbl_gold_get_record where get_type=? and user_id=?"; + return (BigDecimal) getSession().createSQLQuery(sql).setString(0, GoldGetTypeEnum.liveRoomPayTour.getKey()).setInteger(1, userId).uniqueResult(); + } + +} diff --git a/src/main/java/com/ifish/daoImpl/GoldRuleImpl.java b/src/main/java/com/ifish/daoImpl/GoldRuleImpl.java new file mode 100644 index 0000000..237c32a --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/GoldRuleImpl.java @@ -0,0 +1,23 @@ +package com.ifish.daoImpl; + +import org.springframework.stereotype.Repository; + +import com.ifish.dao.GoldRuleDao; +import com.ifish.entity.GoldTask; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * 金币获取规则 + * @author Administrator + * + */ +@Repository +public class GoldRuleImpl extends HibernateBaseDao implements GoldRuleDao { + + @Override + protected Class getEntityClass() { + return GoldTask.class; + } + + +} diff --git a/src/main/java/com/ifish/daoImpl/GradeControlDaoImpl.java b/src/main/java/com/ifish/daoImpl/GradeControlDaoImpl.java new file mode 100644 index 0000000..46753f4 --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/GradeControlDaoImpl.java @@ -0,0 +1,23 @@ +package com.ifish.daoImpl; + +import org.springframework.stereotype.Repository; + +import com.ifish.dao.GradeControlDao; +import com.ifish.entity.GradeControl; +import com.ifish.entity.GradeControlId; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * 等级信息控制 + * @author Administrator + * + */ +@Repository +public class GradeControlDaoImpl extends HibernateBaseDao implements GradeControlDao { + + @Override + protected Class getEntityClass() { + return GradeControl.class; + } + +} diff --git a/src/main/java/com/ifish/daoImpl/GradeDaoImpl.java b/src/main/java/com/ifish/daoImpl/GradeDaoImpl.java new file mode 100644 index 0000000..1fe43bc --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/GradeDaoImpl.java @@ -0,0 +1,24 @@ +package com.ifish.daoImpl; + +import org.springframework.stereotype.Repository; + +import com.ifish.dao.GradeDao; +import com.ifish.entity.Grade; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * @ClassName: GradeDaoImpl + * @Description: TODO + * @author ggw + * + */ + +@Repository +public class GradeDaoImpl extends HibernateBaseDao implements GradeDao { + + @Override + protected Class getEntityClass() { + return Grade.class; + } + +} diff --git a/src/main/java/com/ifish/daoImpl/GradeRecordDaoImpl.java b/src/main/java/com/ifish/daoImpl/GradeRecordDaoImpl.java new file mode 100644 index 0000000..814ae18 --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/GradeRecordDaoImpl.java @@ -0,0 +1,24 @@ +package com.ifish.daoImpl; + +import org.springframework.stereotype.Repository; + +import com.ifish.dao.GradeRecordDao; +import com.ifish.entity.GradeRecord; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * @ClassName: GradeRecordDaoImpl + * @Description: TODO + * @author ggw + * + */ + +@Repository +public class GradeRecordDaoImpl extends HibernateBaseDao implements GradeRecordDao { + + @Override + protected Class getEntityClass() { + return GradeRecord.class; + } + +} diff --git a/src/main/java/com/ifish/daoImpl/GradeRuleImpl.java b/src/main/java/com/ifish/daoImpl/GradeRuleImpl.java new file mode 100644 index 0000000..ee7a7ea --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/GradeRuleImpl.java @@ -0,0 +1,24 @@ +package com.ifish.daoImpl; + +import org.springframework.stereotype.Repository; + +import com.ifish.dao.GradeRuleDao; +import com.ifish.entity.GradeTask; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * @ClassName: GradeRuleImpl + * @Description: TODO + * @author ggw + * + */ + +@Repository +public class GradeRuleImpl extends HibernateBaseDao implements GradeRuleDao { + + @Override + protected Class getEntityClass() { + return GradeTask.class; + } + +} diff --git a/src/main/java/com/ifish/daoImpl/HardwareTypeDaoImpl.java b/src/main/java/com/ifish/daoImpl/HardwareTypeDaoImpl.java new file mode 100644 index 0000000..43d1082 --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/HardwareTypeDaoImpl.java @@ -0,0 +1,25 @@ +package com.ifish.daoImpl; + +import org.springframework.stereotype.Repository; + +import com.ifish.dao.HardwareTypeDao; +import com.ifish.entity.HardwareType; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * @ClassName: HardwareTypeDaoImpl + * @Description: TODO + * @author ggw + * + */ + +@Repository +public class HardwareTypeDaoImpl extends HibernateBaseDao implements HardwareTypeDao { + + + @Override + protected Class getEntityClass() { + return HardwareType.class; + } + +} diff --git a/src/main/java/com/ifish/daoImpl/IfishDoctorDaoImpl.java b/src/main/java/com/ifish/daoImpl/IfishDoctorDaoImpl.java new file mode 100644 index 0000000..2607cd8 --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/IfishDoctorDaoImpl.java @@ -0,0 +1,24 @@ +package com.ifish.daoImpl; + +import org.springframework.stereotype.Repository; + +import com.ifish.dao.IfishDoctorDao; +import com.ifish.entity.IfishDoctor; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * @ClassName: IfishDoctorDaoImpl + * @Description: TODO + * @author ggw + * + */ + +@Repository +public class IfishDoctorDaoImpl extends HibernateBaseDao implements IfishDoctorDao { + + @Override + protected Class getEntityClass() { + return IfishDoctor.class; + } + +} diff --git a/src/main/java/com/ifish/daoImpl/IfishGoodsDaoImpl.java b/src/main/java/com/ifish/daoImpl/IfishGoodsDaoImpl.java new file mode 100644 index 0000000..61d3ed8 --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/IfishGoodsDaoImpl.java @@ -0,0 +1,22 @@ +package com.ifish.daoImpl; + +import org.springframework.stereotype.Repository; + +import com.ifish.dao.IfishGoodsDao; +import com.ifish.entity.IfishGoods; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * 商品管理dao + * @author Administrator + * + */ +@Repository +public class IfishGoodsDaoImpl extends HibernateBaseDao implements IfishGoodsDao { + + @Override + protected Class getEntityClass() { + return IfishGoods.class; + } + +} diff --git a/src/main/java/com/ifish/daoImpl/IfishShopDaoImpl.java b/src/main/java/com/ifish/daoImpl/IfishShopDaoImpl.java new file mode 100644 index 0000000..b7a4e23 --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/IfishShopDaoImpl.java @@ -0,0 +1,22 @@ +package com.ifish.daoImpl; + +import org.springframework.stereotype.Repository; + +import com.ifish.dao.IfishShopDao; +import com.ifish.entity.IfishShop; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * 店铺管理dao + * @author Administrator + * + */ +@Repository +public class IfishShopDaoImpl extends HibernateBaseDao implements IfishShopDao { + + @Override + protected Class getEntityClass() { + return IfishShop.class; + } + +} diff --git a/src/main/java/com/ifish/daoImpl/InformationDaoImpl.java b/src/main/java/com/ifish/daoImpl/InformationDaoImpl.java new file mode 100644 index 0000000..a67c5f0 --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/InformationDaoImpl.java @@ -0,0 +1,24 @@ +package com.ifish.daoImpl; + +import org.springframework.stereotype.Repository; + +import com.ifish.dao.InformationDao; +import com.ifish.entity.Information; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * @ClassName: InformationDaoImpl + * @Description: TODO + * @author ggw + * + */ + +@Repository("informationDao") +public class InformationDaoImpl extends HibernateBaseDao implements InformationDao { + + @Override + protected Class getEntityClass() { + return Information.class; + } + +} diff --git a/src/main/java/com/ifish/daoImpl/InformationStatsDaoImpl.java b/src/main/java/com/ifish/daoImpl/InformationStatsDaoImpl.java new file mode 100644 index 0000000..610f27d --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/InformationStatsDaoImpl.java @@ -0,0 +1,22 @@ +package com.ifish.daoImpl; + +import org.springframework.stereotype.Repository; + +import com.ifish.dao.InformationStatsDao; +import com.ifish.entity.InformationStats; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * 资讯数据统计 + * @author Administrator + * + */ +@Repository +public class InformationStatsDaoImpl extends HibernateBaseDao implements InformationStatsDao { + + @Override + protected Class getEntityClass() { + return InformationStats.class; + } + +} diff --git a/src/main/java/com/ifish/daoImpl/LiveBannerImpl.java b/src/main/java/com/ifish/daoImpl/LiveBannerImpl.java new file mode 100644 index 0000000..93e00c9 --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/LiveBannerImpl.java @@ -0,0 +1,24 @@ +package com.ifish.daoImpl; + +import org.springframework.stereotype.Repository; + +import com.ifish.dao.LiveBannerDao; +import com.ifish.entity.LiveBanner; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * @ClassName: LiveBannerImpl + * @Description: TODO + * @author ggw + * + */ + +@Repository +public class LiveBannerImpl extends HibernateBaseDao implements LiveBannerDao { + + @Override + protected Class getEntityClass() { + return LiveBanner.class; + } + +} diff --git a/src/main/java/com/ifish/daoImpl/LiveMessageDaoImpl.java b/src/main/java/com/ifish/daoImpl/LiveMessageDaoImpl.java new file mode 100644 index 0000000..0597c45 --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/LiveMessageDaoImpl.java @@ -0,0 +1,32 @@ +package com.ifish.daoImpl; + +import java.math.BigInteger; + +import org.springframework.stereotype.Repository; + +import com.ifish.dao.LiveMessageDao; +import com.ifish.entity.LiveMessage; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * @ClassName: LiveMessageDaoImpl + * @Description: TODO + * @author ggw + * + */ + +@Repository +public class LiveMessageDaoImpl extends HibernateBaseDao implements LiveMessageDao { + + @Override + protected Class getEntityClass() { + return LiveMessage.class; + } + + @Override + public int getLiveMessageCount(Integer roomId) { + String sql = "SELECT COUNT(*) FROM tbl_live_message WHERE room_id=?"; + return ((BigInteger)getSession().createSQLQuery(sql).setInteger(0, roomId).uniqueResult()).intValue(); + } + +} diff --git a/src/main/java/com/ifish/daoImpl/LiveRoomImpl.java b/src/main/java/com/ifish/daoImpl/LiveRoomImpl.java new file mode 100644 index 0000000..a590e9b --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/LiveRoomImpl.java @@ -0,0 +1,203 @@ +package com.ifish.daoImpl; + +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.List; + +import org.hibernate.SQLQuery; +import org.hibernate.transform.Transformers; +import org.springframework.stereotype.Repository; + +import com.ifish.dao.LiveRoomDao; +import com.ifish.dto.LiveRoomInfoDto; +import com.ifish.entity.LiveRoom; +import com.ifish.enums.BooleanEnum; +import com.ifish.enums.RoomStatusEnum; +import com.ifish.hibernate.HibernateBaseDao; +import com.ifish.hibernate.Pagination; + +/** + * @ClassName: LiveRoomImpl + * @Description: TODO + * @author ggw + * + */ + +@Repository +public class LiveRoomImpl extends HibernateBaseDao implements LiveRoomDao { + + @Override + protected Class getEntityClass() { + return LiveRoom.class; + } + + @SuppressWarnings("unchecked") + @Override + public List findByDistance(Double longitude,Double latitude) { + if(longitude!=null && latitude!=null){ + String sql = "select l.room_id AS roomId,u.user_id AS userId,u.user_type AS userType,u.nick_name AS nickName,u.user_img AS userImg,u.login_time AS loginTime,c.camera_id AS cameraId,l.room_name AS roomName,l.room_desc AS roomDesc,l.popularity_value AS popularityValue,(TO_DAYS(NOW())-TO_DAYS(l.create_time)) AS numberDays,round(6378.138*2*asin(sqrt(pow(sin((?*pi()/180-u.latitude*pi()/180)/2),2)+cos(?*pi()/180)*cos(u.latitude*pi()/180)* pow(sin((?*pi()/180-u.longitude*pi()/180)/2),2)))*1000) AS distance from tbl_user u LEFT JOIN tbl_camera_user c ON u.user_id=c.user_id LEFT JOIN tbl_live_room l on c.user_id=l.user_id WHERE c.is_live=? AND l.room_status=? HAVING distance IS NOT NULL ORDER BY distance ASC LIMIT 5"; + return this.getSession().createSQLQuery(sql) + .setParameter(0, latitude) + .setParameter(1, latitude) + .setParameter(2, longitude) + .setParameter(3, BooleanEnum.YES.getKey()) + .setParameter(4, RoomStatusEnum.status1.getKey()) + .setResultTransformer(Transformers.aliasToBean(LiveRoomInfoDto.class)) + .list(); + } + else{ + return new ArrayList(); + } + } + + @SuppressWarnings("unchecked") + @Override + public List findByBrowse(Integer userId) { + if(userId!=null){ + String sql = "select l.room_id AS roomId,u.user_id AS userId,u.user_type AS userType,u.nick_name AS nickName,u.user_img AS userImg,u.login_time AS loginTime,c.camera_id AS cameraId,l.room_name AS roomName,l.room_desc AS roomDesc,l.popularity_value AS popularityValue,(TO_DAYS(NOW())-TO_DAYS(l.create_time)) AS numberDays from tbl_browse_room b LEFT JOIN tbl_live_room l ON b.room_id=l.room_id LEFT JOIN tbl_camera_user c ON c.user_id=l.user_id LEFT JOIN tbl_user u ON c.user_id=u.user_id where b.user_id=? AND c.is_live=? AND l.room_status=? ORDER BY b.update_time DESC LIMIT 5"; + return this.getSession().createSQLQuery(sql) + .setParameter(0, userId) + .setParameter(1, BooleanEnum.YES.getKey()) + .setParameter(2, RoomStatusEnum.status1.getKey()) + .setResultTransformer(Transformers.aliasToBean(LiveRoomInfoDto.class)) + .list(); + } + else{ + return new ArrayList(); + } + } + + @SuppressWarnings("unchecked") + @Override + public List findByPopularityValue() { + String sql = "select l.room_id AS roomId,u.user_id AS userId,u.user_type AS userType,u.nick_name AS nickName,u.user_img AS userImg,u.login_time AS loginTime,c.camera_id AS cameraId,l.room_name AS roomName,l.room_desc AS roomDesc,l.popularity_value AS popularityValue,(TO_DAYS(NOW())-TO_DAYS(l.create_time)) AS numberDays from tbl_user u LEFT JOIN tbl_camera_user c ON u.user_id=c.user_id LEFT JOIN tbl_live_room l ON u.user_id=l.user_id WHERE c.is_live=? AND l.room_status=? ORDER BY l.popularity_value DESC LIMIT 5"; + return this.getSession().createSQLQuery(sql) + .setParameter(0, BooleanEnum.YES.getKey()) + .setParameter(1, RoomStatusEnum.status1.getKey()) + .setResultTransformer(Transformers.aliasToBean(LiveRoomInfoDto.class)) + .list(); + } + + @SuppressWarnings("unchecked") + @Override + public Pagination findByTime(Integer firstResult,Integer pageSize,String orders) { + //综合数据 + Integer length = 0; + String[] strOrder = null; + if(orders!=null && orders.length()>0){ + strOrder = orders.split(","); + length = strOrder.length; + } + //总条数 + String countSql = "select count(*) from tbl_user u LEFT JOIN tbl_camera_user c ON u.user_id=c.user_id LEFT JOIN tbl_live_room l ON u.user_id=l.user_id WHERE ### c.is_live=? AND l.room_status=? ORDER BY l.create_time DESC"; + //分页数据 + String sql = "select l.room_id AS roomId,u.user_id AS userId,u.user_type AS userType,u.nick_name AS nickName,u.user_img AS userImg,u.login_time AS loginTime,l.create_time AS createTime,c.camera_id AS cameraId,l.room_name AS roomName,l.room_desc AS roomDesc,l.popularity_value AS popularityValue,(TO_DAYS(NOW())-TO_DAYS(l.create_time)) AS numberDays from tbl_user u LEFT JOIN tbl_camera_user c ON u.user_id=c.user_id LEFT JOIN tbl_live_room l ON u.user_id=l.user_id WHERE ### c.is_live=? AND l.room_status=? ORDER BY l.create_time DESC LIMIT ?,?"; + //查询条件去除综合数据 + Object[] intOrder = new Integer[length]; + StringBuilder pingjie = new StringBuilder(""); + if(length>0){ + pingjie.append("l.room_id NOT IN ("); + for (int i = 0; i < length; i++) { + if(i==0){ + pingjie.append("?"); + } + else{ + pingjie.append(",?"); + } + intOrder[i] = Integer.valueOf(strOrder[i]); + } + pingjie.append(") AND"); + } + countSql = countSql.replaceAll("###", pingjie.toString()); + sql = sql.replaceAll("###", pingjie.toString()); + //查询total + SQLQuery countQuery = this.getSession().createSQLQuery(countSql); + if(length>0){ + for (int i = 0; i < length; i++) { + countQuery.setParameter(i, intOrder[i]); + } + countQuery.setParameter(length, BooleanEnum.YES.getKey()); + countQuery.setParameter((length+1), RoomStatusEnum.status1.getKey()); + } + else{ + countQuery.setParameter(0, BooleanEnum.YES.getKey()); + countQuery.setParameter(1, RoomStatusEnum.status1.getKey()); + } + int totalCount = ((BigInteger)countQuery.uniqueResult()).intValue(); + //分页数据 + SQLQuery query = this.getSession().createSQLQuery(sql); + if(length>0){ + for (int i = 0; i < length; i++) { + query.setParameter(i, intOrder[i]); + } + query.setParameter(length, BooleanEnum.YES.getKey()); + query.setParameter((length+1), RoomStatusEnum.status1.getKey()); + query.setParameter((length+2), firstResult); + query.setParameter((length+3), pageSize); + } + else{ + query.setParameter(0, BooleanEnum.YES.getKey()); + query.setParameter(1, RoomStatusEnum.status1.getKey()); + query.setParameter(2, firstResult); + query.setParameter(3, pageSize); + } + List list = query.setResultTransformer(Transformers.aliasToBean(LiveRoomInfoDto.class)).list(); + //分页封装 + Pagination page = new Pagination(); + page.setTotalCount(totalCount); + page.setList(list); + return page; + + } + + @SuppressWarnings("unchecked") + @Override + public Pagination findByPopularityValue(Integer firstResult,Integer pageSize) { + //总条数 + String countSql = "select count(*) from tbl_user u LEFT JOIN tbl_camera_user c ON u.user_id=c.user_id LEFT JOIN tbl_live_room l ON u.user_id=l.user_id WHERE c.is_live=? AND l.room_status=? ORDER BY l.popularity_value DESC"; + int totalCount = ((BigInteger) this.getSession().createSQLQuery(countSql) + .setParameter(0, BooleanEnum.YES.getKey()) + .setParameter(1, RoomStatusEnum.status1.getKey()) + .uniqueResult()).intValue(); + String sql = "select l.room_id AS roomId,u.user_id AS userId,u.user_type AS userType,u.nick_name AS nickName,u.user_img AS userImg,u.login_time AS loginTime,c.camera_id AS cameraId,l.room_name AS roomName,l.room_desc AS roomDesc,l.popularity_value AS popularityValue,(TO_DAYS(NOW())-TO_DAYS(l.create_time)) AS numberDays from tbl_user u LEFT JOIN tbl_camera_user c ON u.user_id=c.user_id LEFT JOIN tbl_live_room l ON u.user_id=l.user_id WHERE c.is_live=? AND l.room_status=? ORDER BY l.popularity_value DESC LIMIT ?,?"; + //分页数据 + List list = this.getSession().createSQLQuery(sql) + .setParameter(0, BooleanEnum.YES.getKey()) + .setParameter(1, RoomStatusEnum.status1.getKey()) + .setParameter(2, firstResult) + .setParameter(3, pageSize) + .setResultTransformer(Transformers.aliasToBean(LiveRoomInfoDto.class)) + .list(); + //分页封装 + Pagination page = new Pagination(); + page.setTotalCount(totalCount); + page.setList(list); + return page; + } + + @SuppressWarnings("unchecked") + @Override + public Pagination getLiveRoomsByTuijian(Integer firstResult, Integer pageSize) { + //总条数 + String countSql = "select count(*) from tbl_user u LEFT JOIN tbl_camera_user c ON u.user_id=c.user_id LEFT JOIN tbl_live_room l ON u.user_id=l.user_id WHERE c.is_live=? AND l.room_status=? ORDER BY l.popularity_value DESC"; + int totalCount = ((BigInteger) this.getSession().createSQLQuery(countSql) + .setParameter(0, BooleanEnum.YES.getKey()) + .setParameter(1, RoomStatusEnum.status1.getKey()) + .uniqueResult()).intValue(); + String sql = "select l.room_id AS roomId,u.user_id AS userId,u.user_type AS userType,u.nick_name AS nickName,u.user_img AS userImg,u.login_time AS loginTime,c.camera_id AS cameraId,l.room_name AS roomName,l.room_desc AS roomDesc,l.popularity_value AS popularityValue,(TO_DAYS(NOW())-TO_DAYS(l.create_time)) AS numberDays from tbl_user u LEFT JOIN tbl_camera_user c ON u.user_id=c.user_id LEFT JOIN tbl_live_room l ON u.user_id=l.user_id WHERE l.is_tuijian='1' AND c.is_live=? AND l.room_status=? ORDER BY l.tuijian_num ASC LIMIT ?,?"; + //分页数据 + List list = this.getSession().createSQLQuery(sql) + .setParameter(0, BooleanEnum.YES.getKey()) + .setParameter(1, RoomStatusEnum.status1.getKey()) + .setParameter(2, firstResult) + .setParameter(3, pageSize) + .setResultTransformer(Transformers.aliasToBean(LiveRoomInfoDto.class)) + .list(); + //分页封装 + Pagination page = new Pagination(); + page.setTotalCount(totalCount); + page.setList(list); + return page; + } + +} diff --git a/src/main/java/com/ifish/daoImpl/LiveRoomZanDaoImpl.java b/src/main/java/com/ifish/daoImpl/LiveRoomZanDaoImpl.java new file mode 100644 index 0000000..f9c239c --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/LiveRoomZanDaoImpl.java @@ -0,0 +1,31 @@ +package com.ifish.daoImpl; + +import java.math.BigInteger; + +import org.springframework.stereotype.Repository; + +import com.ifish.dao.LiveRoomZanDao; +import com.ifish.entity.LiveRoomZan; +import com.ifish.entity.LiveRoomZanId; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * 直播间点赞 + * @author Administrator + * + */ +@Repository +public class LiveRoomZanDaoImpl extends HibernateBaseDao implements LiveRoomZanDao { + + @Override + protected Class getEntityClass() { + return LiveRoomZan.class; + } + + @Override + public Integer getZanNum(Integer roomId) { + String sql = "select count(*) from tbl_live_room_zan where room_id=?"; + return ((BigInteger)getSession().createSQLQuery(sql).setInteger(0, roomId).uniqueResult()).intValue(); + } + +} diff --git a/src/main/java/com/ifish/daoImpl/LookReportDaoImpl.java b/src/main/java/com/ifish/daoImpl/LookReportDaoImpl.java new file mode 100644 index 0000000..f93e650 --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/LookReportDaoImpl.java @@ -0,0 +1,24 @@ +package com.ifish.daoImpl; + +import org.springframework.stereotype.Repository; + +import com.ifish.dao.LookReportDao; +import com.ifish.entity.LookReport; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * @ClassName: LookReportDaoImpl + * @Description: TODO + * @author ggw + * + */ + +@Repository +public class LookReportDaoImpl extends HibernateBaseDao implements LookReportDao { + + @Override + protected Class getEntityClass() { + return LookReport.class; + } + +} diff --git a/src/main/java/com/ifish/daoImpl/PushListDaoImpl.java b/src/main/java/com/ifish/daoImpl/PushListDaoImpl.java new file mode 100644 index 0000000..508c7cd --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/PushListDaoImpl.java @@ -0,0 +1,51 @@ +package com.ifish.daoImpl; + +import java.util.ArrayList; +import java.util.List; + +import org.hibernate.criterion.Criterion; +import org.hibernate.criterion.Order; +import org.hibernate.criterion.Restrictions; +import org.springframework.stereotype.Repository; + +import com.ifish.dao.PushListDao; +import com.ifish.entity.PushList; +import com.ifish.enums.PushTypeEnum; +import com.ifish.hibernate.HibernateBaseDao; +import com.ifish.hibernate.Pagination; + +/** + * @ClassName: PushListDaoImpl + * @Description: TODO + * @author ggw + * + */ + +@Repository +public class PushListDaoImpl extends HibernateBaseDao implements PushListDao { + + @Override + protected Class getEntityClass() { + return PushList.class; + } + + @Override + public Pagination findByCriteria(Integer pushId,Integer userId,Integer firstResult, Integer pageSize) { + //查询条件 + List queryList = new ArrayList(); + if(pushId!=null){ + Criterion criterion = Restrictions.gt("pushId", pushId); + queryList.add(criterion); + } + if(userId!=null){ + Criterion criterion = Restrictions.or(Restrictions.eq("userId", userId),Restrictions.eq("pushType", PushTypeEnum.all_push.getKey())); + queryList.add(criterion); + } + else{ + Criterion criterion = Restrictions.eq("pushType", PushTypeEnum.all_push.getKey()); + queryList.add(criterion); + } + return this.findByCriteria(firstResult, pageSize,Order.desc("pushId"), queryList.toArray(new Criterion[queryList.size()])); + } + +} diff --git a/src/main/java/com/ifish/daoImpl/QuestionsFeedbackDaoImpl.java b/src/main/java/com/ifish/daoImpl/QuestionsFeedbackDaoImpl.java new file mode 100644 index 0000000..8542acc --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/QuestionsFeedbackDaoImpl.java @@ -0,0 +1,25 @@ +package com.ifish.daoImpl; + +import org.springframework.stereotype.Repository; + +import com.ifish.dao.QuestionsFeedbackDao; +import com.ifish.entity.QuestionsFeedback; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * @ClassName: QuestionsFeedbackDaoImpl + * @Description: TODO + * @author ggw + * + */ + +@Repository +public class QuestionsFeedbackDaoImpl extends HibernateBaseDao implements QuestionsFeedbackDao { + + + @Override + protected Class getEntityClass() { + return QuestionsFeedback.class; + } + +} diff --git a/src/main/java/com/ifish/daoImpl/ShopsInfoDaoImpl.java b/src/main/java/com/ifish/daoImpl/ShopsInfoDaoImpl.java new file mode 100644 index 0000000..56953a7 --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/ShopsInfoDaoImpl.java @@ -0,0 +1,78 @@ +package com.ifish.daoImpl; + +import java.math.BigInteger; +import java.util.List; + +import org.hibernate.transform.Transformers; +import org.springframework.stereotype.Repository; + +import com.ifish.dao.ShopsInfoDao; +import com.ifish.dto.ShopsListDto; +import com.ifish.entity.ShopsInfo; +import com.ifish.enums.BooleanEnum; +import com.ifish.enums.ShopsStatusEnum; +import com.ifish.hibernate.HibernateBaseDao; +import com.ifish.hibernate.Pagination; + +/** + * @ClassName: ShopsInfoDaoImpl + * @Description: TODO + * @author ggw + * + */ + +@Repository +public class ShopsInfoDaoImpl extends HibernateBaseDao implements ShopsInfoDao { + + @Override + protected Class getEntityClass() { + return ShopsInfo.class; + } + + @SuppressWarnings("unchecked") + @Override + public Pagination findByDistance(Double longitude,Double latitude,Integer firstResult, Integer pageSize) { + //总条数 + String countSql = "select count(*) from tbl_shops_info where status=?"; + int totalCount = ((BigInteger) this.getSession().createSQLQuery(countSql) + .setParameter(0, ShopsStatusEnum.status1.getKey()) + .uniqueResult()).intValue(); + String sql ="select s.shops_id shopsId,s.is_ping_bi as isPingBi,s.user_id AS userId,u.user_img AS userImg,u.nick_name AS userName,s.shops_name AS shopsName,s.shops_phone AS shopsPhone,s.shops_province AS shopsProvince,s.shops_city AS shopsCity,s.shops_area AS shopsArea,s.shops_address AS shopsAddress,s.picture4 AS picture4,s.remark AS remark,s.weixin_code AS weixinCode,s.shop_link AS shopLink,ifnull(round(6378.138*2*asin(sqrt(pow(sin((?*pi()/180-u.latitude*pi()/180)/2),2)+cos(?*pi()/180)*cos(u.latitude*pi()/180)*pow(sin((?*pi()/180-u.longitude*pi()/180)/2),2)))*1000),99999999999) AS distance from tbl_shops_info s LEFT JOIN tbl_user u ON s.user_id=u.user_id where s.status=? and app_show=? ORDER BY distance ASC LIMIT ?,?"; + //分页数据 + List list = this.getSession().createSQLQuery(sql) + .setParameter(0, latitude) + .setParameter(1, latitude) + .setParameter(2, longitude) + .setParameter(3, ShopsStatusEnum.status1.getKey()) + .setParameter(4, BooleanEnum.YES.getKey()) + .setParameter(5, firstResult) + .setParameter(6, pageSize) + .setResultTransformer(Transformers.aliasToBean(ShopsListDto.class)) + .list(); + String pingbiMsg = "请通过下方咨询联系我"; + for (ShopsListDto shopsList : list) { + if(shopsList.getIsPingBi().equals(BooleanEnum.YES.getKey())){ + shopsList.setShopsAddress(""); + shopsList.setShopsPhone(pingbiMsg); + shopsList.setWeixinCode(pingbiMsg); + shopsList.setShopLink(pingbiMsg); + } + } + //分页封装 + Pagination page = new Pagination(); + page.setTotalCount(totalCount); + page.setList(list); + return page; + } + + @Override + @SuppressWarnings("unchecked") + public List getShopsUserIdByRand(Integer userId) { + String sql = "SELECT user_id FROM tbl_shops_info WHERE status='1' AND user_id!=? AND user_id!=12 AND app_show='1' ORDER BY RAND() LIMIT 9"; + List list = this.getSession().createSQLQuery(sql).setParameter(0, userId).list(); + //固定发送给小陈 + list.add(12); + return list; + } + +} diff --git a/src/main/java/com/ifish/daoImpl/ShopsUserInfoDaoImpl.java b/src/main/java/com/ifish/daoImpl/ShopsUserInfoDaoImpl.java new file mode 100644 index 0000000..0cfa640 --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/ShopsUserInfoDaoImpl.java @@ -0,0 +1,23 @@ +package com.ifish.daoImpl; + +import org.springframework.stereotype.Repository; + +import com.ifish.dao.ShopsUserInfoDao; +import com.ifish.entity.ShopsUserInfo; +import com.ifish.entity.ShopsUserInfoId; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * 商家会员信息 + * @author Administrator + * + */ +@Repository +public class ShopsUserInfoDaoImpl extends HibernateBaseDao implements ShopsUserInfoDao{ + + @Override + protected Class getEntityClass() { + return ShopsUserInfo.class; + } + +} \ No newline at end of file diff --git a/src/main/java/com/ifish/daoImpl/UeditorDaoImpl.java b/src/main/java/com/ifish/daoImpl/UeditorDaoImpl.java new file mode 100644 index 0000000..470e51b --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/UeditorDaoImpl.java @@ -0,0 +1,24 @@ +package com.ifish.daoImpl; + +import org.springframework.stereotype.Repository; + +import com.ifish.dao.UeditorDao; +import com.ifish.entity.Ueditor; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * @ClassName: UeditorDaoImpl + * @Description: TODO + * @author ggw + * + */ + +@Repository() +public class UeditorDaoImpl extends HibernateBaseDao implements UeditorDao { + + @Override + protected Class getEntityClass() { + return Ueditor.class; + } + +} diff --git a/src/main/java/com/ifish/daoImpl/UserActivityDaoImpl.java b/src/main/java/com/ifish/daoImpl/UserActivityDaoImpl.java new file mode 100644 index 0000000..3cda09d --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/UserActivityDaoImpl.java @@ -0,0 +1,22 @@ +package com.ifish.daoImpl; + +import org.springframework.stereotype.Repository; + +import com.ifish.dao.UserActivityDao; +import com.ifish.entity.UserActivity; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * 用户动态 + * @author Administrator + * + */ +@Repository +public class UserActivityDaoImpl extends HibernateBaseDaoimplements UserActivityDao { + + @Override + protected Class getEntityClass() { + return UserActivity.class; + } + +} diff --git a/src/main/java/com/ifish/daoImpl/UserAssetDaoImpl.java b/src/main/java/com/ifish/daoImpl/UserAssetDaoImpl.java new file mode 100644 index 0000000..5c13948 --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/UserAssetDaoImpl.java @@ -0,0 +1,17 @@ +package com.ifish.daoImpl; + +import org.springframework.stereotype.Repository; + +import com.ifish.dao.UserAssetDao; +import com.ifish.entity.UserAsset; +import com.ifish.hibernate.HibernateBaseDao; + +@Repository +public class UserAssetDaoImpl extends HibernateBaseDao implements UserAssetDao { + + @Override + protected Class getEntityClass() { + return UserAsset.class; + } + +} diff --git a/src/main/java/com/ifish/daoImpl/UserDaoImpl.java b/src/main/java/com/ifish/daoImpl/UserDaoImpl.java new file mode 100644 index 0000000..7e2b116 --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/UserDaoImpl.java @@ -0,0 +1,66 @@ +package com.ifish.daoImpl; + +import java.util.List; + +import org.hibernate.Query; +import org.hibernate.transform.Transformers; +import org.springframework.stereotype.Repository; + +import com.ifish.dao.UserDao; +import com.ifish.dto.ShopsLookUserDto; +import com.ifish.entity.User; +import com.ifish.enums.BooleanEnum; +import com.ifish.hibernate.HibernateBaseDao; +import com.ifish.hibernate.Pagination; + +/** + * @ClassName: UserDaoImpl + * @Description: TODO + * @author ggw + * + */ + +@Repository +public class UserDaoImpl extends HibernateBaseDao implements UserDao { + + @Override + protected Class getEntityClass() { + return User.class; + } + + + @Override + public User update(User user) { + getSession().update(user); + return user; + } + + @SuppressWarnings("unchecked") + @Override + public Pagination findByCriteria(Integer shopsUserId,Integer firstResult, Integer pageSize) { + String sql = "select u.user_id as userId,u.nick_name as nickName,c.camera_id as cameraId,u.user_img as userImg from tbl_user u LEFT JOIN tbl_camera_user c ON u.user_id=c.user_id where c.is_look=1 and shops_user_id="+shopsUserId; + List list = this.getSession().createSQLQuery(sql).setResultTransformer(Transformers.aliasToBean(ShopsLookUserDto.class)).list(); + Pagination page = new Pagination(); + page.setTotalCount(list.size()); + page.setList(list); + return page; + } + + + @Override + public int executeLoginUpdate(Integer userId,String loginType) { + String sql = "update tbl_user set login_count=if(login_count is null,1,login_count+1),login_type=?,login_time=current_timestamp() where user_id=?"; + Query query = this.getSession().createSQLQuery(sql).setString(0, loginType).setInteger(1, userId); + return query.executeUpdate(); + } + + + @SuppressWarnings("unchecked") + @Override + public List getUserIds(Integer userId,Integer firstResult, int maxResults) { + String sql = "select user_id from tbl_user where user_id!=? and is_register_netease=? limit ?,?"; + List list = this.getSession().createSQLQuery(sql).setInteger(0, userId).setString(1, BooleanEnum.YES.getKey()).setInteger(2, firstResult).setInteger(3,maxResults).list(); + return list; + } + +} diff --git a/src/main/java/com/ifish/daoImpl/VenderListDaoImpl.java b/src/main/java/com/ifish/daoImpl/VenderListDaoImpl.java new file mode 100644 index 0000000..bfe6445 --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/VenderListDaoImpl.java @@ -0,0 +1,41 @@ +package com.ifish.daoImpl; + +import org.hibernate.criterion.Criterion; +import org.hibernate.criterion.Restrictions; +import org.springframework.stereotype.Repository; + +import com.ifish.dao.VenderListDao; +import com.ifish.entity.VenderList; +import com.ifish.enums.BooleanEnum; +import com.ifish.hibernate.HibernateBaseDao; +import com.ifish.hibernate.Pagination; + +/** + * @ClassName: VenderDaoImpl + * @Description: TODO + * @author ggw + * + */ + +@Repository +public class VenderListDaoImpl extends HibernateBaseDao implements VenderListDao { + + @Override + protected Class getEntityClass() { + return VenderList.class; + } + + + @Override + public Pagination findByCriteria(Integer firstResult, Integer pageSize) { + Criterion appShow = Restrictions.eq("appShow", BooleanEnum.YES.getKey()); + Criterion brandCode = Restrictions.ne("brandCode", "AYQ"); + return this.findByCriteria(firstResult, pageSize,null, appShow ,brandCode); + } + + + @Override + public VenderList getDefaultVenderList() { + return this.get("AYQ"); + } +} diff --git a/src/main/java/com/ifish/daoImpl/VersionDaoImpl.java b/src/main/java/com/ifish/daoImpl/VersionDaoImpl.java new file mode 100644 index 0000000..2c31d2b --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/VersionDaoImpl.java @@ -0,0 +1,44 @@ +package com.ifish.daoImpl; + +import org.hibernate.SQLQuery; +import org.hibernate.transform.Transformers; +import org.springframework.stereotype.Repository; + +import com.ifish.dao.VersionDao; +import com.ifish.entity.Version; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * @ClassName: UserDaoImpl + * @Description: TODO + * @author ggw + * + */ + +@Repository +public class VersionDaoImpl extends HibernateBaseDao implements VersionDao { + + + @Override + protected Class getEntityClass() { + return Version.class; + } + + @Override + public Version getNewestVersion(String phoneType) { + String sql = "select version_id as versionId,version_code as versionCode,phone_type as phoneType,upload_content as uploadContent,app_address as appAddress,is_must_update as isMustUpdate,create_time as createTime from tbl_version where phone_type=? order by versionId desc"; + SQLQuery query = this.getSession().createSQLQuery(sql); + query.setString(0, phoneType); + query.addScalar("versionId") + .addScalar("versionCode") + .addScalar("phoneType") + .addScalar("uploadContent") + .addScalar("appAddress") + .addScalar("isMustUpdate") + .addScalar("createTime") + .setResultTransformer(Transformers.aliasToBean(Version.class)); + return (Version) query.list().get(0); + } + + +} diff --git a/src/main/java/com/ifish/dto/AdInfoDto.java b/src/main/java/com/ifish/dto/AdInfoDto.java new file mode 100644 index 0000000..3891da1 --- /dev/null +++ b/src/main/java/com/ifish/dto/AdInfoDto.java @@ -0,0 +1,69 @@ +package com.ifish.dto; + +public class AdInfoDto { + + /** + * id + */ + private Integer adId; + /** + * 广告类型 + */ + private Integer adType; + /** + * 广告图片 + */ + private String adImage; + /** + * 广告链接 + */ + private String adLink; + /** + * 排序号 + */ + private Integer orderNum; + + public AdInfoDto() {} + + public AdInfoDto(Integer adId, Integer adType, String adImage, String adLink, Integer orderNum) { + this.adId = adId; + this.adType = adType; + this.adImage = adImage; + this.adLink = adLink; + this.orderNum = orderNum; + } + + public Integer getOrderNum() { + return orderNum; + } + + public void setOrderNum(Integer orderNum) { + this.orderNum = orderNum; + } + + public Integer getAdId() { + return adId; + } + public void setAdId(Integer adId) { + this.adId = adId; + } + public Integer getAdType() { + return adType; + } + public void setAdType(Integer adType) { + this.adType = adType; + } + public String getAdImage() { + return adImage; + } + public void setAdImage(String adImage) { + this.adImage = adImage; + } + public String getAdLink() { + return adLink; + } + public void setAdLink(String adLink) { + this.adLink = adLink; + } + +} diff --git a/src/main/java/com/ifish/dto/DeviceDto.java b/src/main/java/com/ifish/dto/DeviceDto.java new file mode 100644 index 0000000..5e2ff33 --- /dev/null +++ b/src/main/java/com/ifish/dto/DeviceDto.java @@ -0,0 +1,205 @@ +package com.ifish.dto; + + +/** + * 设备信息dto + * @author Administrator + * + */ +public class DeviceDto { + /** + * 设备ID + */ + private Integer deviceId; + /** + * 用户ID + */ + private Integer userId; + /** + * mac地址 + */ + private String macAddress; + /** + * 是否授权 + */ + private String isBlacklist; + /** + * 显示名称 + */ + private String showName; + /** + * 是否主控 + */ + private String isMaster; + /** + * 硬件类型(后台维护) + */ + private String type; + /** + * 控制个数 + */ + private Integer controlAmount; + /** + * 有无工作模式 + */ + private String isWorkModel; + /** + * 有无背光 + */ + private String isLightness; + /** + * 有无柜灯 + */ + private String isSarkLamp; + /** + * 是否显示预警设置 + */ + private String isPushWendu; + /** + * 定时器个数 + */ + private Integer timerAmount; + /** + * 今天是否提醒换水 + */ + private String todayRemind; + /** + * 换水提醒开关 + */ + private String waterRemind; + /** + * 下次提醒日期 + */ + private String remindDate; + /** + * 提醒周期 + */ + private String remindCycle; + /** + * 鱼缸厂信息 + */ + private VenderDto venderDto; + + public DeviceDto() {} + + public DeviceDto(Integer deviceId, String macAddress, String showName, String isMaster, String type,String isBlacklist) { + this.deviceId = deviceId; + this.macAddress = macAddress; + this.showName = showName; + this.isMaster = isMaster; + this.type = type; + this.isBlacklist = isBlacklist; + } + + public Integer getDeviceId() { + return deviceId; + } + public void setDeviceId(Integer deviceId) { + this.deviceId = deviceId; + } + public String getMacAddress() { + return macAddress; + } + public void setMacAddress(String macAddress) { + this.macAddress = macAddress; + } + public String getShowName() { + return showName; + } + public void setShowName(String showName) { + this.showName = showName; + } + public String getIsMaster() { + return isMaster; + } + public void setIsMaster(String isMaster) { + this.isMaster = isMaster; + } + public String getType() { + return type; + } + public void setType(String type) { + this.type = type; + } + public String getTodayRemind() { + return todayRemind; + } + public void setTodayRemind(String todayRemind) { + this.todayRemind = todayRemind; + } + public String getWaterRemind() { + return waterRemind; + } + public void setWaterRemind(String waterRemind) { + this.waterRemind = waterRemind; + } + public String getRemindDate() { + return remindDate; + } + public void setRemindDate(String remindDate) { + this.remindDate = remindDate; + } + public String getRemindCycle() { + return remindCycle; + } + public void setRemindCycle(String remindCycle) { + this.remindCycle = remindCycle; + } + public VenderDto getVenderDto() { + return venderDto; + } + public void setVenderDto(VenderDto venderDto) { + this.venderDto = venderDto; + } + public Integer getControlAmount() { + return controlAmount; + } + public void setControlAmount(Integer controlAmount) { + this.controlAmount = controlAmount; + } + public Integer getTimerAmount() { + return timerAmount; + } + public void setTimerAmount(Integer timerAmount) { + this.timerAmount = timerAmount; + } + public String getIsBlacklist() { + return isBlacklist; + } + public void setIsBlacklist(String isBlacklist) { + this.isBlacklist = isBlacklist; + } + public String getIsWorkModel() { + return isWorkModel; + } + public void setIsWorkModel(String isWorkModel) { + this.isWorkModel = isWorkModel; + } + public String getIsLightness() { + return isLightness; + } + public void setIsLightness(String isLightness) { + this.isLightness = isLightness; + } + public String getIsSarkLamp() { + return isSarkLamp; + } + public void setIsSarkLamp(String isSarkLamp) { + this.isSarkLamp = isSarkLamp; + } + public String getIsPushWendu() { + return isPushWendu; + } + public void setIsPushWendu(String isPushWendu) { + this.isPushWendu = isPushWendu; + } + + public Integer getUserId() { + return userId; + } + + public void setUserId(Integer userId) { + this.userId = userId; + } + +} diff --git a/src/main/java/com/ifish/dto/DeviceInfoDto.java b/src/main/java/com/ifish/dto/DeviceInfoDto.java new file mode 100644 index 0000000..4db596e --- /dev/null +++ b/src/main/java/com/ifish/dto/DeviceInfoDto.java @@ -0,0 +1,43 @@ +package com.ifish.dto; + +import java.util.List; + +/** + * 设备信息 + * @author Administrator + * + */ +public class DeviceInfoDto { + + /** + * 设备ID列表 + */ + private List deviceIds; + + /** + * 设备信息列表 + */ + private List deviceList; + + public DeviceInfoDto(List deviceIds, List deviceList) { + this.deviceIds = deviceIds; + this.deviceList = deviceList; + } + + public List getDeviceIds() { + return deviceIds; + } + + public void setDeviceIds(List deviceIds) { + this.deviceIds = deviceIds; + } + + public List getDeviceList() { + return deviceList; + } + + public void setDeviceList(List deviceList) { + this.deviceList = deviceList; + } + +} diff --git a/src/main/java/com/ifish/dto/GoldTaskDto.java b/src/main/java/com/ifish/dto/GoldTaskDto.java new file mode 100644 index 0000000..92fde7d --- /dev/null +++ b/src/main/java/com/ifish/dto/GoldTaskDto.java @@ -0,0 +1,62 @@ +package com.ifish.dto; + +/** + * 规则信息 + * @author Administrator + * + */ +public class GoldTaskDto { + /** + * 类型 + */ + private String ruleType; + /** + * 加成类型 + */ + private String addType; + /** + * 加成值 + */ + private String addValue; + /** + * 是否完成 + */ + private String isFinish; + + public GoldTaskDto() {} + + public GoldTaskDto(String ruleType, String addType, String addValue, + String isFinish) { + super(); + this.ruleType = ruleType; + this.addType = addType; + this.addValue = addValue; + this.isFinish = isFinish; + } + + public String getRuleType() { + return ruleType; + } + public void setRuleType(String ruleType) { + this.ruleType = ruleType; + } + public String getAddType() { + return addType; + } + public void setAddType(String addType) { + this.addType = addType; + } + public String getAddValue() { + return addValue; + } + public void setAddValue(String addValue) { + this.addValue = addValue; + } + public String getIsFinish() { + return isFinish; + } + public void setIsFinish(String isFinish) { + this.isFinish = isFinish; + } + +} diff --git a/src/main/java/com/ifish/dto/GradeInfoDto.java b/src/main/java/com/ifish/dto/GradeInfoDto.java new file mode 100644 index 0000000..383be3c --- /dev/null +++ b/src/main/java/com/ifish/dto/GradeInfoDto.java @@ -0,0 +1,62 @@ +package com.ifish.dto; + +/** + * 等级信息 + * @author Administrator + * + */ +public class GradeInfoDto { + + //等级 + private Integer gradeNum; + //等级名称 + private String gradeName; + //最小值 + private Integer minValue; + //最大值 + private Integer maxValue; + //描述 + private String remark; + + public GradeInfoDto() { + } + public GradeInfoDto(Integer gradeNum, String gradeName, Integer minValue, + Integer maxValue, String remark) { + this.gradeNum = gradeNum; + this.gradeName = gradeName; + this.minValue = minValue; + this.maxValue = maxValue; + this.remark = remark; + } + public Integer getGradeNum() { + return gradeNum; + } + public void setGradeNum(Integer gradeNum) { + this.gradeNum = gradeNum; + } + public String getGradeName() { + return gradeName; + } + public void setGradeName(String gradeName) { + this.gradeName = gradeName; + } + public Integer getMinValue() { + return minValue; + } + public void setMinValue(Integer minValue) { + this.minValue = minValue; + } + public Integer getMaxValue() { + return maxValue; + } + public void setMaxValue(Integer maxValue) { + this.maxValue = maxValue; + } + public String getRemark() { + return remark; + } + public void setRemark(String remark) { + this.remark = remark; + } + +} diff --git a/src/main/java/com/ifish/dto/GwellParamDto.java b/src/main/java/com/ifish/dto/GwellParamDto.java new file mode 100644 index 0000000..7b755a3 --- /dev/null +++ b/src/main/java/com/ifish/dto/GwellParamDto.java @@ -0,0 +1,66 @@ +package com.ifish.dto; + +/** + * 技威相关参数 + * @author Administrator + * + */ +public class GwellParamDto { + + //是否注册技威 + private String isRegisterGwell; + //code1 + private String P2PVerifyCode1; + //code2 + private String P2PVerifyCode2; + //技威userID + private String UserID; + + public GwellParamDto(String isRegisterGwell) { + this.isRegisterGwell = isRegisterGwell; + this.P2PVerifyCode1 = ""; + this.P2PVerifyCode2 = ""; + this.UserID = ""; + } + + public GwellParamDto(String isRegisterGwell, String p2pVerifyCode1,String p2pVerifyCode2, String userID) { + this.isRegisterGwell = isRegisterGwell; + this.P2PVerifyCode1 = p2pVerifyCode1; + this.P2PVerifyCode2 = p2pVerifyCode2; + this.UserID = userID; + } + + + public String getIsRegisterGwell() { + return isRegisterGwell; + } + + public void setIsRegisterGwell(String isRegisterGwell) { + this.isRegisterGwell = isRegisterGwell; + } + + public String getP2PVerifyCode1() { + return P2PVerifyCode1; + } + + public void setP2PVerifyCode1(String p2pVerifyCode1) { + P2PVerifyCode1 = p2pVerifyCode1; + } + + public String getP2PVerifyCode2() { + return P2PVerifyCode2; + } + + public void setP2PVerifyCode2(String p2pVerifyCode2) { + P2PVerifyCode2 = p2pVerifyCode2; + } + + public String getUserID() { + return UserID; + } + + public void setUserID(String userID) { + UserID = userID; + } + +} diff --git a/src/main/java/com/ifish/dto/IfishGoodsDto.java b/src/main/java/com/ifish/dto/IfishGoodsDto.java new file mode 100644 index 0000000..0f8b677 --- /dev/null +++ b/src/main/java/com/ifish/dto/IfishGoodsDto.java @@ -0,0 +1,102 @@ +package com.ifish.dto; + +import java.math.BigDecimal; + +/** + * 商品信息DTO + * @author Administrator + * + */ +public class IfishGoodsDto { + + /** + * 商品ID + */ + private Integer goodsId; + /** + * 店铺名称 + */ + private String shopName; + /** + * 商品名称 + */ + private String goodsName; + /** + * 是否是淘宝链接 + */ + private Integer isTaobaoLink; + /** + * 商品链接 + */ + private String goodsLink; + /** + * 商铺图片 + */ + private String goodsPicture; + /** + * 原价格 + */ + private BigDecimal oriPrice; + /** + * 优惠价格 + */ + private BigDecimal prePrice; + + public IfishGoodsDto(Integer goodsId, String shopName, String goodsName, String goodsLink, BigDecimal oriPrice, BigDecimal prePrice) { + this.goodsId = goodsId; + this.shopName = shopName; + this.goodsName = goodsName; + this.goodsLink = goodsLink; + this.oriPrice = oriPrice; + this.prePrice = prePrice; + } + public Integer getGoodsId() { + return goodsId; + } + public void setGoodsId(Integer goodsId) { + this.goodsId = goodsId; + } + public String getGoodsName() { + return goodsName; + } + public void setGoodsName(String goodsName) { + this.goodsName = goodsName; + } + public String getGoodsLink() { + return goodsLink; + } + public void setGoodsLink(String goodsLink) { + this.goodsLink = goodsLink; + } + public String getGoodsPicture() { + return goodsPicture; + } + public void setGoodsPicture(String goodsPicture) { + this.goodsPicture = goodsPicture; + } + public BigDecimal getOriPrice() { + return oriPrice; + } + public void setOriPrice(BigDecimal oriPrice) { + this.oriPrice = oriPrice; + } + public BigDecimal getPrePrice() { + return prePrice; + } + public void setPrePrice(BigDecimal prePrice) { + this.prePrice = prePrice; + } + public String getShopName() { + return shopName; + } + public void setShopName(String shopName) { + this.shopName = shopName; + } + public Integer getIsTaobaoLink() { + return isTaobaoLink; + } + public void setIsTaobaoLink(Integer isTaobaoLink) { + this.isTaobaoLink = isTaobaoLink; + } + +} diff --git a/src/main/java/com/ifish/dto/InformationDto.java b/src/main/java/com/ifish/dto/InformationDto.java new file mode 100644 index 0000000..5384f6a --- /dev/null +++ b/src/main/java/com/ifish/dto/InformationDto.java @@ -0,0 +1,76 @@ +package com.ifish.dto; + + +/** + * 资讯信息封装 + * @author Administrator + * + */ +public class InformationDto { + //ID + private Integer infoId; + //链接 + private String link; + //标题 + private String title; + //内容 + private String contents; + //图片 + private String image; + //点击数 + private Integer clickNum; + //评论数 + private Integer pinglunNum; + + public InformationDto(Integer infoId) { + this.infoId = infoId; + this.pinglunNum = 0; + this.clickNum = 0; + } + + public Integer getInfoId() { + return infoId; + } + public void setInfoId(Integer infoId) { + this.infoId = infoId; + } + public String getLink() { + return link; + } + public void setLink(String link) { + this.link = link; + } + public String getTitle() { + return title; + } + public void setTitle(String title) { + this.title = title; + } + + public Integer getClickNum() { + return clickNum; + } + + public void setClickNum(Integer clickNum) { + this.clickNum = clickNum; + } + public Integer getPinglunNum() { + return pinglunNum; + } + public void setPinglunNum(Integer pinglunNum) { + this.pinglunNum = pinglunNum; + } + public String getImage() { + return image; + } + public void setImage(String image) { + this.image = image; + } + public String getContents() { + return contents; + } + public void setContents(String contents) { + this.contents = contents; + } + +} diff --git a/src/main/java/com/ifish/dto/JsonResult.java b/src/main/java/com/ifish/dto/JsonResult.java new file mode 100644 index 0000000..44b6b4e --- /dev/null +++ b/src/main/java/com/ifish/dto/JsonResult.java @@ -0,0 +1,49 @@ +package com.ifish.dto; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.serializer.SerializerFeature; + +/** + * 请求返回json结果 + * @author Administrator + * + * @param + */ +public class JsonResult { + //结果码 + private String result; + //数据 + private T data; + + public JsonResult(String result, T data) { + this.result = result; + this.data = data; + } + + public JsonResult(String result) { + this.result = result; + this.data = null; + } + + public String getResult() { + return result; + } + + public void setResult(String result) { + this.result = result; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } + + @Override + public String toString() { + //允许null值 + return JSON.toJSONString(this,SerializerFeature.WriteMapNullValue); + } +} diff --git a/src/main/java/com/ifish/dto/LiveRoomInfoDto.java b/src/main/java/com/ifish/dto/LiveRoomInfoDto.java new file mode 100644 index 0000000..780fe76 --- /dev/null +++ b/src/main/java/com/ifish/dto/LiveRoomInfoDto.java @@ -0,0 +1,169 @@ +package com.ifish.dto; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 直播间列表 + * @author Administrator + * + */ +public class LiveRoomInfoDto implements Serializable{ + + private static final long serialVersionUID = 2438713198151455034L; + //直播间ID + private Integer roomId; + //用户ID + private Integer userId; + //用户类型 + private String userType; + //昵称 + private String nickName; + //用户头像 + private String userImg; + //用户最后一次登录时间 + private Date loginTime; + //摄像头ID + private String cameraId; + //直播间名称 + private String roomName; + //直播宣言 + private String roomDesc; + //人气值 + private Integer popularityValue; + //活跃度 + private String liveness; + //直播天数 + private Integer numberDays; + //距离 + private Double distance; + //创建时间 + private Date createTime; + //评论数 + private Integer pinglunNum; + //点赞数量 + private Integer zanNum; + //是否点过赞 + private String isZan; + //打赏金币数量 + private BigDecimal totalGoldValue; + //等级 + private Integer gradeNum; + + public Integer getRoomId() { + return roomId; + } + public void setRoomId(Integer roomId) { + this.roomId = roomId; + } + public String getNickName() { + return nickName; + } + public void setNickName(String nickName) { + this.nickName = nickName; + } + public String getCameraId() { + return cameraId; + } + public void setCameraId(String cameraId) { + this.cameraId = cameraId; + } + public String getRoomName() { + return roomName; + } + public void setRoomName(String roomName) { + this.roomName = roomName; + } + public String getRoomDesc() { + return roomDesc; + } + public void setRoomDesc(String roomDesc) { + this.roomDesc = roomDesc; + } + public Integer getPopularityValue() { + return popularityValue; + } + public void setPopularityValue(Integer popularityValue) { + this.popularityValue = popularityValue; + } + public Integer getNumberDays() { + return numberDays; + } + public void setNumberDays(Integer numberDays) { + this.numberDays = numberDays; + } + public Double getDistance() { + return distance; + } + public void setDistance(Double distance) { + this.distance = distance; + } + public String getUserImg() { + return userImg; + } + public void setUserImg(String userImg) { + this.userImg = userImg; + } + public String getLiveness() { + return liveness; + } + public void setLiveness(String liveness) { + this.liveness = liveness; + } + public Date getLoginTime() { + return loginTime; + } + public void setLoginTime(Date loginTime) { + this.loginTime = loginTime; + } + public Integer getUserId() { + return userId; + } + public void setUserId(Integer userId) { + this.userId = userId; + } + public Date getCreateTime() { + return createTime; + } + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + public String getUserType() { + return userType; + } + public void setUserType(String userType) { + this.userType = userType; + } + public Integer getPinglunNum() { + return pinglunNum; + } + public void setPinglunNum(Integer pinglunNum) { + this.pinglunNum = pinglunNum; + } + public String getIsZan() { + return isZan; + } + public void setIsZan(String isZan) { + this.isZan = isZan; + } + public Integer getGradeNum() { + return gradeNum; + } + public void setGradeNum(Integer gradeNum) { + this.gradeNum = gradeNum; + } + public Integer getZanNum() { + return zanNum; + } + public void setZanNum(Integer zanNum) { + this.zanNum = zanNum; + } + public BigDecimal getTotalGoldValue() { + return totalGoldValue; + } + public void setTotalGoldValue(BigDecimal totalGoldValue) { + this.totalGoldValue = totalGoldValue; + } + +} diff --git a/src/main/java/com/ifish/dto/NeteaseParamDto.java b/src/main/java/com/ifish/dto/NeteaseParamDto.java new file mode 100644 index 0000000..05a2851 --- /dev/null +++ b/src/main/java/com/ifish/dto/NeteaseParamDto.java @@ -0,0 +1,42 @@ +package com.ifish.dto; + +/** + * 云信相关参数 + * @author Administrator + * + */ +public class NeteaseParamDto { + + //是否注册云信 + private String isRegisterNetease; + //云信token + private String neteaseToken; + + public NeteaseParamDto(String isRegisterNetease) { + this.isRegisterNetease = isRegisterNetease; + this.neteaseToken = ""; + } + + public NeteaseParamDto(String isRegisterNetease, String neteaseToken) { + this.isRegisterNetease = isRegisterNetease; + this.neteaseToken = neteaseToken; + } + + public String getIsRegisterNetease() { + return isRegisterNetease; + } + + public void setIsRegisterNetease(String isRegisterNetease) { + this.isRegisterNetease = isRegisterNetease; + } + + public String getNeteaseToken() { + return neteaseToken; + } + + public void setNeteaseToken(String neteaseToken) { + this.neteaseToken = neteaseToken; + } + + +} diff --git a/src/main/java/com/ifish/dto/PageingDto.java b/src/main/java/com/ifish/dto/PageingDto.java new file mode 100644 index 0000000..d40830c --- /dev/null +++ b/src/main/java/com/ifish/dto/PageingDto.java @@ -0,0 +1,62 @@ +package com.ifish.dto; + +import java.util.List; + +/** + * 分页数据封装 + * @author Administrator + * + * @param + */ +public class PageingDto{ + + private String result; + + private Integer firstResult; + + private Integer total; + + private List data; + + public PageingDto() {} + + public PageingDto(String result, Integer firstResult, Integer total,List data) { + this.result = result; + this.firstResult = firstResult; + this.total = total; + this.data = data; + } + + public String getResult() { + return result; + } + + public void setResult(String result) { + this.result = result; + } + + public Integer getFirstResult() { + return firstResult; + } + + public void setFirstResult(Integer firstResult) { + this.firstResult = firstResult; + } + + public Integer getTotal() { + return total; + } + + public void setTotal(Integer total) { + this.total = total; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + +} diff --git a/src/main/java/com/ifish/dto/RuleInfoDto.java b/src/main/java/com/ifish/dto/RuleInfoDto.java new file mode 100644 index 0000000..596eef8 --- /dev/null +++ b/src/main/java/com/ifish/dto/RuleInfoDto.java @@ -0,0 +1,88 @@ +package com.ifish.dto; + +/** + * 规则信息 + * @author Administrator + * + */ +public class RuleInfoDto { + /** + * 类型 + */ + private String ruleType; + /** + * 名称 + */ + private String ruleName; + /** + * 加成类型 + */ + private String addType; + /** + * 加成值 + */ + private String addValue; + /** + * 描述 + */ + private String ruleRemark; + /** + * 是否完成 + */ + private String isFinish; + + public RuleInfoDto() {} + + public RuleInfoDto(String ruleType, String ruleName, String addType, + String addValue, String ruleRemark, String isFinish) { + this.ruleType = ruleType; + this.ruleName = ruleName; + this.addType = addType; + this.addValue = addValue; + this.ruleRemark = ruleRemark; + this.isFinish = isFinish; + } + + + public String getRuleName() { + return ruleName; + } + + public void setRuleName(String ruleName) { + this.ruleName = ruleName; + } + + public String getRuleRemark() { + return ruleRemark; + } + + public void setRuleRemark(String ruleRemark) { + this.ruleRemark = ruleRemark; + } + + public String getRuleType() { + return ruleType; + } + public void setRuleType(String ruleType) { + this.ruleType = ruleType; + } + public String getAddType() { + return addType; + } + public void setAddType(String addType) { + this.addType = addType; + } + public String getAddValue() { + return addValue; + } + public void setAddValue(String addValue) { + this.addValue = addValue; + } + public String getIsFinish() { + return isFinish; + } + public void setIsFinish(String isFinish) { + this.isFinish = isFinish; + } + +} diff --git a/src/main/java/com/ifish/dto/RuleRecordDto.java b/src/main/java/com/ifish/dto/RuleRecordDto.java new file mode 100644 index 0000000..bff32cb --- /dev/null +++ b/src/main/java/com/ifish/dto/RuleRecordDto.java @@ -0,0 +1,68 @@ +package com.ifish.dto; + +/** + * 金币经验加成记录DTO + * @author Administrator + * + */ +public class RuleRecordDto { + + /** + * id + */ + private Integer id; + /** + * 值 + */ + private String value; + /** + * 描述 + */ + private String ramark; + /** + * 记录时间 + */ + private String createTime; + + public RuleRecordDto() {} + + public RuleRecordDto(Integer id, String value,String ramark,String createTime) { + this.id = id; + this.value = value; + this.ramark = ramark; + this.createTime = createTime; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getRamark() { + return ramark; + } + + public void setRamark(String ramark) { + this.ramark = ramark; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + +} diff --git a/src/main/java/com/ifish/dto/ShopsListDto.java b/src/main/java/com/ifish/dto/ShopsListDto.java new file mode 100644 index 0000000..e57de72 --- /dev/null +++ b/src/main/java/com/ifish/dto/ShopsListDto.java @@ -0,0 +1,143 @@ +package com.ifish.dto; + +import java.io.Serializable; + +/** + * 商家列表 + * @author Administrator + * + */ +public class ShopsListDto implements Serializable{ + + private static final long serialVersionUID = -669448254021154912L; + //ID + private Integer shopsId; + //用户ID + private Integer userId; + //头像 + private String userImg; + //店家姓名 + private String userName; + //店铺名称 + private String shopsName; + //店家电话 + private String shopsPhone; + //省 + private String shopsProvince; + //市 + private String shopsCity; + //区 + private String shopsArea; + //店家地址 + private String shopsAddress; + //店铺招牌 + private String picture4; + //备注 + private String remark; + //微信号 + private String weixinCode; + //网店地址 + private String shopLink; + //距离 + private Double distance; + //是否屏蔽微信号 + private String isPingBi; + + public String getIsPingBi() { + return isPingBi; + } + public void setIsPingBi(String isPingBi) { + this.isPingBi = isPingBi; + } + public Integer getShopsId() { + return shopsId; + } + public void setShopsId(Integer shopsId) { + this.shopsId = shopsId; + } + public Integer getUserId() { + return userId; + } + public void setUserId(Integer userId) { + this.userId = userId; + } + public String getUserName() { + return userName; + } + public void setUserName(String userName) { + this.userName = userName; + } + public String getShopsName() { + return shopsName; + } + public void setShopsName(String shopsName) { + this.shopsName = shopsName; + } + public String getShopsPhone() { + return shopsPhone; + } + public void setShopsPhone(String shopsPhone) { + this.shopsPhone = shopsPhone; + } + public String getShopsProvince() { + return shopsProvince; + } + public void setShopsProvince(String shopsProvince) { + this.shopsProvince = shopsProvince; + } + public String getShopsCity() { + return shopsCity; + } + public void setShopsCity(String shopsCity) { + this.shopsCity = shopsCity; + } + public String getShopsArea() { + return shopsArea; + } + public void setShopsArea(String shopsArea) { + this.shopsArea = shopsArea; + } + public String getShopsAddress() { + return shopsAddress; + } + public void setShopsAddress(String shopsAddress) { + this.shopsAddress = shopsAddress; + } + public String getPicture4() { + return picture4; + } + public void setPicture4(String picture4) { + this.picture4 = picture4; + } + public String getRemark() { + return remark; + } + public void setRemark(String remark) { + this.remark = remark; + } + public Double getDistance() { + return distance; + } + public void setDistance(Double distance) { + this.distance = distance; + } + public String getUserImg() { + return userImg; + } + public void setUserImg(String userImg) { + this.userImg = userImg; + } + public String getWeixinCode() { + return weixinCode; + } + public void setWeixinCode(String weixinCode) { + this.weixinCode = weixinCode; + } + public String getShopLink() { + return shopLink; + } + public void setShopLink(String shopLink) { + this.shopLink = shopLink; + } + +} diff --git a/src/main/java/com/ifish/dto/ShopsLookUserDto.java b/src/main/java/com/ifish/dto/ShopsLookUserDto.java new file mode 100644 index 0000000..b452840 --- /dev/null +++ b/src/main/java/com/ifish/dto/ShopsLookUserDto.java @@ -0,0 +1,53 @@ +package com.ifish.dto; + + +/** + * 商家看护用户 + * @author Administrator + * + */ +public class ShopsLookUserDto{ + + /** + * 用户ID + */ + private Integer userId; + /** + * 用户昵称 + */ + private String nickName; + /** + * 摄像头ID + */ + private String cameraId; + /** + * 头像 + */ + private String userImg; + + public String getNickName() { + return nickName; + } + public void setNickName(String nickName) { + this.nickName = nickName; + } + public String getCameraId() { + return cameraId; + } + public void setCameraId(String cameraId) { + this.cameraId = cameraId; + } + public Integer getUserId() { + return userId; + } + public void setUserId(Integer userId) { + this.userId = userId; + } + public String getUserImg() { + return userImg; + } + public void setUserImg(String userImg) { + this.userImg = userImg; + } + +} diff --git a/src/main/java/com/ifish/dto/ShopsUserDto.java b/src/main/java/com/ifish/dto/ShopsUserDto.java new file mode 100644 index 0000000..80fffbd --- /dev/null +++ b/src/main/java/com/ifish/dto/ShopsUserDto.java @@ -0,0 +1,68 @@ +package com.ifish.dto; + +/** + * 商家会员分页信息DTO + * @author Administrator + * + */ +public class ShopsUserDto { + /** + * 用户ID + */ + private Integer userId; + /** + * 备注名 + */ + private String userName; + /** + * 会员名 + */ + private String nickName; + /** + * 头像 + */ + private String userImg; + /** + * 最后登陆时间 + */ + private String loginTime; + + public ShopsUserDto() {} + + public ShopsUserDto(Integer userId, String userName) { + this.userId = userId; + this.userName = userName; + } + + public Integer getUserId() { + return userId; + } + public void setUserId(Integer userId) { + this.userId = userId; + } + public String getUserName() { + return userName; + } + public void setUserName(String userName) { + this.userName = userName; + } + public String getNickName() { + return nickName; + } + public void setNickName(String nickName) { + this.nickName = nickName; + } + public String getUserImg() { + return userImg; + } + public void setUserImg(String userImg) { + this.userImg = userImg; + } + public String getLoginTime() { + return loginTime; + } + public void setLoginTime(String loginTime) { + this.loginTime = loginTime; + } + +} diff --git a/src/main/java/com/ifish/dto/ShopsUserInfoDto.java b/src/main/java/com/ifish/dto/ShopsUserInfoDto.java new file mode 100644 index 0000000..fb39d4f --- /dev/null +++ b/src/main/java/com/ifish/dto/ShopsUserInfoDto.java @@ -0,0 +1,147 @@ +package com.ifish.dto; + +/** + * 商家会员详细信息DTO + * @author Administrator + * + */ +public class ShopsUserInfoDto { + /** + * 用户ID + */ + private Integer userId; + /** + * 商家ID + */ + private Integer shopsId; + /** + * 会员等级 + */ + private int memberLevel; + /** + * 用户名称 + */ + private String userName; + /** + * 手机号码 + */ + private String phoneNumber; + /** + * 省 + */ + private String province; + /** + * 市 + */ + private String city; + /** + * 区 + */ + private String area; + /** + * 地址 + */ + private String address; + /** + * 备注 + */ + private String remark; + /** + * 设备个数 + */ + private Integer deviceNum; + /** + * 摄像头个数 + */ + private Integer cameraNum; + + public ShopsUserInfoDto() {} + + public ShopsUserInfoDto(Integer userId, Integer shopsId, int memberLevel, Integer deviceNum, Integer cameraNum) { + this.userId = userId; + this.shopsId = shopsId; + this.memberLevel = memberLevel; + this.deviceNum = deviceNum; + this.cameraNum = cameraNum; + } + + public int getMemberLevel() { + return memberLevel; + } + public void setMemberLevel(int memberLevel) { + this.memberLevel = memberLevel; + } + public String getUserName() { + return userName; + } + public void setUserName(String userName) { + this.userName = userName; + } + public String getPhoneNumber() { + return phoneNumber; + } + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; + } + public String getAddress() { + return address; + } + public void setAddress(String address) { + this.address = address; + } + public String getRemark() { + return remark; + } + public void setRemark(String remark) { + this.remark = remark; + } + public Integer getShopsId() { + return shopsId; + } + public void setShopsId(Integer shopsId) { + this.shopsId = shopsId; + } + public Integer getUserId() { + return userId; + } + public void setUserId(Integer userId) { + this.userId = userId; + } + public Integer getDeviceNum() { + return deviceNum; + } + public void setDeviceNum(Integer deviceNum) { + this.deviceNum = deviceNum; + } + public Integer getCameraNum() { + return cameraNum; + } + public void setCameraNum(Integer cameraNum) { + this.cameraNum = cameraNum; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + +} diff --git a/src/main/java/com/ifish/dto/UserActivityDto.java b/src/main/java/com/ifish/dto/UserActivityDto.java new file mode 100644 index 0000000..227eb28 --- /dev/null +++ b/src/main/java/com/ifish/dto/UserActivityDto.java @@ -0,0 +1,93 @@ +package com.ifish.dto; + +import java.util.Date; + +/** + * 用户动态 + * @author Administrator + * + */ +public class UserActivityDto { + /** + * 动态ID + */ + private Integer activityId; + /** + * 用户ID + */ + private Integer userId; + /** + * 头像 + */ + private String userImg; + /** + * 昵称 + */ + private String nickName; + /** + * 等级 + */ + private Integer gradeNum; + /** + * 动态类型 + */ + private String activityType; + /** + * 创建时间 + */ + private Date createTime; + + public UserActivityDto() { } + + public UserActivityDto(Integer activityId, Integer userId,String activityType, Date createTime) { + this.activityId = activityId; + this.userId = userId; + this.activityType = activityType; + this.createTime = createTime; + this.gradeNum = 0; + } + + public Integer getActivityId() { + return activityId; + } + public void setActivityId(Integer activityId) { + this.activityId = activityId; + } + public Integer getUserId() { + return userId; + } + public void setUserId(Integer userId) { + this.userId = userId; + } + public String getUserImg() { + return userImg; + } + public void setUserImg(String userImg) { + this.userImg = userImg; + } + public String getNickName() { + return nickName; + } + public void setNickName(String nickName) { + this.nickName = nickName; + } + public Integer getGradeNum() { + return gradeNum; + } + public void setGradeNum(Integer gradeNum) { + this.gradeNum = gradeNum; + } + public String getActivityType() { + return activityType; + } + public void setActivityType(String activityType) { + this.activityType = activityType; + } + public Date getCreateTime() { + return createTime; + } + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + +} diff --git a/src/main/java/com/ifish/dto/UserAssetDto.java b/src/main/java/com/ifish/dto/UserAssetDto.java new file mode 100644 index 0000000..2b0b4b1 --- /dev/null +++ b/src/main/java/com/ifish/dto/UserAssetDto.java @@ -0,0 +1,139 @@ +package com.ifish.dto; + +import java.math.BigDecimal; + +import com.ifish.enums.BooleanEnum; + +/** + * 用户资产信息(金币,经验值等) + * @author Administrator + * + */ +public class UserAssetDto { + + /** + * 经验值 + */ + private Integer gradeValue; + /** + * 等级 + */ + private Integer gradeNum; + /** + * 等级名称 + */ + private String gradeName; + /** + * 金币 + */ + private BigDecimal goldValue; + /** + * 今天是否签到 + */ + private String toDaySignin; + + /** + * 连续签到天数 + */ + private Integer keepSigninNum; + + /** + * 最后一次登陆日期 + */ + private String lastLoginDate; + /** + * 是否砸过金蛋(默认砸过) + */ + private String isHitGoldenEgg; + + /** + * 所加经验值 + */ + private BigDecimal addValue; + + + public UserAssetDto() { + this.gradeValue = 0; + this.gradeNum = 7; + this.gradeName = "海龙王"; + this.goldValue = new BigDecimal(0); + this.toDaySignin = BooleanEnum.NO.getKey(); + this.keepSigninNum = 0; + this.lastLoginDate = ""; + this.isHitGoldenEgg = BooleanEnum.YES.getKey(); + this.addValue = new BigDecimal(0); + } + + public Integer getGradeValue() { + return gradeValue; + } + + public void setGradeValue(Integer gradeValue) { + this.gradeValue = gradeValue; + } + + public Integer getGradeNum() { + return gradeNum; + } + + public void setGradeNum(Integer gradeNum) { + this.gradeNum = gradeNum; + } + + public String getGradeName() { + return gradeName; + } + + public void setGradeName(String gradeName) { + this.gradeName = gradeName; + } + + public BigDecimal getGoldValue() { + return goldValue; + } + + public void setGoldValue(BigDecimal goldValue) { + this.goldValue = goldValue; + } + + public String getToDaySignin() { + return toDaySignin; + } + + public void setToDaySignin(String toDaySignin) { + this.toDaySignin = toDaySignin; + } + + public Integer getKeepSigninNum() { + return keepSigninNum; + } + + public void setKeepSigninNum(Integer keepSigninNum) { + this.keepSigninNum = keepSigninNum; + } + + public String getLastLoginDate() { + return lastLoginDate; + } + + public void setLastLoginDate(String lastLoginDate) { + this.lastLoginDate = lastLoginDate; + } + + public String getIsHitGoldenEgg() { + return isHitGoldenEgg; + } + + public void setIsHitGoldenEgg(String isHitGoldenEgg) { + this.isHitGoldenEgg = isHitGoldenEgg; + } + + public BigDecimal getAddValue() { + return addValue; + } + + public void setAddValue(BigDecimal addValue) { + this.addValue = addValue; + } + +} diff --git a/src/main/java/com/ifish/dto/UserInfoDto.java b/src/main/java/com/ifish/dto/UserInfoDto.java new file mode 100644 index 0000000..4a92d39 --- /dev/null +++ b/src/main/java/com/ifish/dto/UserInfoDto.java @@ -0,0 +1,133 @@ +package com.ifish.dto; + + +/** + * 用户信息 + * @author Administrator + * + */ +public class UserInfoDto { + + /** + * 用户ID + */ + private Integer userId; + /** + * 手机号码 + */ + private String phoneNumber; + /** + * 性别 + */ + private String userSex; + /** + * 签名 + */ + private String signature; + /** + * 用户名 + */ + private String nickName; + /** + * 用户头像 + */ + private String userImg; + /** + * 用户类型(0:普通用户,1:商家用户) + */ + private String userType; + /** + * 商家用户Id + */ + private Integer shopsUserId; + /** + * 技威CODE1 + */ + private String P2PVerifyCode1; + /** + * 技威CODE2 + */ + private String P2PVerifyCode2; + /** + * 技威用户ID + */ + private String gwellUserID; + /** + * 云信token + */ + private String neteaseToken; + + public Integer getUserId() { + return userId; + } + public void setUserId(Integer userId) { + this.userId = userId; + } + public String getPhoneNumber() { + return phoneNumber; + } + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; + } + public String getUserSex() { + return userSex; + } + public void setUserSex(String userSex) { + this.userSex = userSex; + } + public String getSignature() { + return signature; + } + public void setSignature(String signature) { + this.signature = signature; + } + public String getNickName() { + return nickName; + } + public void setNickName(String nickName) { + this.nickName = nickName; + } + public String getUserImg() { + return userImg; + } + public void setUserImg(String userImg) { + this.userImg = userImg; + } + public String getUserType() { + return userType; + } + public void setUserType(String userType) { + this.userType = userType; + } + public Integer getShopsUserId() { + return shopsUserId; + } + public void setShopsUserId(Integer shopsUserId) { + this.shopsUserId = shopsUserId; + } + public String getP2PVerifyCode1() { + return P2PVerifyCode1; + } + public void setP2PVerifyCode1(String p2pVerifyCode1) { + P2PVerifyCode1 = p2pVerifyCode1; + } + public String getP2PVerifyCode2() { + return P2PVerifyCode2; + } + public void setP2PVerifyCode2(String p2pVerifyCode2) { + P2PVerifyCode2 = p2pVerifyCode2; + } + public String getGwellUserID() { + return gwellUserID; + } + public void setGwellUserID(String gwellUserID) { + this.gwellUserID = gwellUserID; + } + public String getNeteaseToken() { + return neteaseToken; + } + public void setNeteaseToken(String neteaseToken) { + this.neteaseToken = neteaseToken; + } + +} diff --git a/src/main/java/com/ifish/dto/VenderDto.java b/src/main/java/com/ifish/dto/VenderDto.java new file mode 100644 index 0000000..5c44663 --- /dev/null +++ b/src/main/java/com/ifish/dto/VenderDto.java @@ -0,0 +1,48 @@ +package com.ifish.dto; + + +/** + * 鱼缸厂信息dto + * @author Administrator + * + */ +public class VenderDto { + + /** + * 厂家名称 + */ + private String brandName; + /** + * 品牌介绍 + */ + private String brandIntroduce; + /** + * logo + */ + private String logo; + + public VenderDto(String brandName, String brandIntroduce, String logo) { + this.brandName = brandName; + this.brandIntroduce = brandIntroduce; + this.logo = logo; + } + public String getBrandName() { + return brandName; + } + public void setBrandName(String brandName) { + this.brandName = brandName; + } + public String getBrandIntroduce() { + return brandIntroduce; + } + public void setBrandIntroduce(String brandIntroduce) { + this.brandIntroduce = brandIntroduce; + } + public String getLogo() { + return logo; + } + public void setLogo(String logo) { + this.logo = logo; + } + +} diff --git a/src/main/java/com/ifish/entity/AdInfo.java b/src/main/java/com/ifish/entity/AdInfo.java new file mode 100644 index 0000000..776acbb --- /dev/null +++ b/src/main/java/com/ifish/entity/AdInfo.java @@ -0,0 +1,120 @@ +package com.ifish.entity; + +import java.io.Serializable; +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; + +/** + * 广告位信息 + * @author Administrator + * + */ +@Entity +@Table(name="tbl_ad_info") +public class AdInfo implements Serializable{ + + private static final long serialVersionUID = 1658175021665132499L; + + /** + * id + */ + @Id + @Column(name="ad_id") + @GeneratedValue(strategy=GenerationType.IDENTITY) + private Integer adId; + /** + * 是否显示 + */ + @Column(name="is_show",length=1) + private String isShow; + /** + * 广告类型 + */ + @Column(name="ad_type",nullable=false) + private Integer adType; + /** + * 广告位图片 + */ + @Column(name="ad_image",length=20) + private String adImage; + /** + * 广告位链接 + */ + @Column(name="ad_link",length=100) + private String adLink; + /** + * 排序 + */ + @Column(name="order_num",nullable=false) + private Integer orderNum; + /** + * 更新时间 + */ + @Column(name="update_time") + @Temporal(TemporalType.TIMESTAMP) + private Date updateTime; + /** + * 创建时间 + */ + @Column(name="create_time") + @Temporal(TemporalType.TIMESTAMP) + private Date createTime; + + public Integer getAdId() { + return adId; + } + public void setAdId(Integer adId) { + this.adId = adId; + } + public Integer getAdType() { + return adType; + } + public void setAdType(Integer adType) { + this.adType = adType; + } + public String getAdImage() { + return adImage; + } + public void setAdImage(String adImage) { + this.adImage = adImage; + } + public String getAdLink() { + return adLink; + } + public void setAdLink(String adLink) { + this.adLink = adLink; + } + public Date getUpdateTime() { + return updateTime; + } + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + public Date getCreateTime() { + return createTime; + } + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + public String getIsShow() { + return isShow; + } + public void setIsShow(String isShow) { + this.isShow = isShow; + } + public Integer getOrderNum() { + return orderNum; + } + public void setOrderNum(Integer orderNum) { + this.orderNum = orderNum; + } + +} diff --git a/src/main/java/com/ifish/entity/BrowseRoom.java b/src/main/java/com/ifish/entity/BrowseRoom.java new file mode 100644 index 0000000..5860138 --- /dev/null +++ b/src/main/java/com/ifish/entity/BrowseRoom.java @@ -0,0 +1,39 @@ +package com.ifish.entity; + +import java.io.Serializable; +import java.util.Date; + +/** + * @ClassName: tbl_browse_room + * @date 2015年7月2日 下午16:40:00 + * + */ +public class BrowseRoom implements Serializable{ + + private static final long serialVersionUID = 1866585948782100462L; + //ID + private BrowseRoomId browseRoomId; + //修改时间 + private Date updateTime; + //创建时间 + private Date createTime; + public BrowseRoomId getBrowseRoomId() { + return browseRoomId; + } + public void setBrowseRoomId(BrowseRoomId browseRoomId) { + this.browseRoomId = browseRoomId; + } + public Date getUpdateTime() { + return updateTime; + } + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + public Date getCreateTime() { + return createTime; + } + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + +} diff --git a/src/main/java/com/ifish/entity/BrowseRoomId.java b/src/main/java/com/ifish/entity/BrowseRoomId.java new file mode 100644 index 0000000..d17faba --- /dev/null +++ b/src/main/java/com/ifish/entity/BrowseRoomId.java @@ -0,0 +1,52 @@ +package com.ifish.entity; + +import java.io.Serializable; + +public class BrowseRoomId implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer roomId; + private Integer userId; + + public BrowseRoomId() { + } + + public BrowseRoomId(Integer roomId, Integer userId) { + this.roomId = roomId; + this.userId = userId; + } + + public Integer getRoomId() { + return roomId; + } + + public void setRoomId(Integer roomId) { + this.roomId = roomId; + } + + public Integer getUserId() { + return userId; + } + + public void setUserId(Integer userId) { + this.userId = userId; + } + + @Override + public boolean equals(Object obj) { + if(obj instanceof BrowseRoomId){ + BrowseRoomId pk=(BrowseRoomId)obj; + if(this.roomId.equals(pk.roomId) && this.userId.equals(pk.userId)){ + return true; + } + } + return false; + } + + @Override + public int hashCode() { + return super.hashCode(); + } + +} diff --git a/src/main/java/com/ifish/entity/Camera.java b/src/main/java/com/ifish/entity/Camera.java new file mode 100644 index 0000000..d93b5b3 --- /dev/null +++ b/src/main/java/com/ifish/entity/Camera.java @@ -0,0 +1,56 @@ +package com.ifish.entity; + +import java.io.Serializable; +import java.util.Date; + +/** + * @ClassName: tbl_camera + * @date 2015年7月2日 下午16:40:00 + * + */ +public class Camera implements Serializable{ + + private static final long serialVersionUID = -5292867602998823697L; + //ID + private String cameraId; + //激活码 + private String activeCode; + //激活时间 + private Date activeTime; + //修改时间 + private Date updateTime; + //创建时间 + private Date createTime; + + public Date getUpdateTime() { + return updateTime; + } + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + public Date getCreateTime() { + return createTime; + } + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + public String getCameraId() { + return cameraId; + } + public void setCameraId(String cameraId) { + this.cameraId = cameraId; + } + public String getActiveCode() { + return activeCode; + } + public void setActiveCode(String activeCode) { + this.activeCode = activeCode; + } + public Date getActiveTime() { + return activeTime; + } + public void setActiveTime(Date activeTime) { + this.activeTime = activeTime; + } + +} diff --git a/src/main/java/com/ifish/entity/CameraActive.java b/src/main/java/com/ifish/entity/CameraActive.java new file mode 100644 index 0000000..ad3e5ff --- /dev/null +++ b/src/main/java/com/ifish/entity/CameraActive.java @@ -0,0 +1,48 @@ +package com.ifish.entity; + +import java.io.Serializable; +import java.util.Date; + +/** + * @ClassName: tbl_camera_active + * @date 2015年7月2日 下午16:40:00 + * + */ +public class CameraActive implements Serializable{ + + private static final long serialVersionUID = 2069622365188365453L; + //激活码 + private String activeCode; + //批次号 + private String batchCode; + //是否使用 + private String isUsed; + //创建时间 + private Date createTime; + + public String getActiveCode() { + return activeCode; + } + public void setActiveCode(String activeCode) { + this.activeCode = activeCode; + } + public String getBatchCode() { + return batchCode; + } + public void setBatchCode(String batchCode) { + this.batchCode = batchCode; + } + public Date getCreateTime() { + return createTime; + } + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + public String getIsUsed() { + return isUsed; + } + public void setIsUsed(String isUsed) { + this.isUsed = isUsed; + } + +} diff --git a/src/main/java/com/ifish/entity/CameraUser.java b/src/main/java/com/ifish/entity/CameraUser.java new file mode 100644 index 0000000..bcd5b44 --- /dev/null +++ b/src/main/java/com/ifish/entity/CameraUser.java @@ -0,0 +1,72 @@ +package com.ifish.entity; + +import java.io.Serializable; +import java.util.Date; + +/** + * @ClassName: tbl_camera_user + * @date 2015年7月2日 下午16:40:00 + * + */ +public class CameraUser implements Serializable{ + + private static final long serialVersionUID = -5292867602998823697L; + //ID + private CameraUserId cameraUserId; + //1、主控制权,0、被分享者 + private String isMaster; + //显示名称 + private String showName; + //是否看护 + private String isLook; + //是否直播 + private String isLive; + //修改时间 + private Date updateTime; + //创建时间 + private Date createTime; + + public String getShowName() { + return showName; + } + public void setShowName(String showName) { + this.showName = showName; + } + public Date getUpdateTime() { + return updateTime; + } + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + public Date getCreateTime() { + return createTime; + } + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + public String getIsMaster() { + return isMaster; + } + public void setIsMaster(String isMaster) { + this.isMaster = isMaster; + } + public CameraUserId getCameraUserId() { + return cameraUserId; + } + public void setCameraUserId(CameraUserId cameraUserId) { + this.cameraUserId = cameraUserId; + } + public String getIsLook() { + return isLook; + } + public void setIsLook(String isLook) { + this.isLook = isLook; + } + public String getIsLive() { + return isLive; + } + public void setIsLive(String isLive) { + this.isLive = isLive; + } + +} diff --git a/src/main/java/com/ifish/entity/CameraUserId.java b/src/main/java/com/ifish/entity/CameraUserId.java new file mode 100644 index 0000000..0c6e140 --- /dev/null +++ b/src/main/java/com/ifish/entity/CameraUserId.java @@ -0,0 +1,52 @@ +package com.ifish.entity; + +import java.io.Serializable; + +public class CameraUserId implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer userId; + private String cameraId; + + public CameraUserId() { + } + + public CameraUserId(Integer userId, String cameraId) { + this.userId = userId; + this.cameraId = cameraId; + } + + public Integer getUserId() { + return userId; + } + + public void setUserId(Integer userId) { + this.userId = userId; + } + + public String getCameraId() { + return cameraId; + } + + public void setCameraId(String cameraId) { + this.cameraId = cameraId; + } + + @Override + public boolean equals(Object obj) { + if(obj instanceof CameraUserId){ + CameraUserId pk=(CameraUserId)obj; + if(this.userId.equals(pk.userId) && this.cameraId.equals(pk.cameraId)){ + return true; + } + } + return false; + } + + @Override + public int hashCode() { + return super.hashCode(); + } + +} diff --git a/src/main/java/com/ifish/entity/Comment.java b/src/main/java/com/ifish/entity/Comment.java new file mode 100644 index 0000000..ba78997 --- /dev/null +++ b/src/main/java/com/ifish/entity/Comment.java @@ -0,0 +1,130 @@ +package com.ifish.entity; + +import java.io.Serializable; +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Transient; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.ifish.serializer.CustomDateSerializer; + +/** + * @ClassName: tbl_comment + * @date 2015年7月2日 下午16:40:00 * + */ +@Entity +@Table(name="tbl_comment") +public class Comment implements Serializable{ + + private static final long serialVersionUID = 1312658178156695378L; + /** + * ID + */ + @Id + @GeneratedValue(strategy=GenerationType.IDENTITY) + @Column(name="comment_id") + private Integer commentId; + /** + * 编辑器ID + */ + @Column(name="ueditor_id") + private Integer ueditorId; + /** + * 用户ID + */ + @Column(name="user_id") + private Integer userId; + /** + * 回复用户ID + */ + @Column(name="as_user_id") + private Integer asUserId; + /** + * 回复用户名称 + */ + @Transient + private String asUserName; + /** + * 头像 + */ + @Transient + private String userImg; + /** + * 用户 + */ + @Transient + private String userName; + /** + * 内容 + */ + @Column(name="comment_content",nullable=true,length=200) + private String commentContent; + /** + * 创建时间 + */ + @JsonSerialize(using = CustomDateSerializer.class) + @Column(name="create_time",columnDefinition="timestamp",updatable=false,length=1) + private Date createTime; + + public Integer getCommentId() { + return commentId; + } + public void setCommentId(Integer commentId) { + this.commentId = commentId; + } + public Integer getUeditorId() { + return ueditorId; + } + public void setUeditorId(Integer ueditorId) { + this.ueditorId = ueditorId; + } + public Integer getUserId() { + return userId; + } + public void setUserId(Integer userId) { + this.userId = userId; + } + public String getCommentContent() { + return commentContent; + } + public void setCommentContent(String commentContent) { + this.commentContent = commentContent; + } + public Date getCreateTime() { + return createTime; + } + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + public String getUserImg() { + return userImg; + } + public void setUserImg(String userImg) { + this.userImg = userImg; + } + public String getUserName() { + return userName; + } + public void setUserName(String userName) { + this.userName = userName; + } + public Integer getAsUserId() { + return asUserId; + } + public void setAsUserId(Integer asUserId) { + this.asUserId = asUserId; + } + public String getAsUserName() { + return asUserName; + } + public void setAsUserName(String asUserName) { + this.asUserName = asUserName; + } + +} diff --git a/src/main/java/com/ifish/entity/Coupon.java b/src/main/java/com/ifish/entity/Coupon.java new file mode 100644 index 0000000..37ee943 --- /dev/null +++ b/src/main/java/com/ifish/entity/Coupon.java @@ -0,0 +1,155 @@ +package com.ifish.entity; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import javax.persistence.Transient; + +/** + * 优惠券 + * @author Administrator + * + */ +@Entity +@Table(name="tbl_coupon") +public class Coupon implements Serializable { + + private static final long serialVersionUID = 970686228633163972L; + /** + * 优惠券ID + */ + @Id + @GeneratedValue(strategy=GenerationType.IDENTITY) + @Column(name="coupon_id") + private Integer couponId; + /** + * 兑换RMB价值 + */ + @Column(name="money_value",nullable=false) + private Integer moneyValue; + /** + * 兑换所需金币 + */ + @Column(name="need_gold",precision=6,scale=2,nullable=false) + private BigDecimal needGold; + /** + * 使用兑换券需要消费金额 + */ + @Column(name="use_need_money",nullable=false) + private Integer useNeedMoney; + /** + * 用户所能兑换数量 + */ + @Column(name="upper_limit") + private Integer upperLimit; + /** + * 优惠券数量 + */ + @Column(name="coupon_number") + private Integer couponNumber; + /** + * 文字标签 + */ + @Column(name="tag_text",length=20) + private String tagText; + /** + * 有效开始时间 + */ + @Column(name="valid_start_date") + @Temporal(TemporalType.DATE) + private Date validStartDate; + /** + * 有效结束时间 + */ + @Column(name="valid_end_date") + @Temporal(TemporalType.DATE) + private Date validEndDate; + /** + * 更新时间 + */ + @Column(name="update_time") + @Temporal(TemporalType.TIMESTAMP) + private Date updateTime; + /** + * 兑换数量 + */ + @Transient + private Integer exchangeCount; + + public Integer getCouponId() { + return couponId; + } + public void setCouponId(Integer couponId) { + this.couponId = couponId; + } + public Integer getMoneyValue() { + return moneyValue; + } + public void setMoneyValue(Integer moneyValue) { + this.moneyValue = moneyValue; + } + public BigDecimal getNeedGold() { + return needGold; + } + public void setNeedGold(BigDecimal needGold) { + this.needGold = needGold; + } + public Integer getUseNeedMoney() { + return useNeedMoney; + } + public void setUseNeedMoney(Integer useNeedMoney) { + this.useNeedMoney = useNeedMoney; + } + public String getTagText() { + return tagText; + } + public void setTagText(String tagText) { + this.tagText = tagText; + } + public Date getValidStartDate() { + return validStartDate; + } + public void setValidStartDate(Date validStartDate) { + this.validStartDate = validStartDate; + } + public Date getValidEndDate() { + return validEndDate; + } + public void setValidEndDate(Date validEndDate) { + this.validEndDate = validEndDate; + } + public Integer getUpperLimit() { + return upperLimit; + } + public void setUpperLimit(Integer upperLimit) { + this.upperLimit = upperLimit; + } + public Integer getExchangeCount() { + return exchangeCount; + } + public void setExchangeCount(Integer exchangeCount) { + this.exchangeCount = exchangeCount; + } + public Integer getCouponNumber() { + return couponNumber; + } + public void setCouponNumber(Integer couponNumber) { + this.couponNumber = couponNumber; + } + public Date getUpdateTime() { + return updateTime; + } + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + +} diff --git a/src/main/java/com/ifish/entity/CouponRecord.java b/src/main/java/com/ifish/entity/CouponRecord.java new file mode 100644 index 0000000..3e5814d --- /dev/null +++ b/src/main/java/com/ifish/entity/CouponRecord.java @@ -0,0 +1,164 @@ +package com.ifish.entity; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; + +/** + * 优惠券兑换记录 + * @author Administrator + * + */ +@Entity +@Table(name="tbl_coupon_record") +public class CouponRecord implements Serializable { + + private static final long serialVersionUID = 5703119042203252824L; + /** + *记录ID + */ + @Id + @GeneratedValue(strategy=GenerationType.IDENTITY) + @Column(name="record_id") + private Integer recordId; + /** + * 用户ID + */ + @Column(name="user_id",nullable=false) + private Integer userId; + /** + * 优惠券ID + */ + @Column(name="coupon_id",nullable=false) + private Integer couponId; + /** + * 兑换RMB价值 + */ + @Column(name="money_value",nullable=false) + private Integer moneyValue; + /** + * 兑换所需金币 + */ + @Column(name="need_gold",precision=6,scale=2,nullable=false) + private BigDecimal needGold; + /** + * 使用兑换券需要消费金额 + */ + @Column(name="use_need_money",nullable=false) + private Integer useNeedMoney; + /** + * 文字标签 + */ + @Column(name="tag_text",length=20) + private String tagText; + /** + * 有效开始时间 + */ + @Column(name="valid_start_date") + @Temporal(TemporalType.DATE) + private Date validStartDate; + /** + * 有效结束时间 + */ + @Column(name="valid_end_date") + @Temporal(TemporalType.DATE) + private Date validEndDate; + /** + * 激活码 + */ + @Column(name="activation_code",length=8,nullable=false) + private String activationCode; + /** + * 是否使用过 + */ + @Column(name="is_used",nullable=false,length=1) + private String isUsed; + /** + * 创建时间 + */ + @Column(name="create_time") + @Temporal(TemporalType.TIMESTAMP) + private Date createTime; + + public Integer getRecordId() { + return recordId; + } + public void setRecordId(Integer recordId) { + this.recordId = recordId; + } + public Integer getUserId() { + return userId; + } + public void setUserId(Integer userId) { + this.userId = userId; + } + public Integer getCouponId() { + return couponId; + } + public void setCouponId(Integer couponId) { + this.couponId = couponId; + } + public String getActivationCode() { + return activationCode; + } + public void setActivationCode(String activationCode) { + this.activationCode = activationCode; + } + public String getIsUsed() { + return isUsed; + } + public void setIsUsed(String isUsed) { + this.isUsed = isUsed; + } + public Date getCreateTime() { + return createTime; + } + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + public Date getValidStartDate() { + return validStartDate; + } + public void setValidStartDate(Date validStartDate) { + this.validStartDate = validStartDate; + } + public Date getValidEndDate() { + return validEndDate; + } + public void setValidEndDate(Date validEndDate) { + this.validEndDate = validEndDate; + } + public Integer getMoneyValue() { + return moneyValue; + } + public void setMoneyValue(Integer moneyValue) { + this.moneyValue = moneyValue; + } + public BigDecimal getNeedGold() { + return needGold; + } + public void setNeedGold(BigDecimal needGold) { + this.needGold = needGold; + } + public Integer getUseNeedMoney() { + return useNeedMoney; + } + public void setUseNeedMoney(Integer useNeedMoney) { + this.useNeedMoney = useNeedMoney; + } + public String getTagText() { + return tagText; + } + public void setTagText(String tagText) { + this.tagText = tagText; + } +} diff --git a/src/main/java/com/ifish/entity/Device.java b/src/main/java/com/ifish/entity/Device.java new file mode 100644 index 0000000..07643bf --- /dev/null +++ b/src/main/java/com/ifish/entity/Device.java @@ -0,0 +1,152 @@ +package com.ifish.entity; + +import java.io.Serializable; +import java.util.Date; + +/** + * @ClassName: tbl_device + * @date 2015年7月2日 下午16:40:00 + * + */ +public class Device implements Serializable{ + + private static final long serialVersionUID = -2890074039912965824L; + //设备ID + private Integer deviceId; + //服务器IP + private String serverIP; + //设备IP + private String deviceIP; + //设备MAC地址 + private String macAddress; + //登陆次数 + private Integer loginCount; + //厂家 + private String brandCode; + //硬件型号 + private String hardwareType; + //版本 + private String softwareVersion; + //最后一次登陆时间 + private Date loginTime; + //是否是黑名单:1是,0否 + private String isBlacklist; + //首次激活时间 + private Date firstActivate; + //创建时间 + private Date createTime; + //分配日期 + private Date createDate; + //是否开启换水提醒 + private String waterRemind; + //换水提醒日期 + private Date remindDate; + //换水周期 + private Integer remindCycle; + //今天是否需要提醒 + private String todayRemind; + + public Integer getDeviceId() { + return deviceId; + } + public void setDeviceId(Integer deviceId) { + this.deviceId = deviceId; + } + public String getServerIP() { + return serverIP; + } + public void setServerIP(String serverIP) { + this.serverIP = serverIP; + } + public String getDeviceIP() { + return deviceIP; + } + public void setDeviceIP(String deviceIP) { + this.deviceIP = deviceIP; + } + public String getMacAddress() { + return macAddress; + } + public void setMacAddress(String macAddress) { + this.macAddress = macAddress; + } + public Integer getLoginCount() { + return loginCount; + } + public void setLoginCount(Integer loginCount) { + this.loginCount = loginCount; + } + public Date getLoginTime() { + return loginTime; + } + public void setLoginTime(Date loginTime) { + this.loginTime = loginTime; + } + public Date getCreateTime() { + return createTime; + } + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + public String getIsBlacklist() { + return isBlacklist; + } + public void setIsBlacklist(String isBlacklist) { + this.isBlacklist = isBlacklist; + } + public Date getFirstActivate() { + return firstActivate; + } + public void setFirstActivate(Date firstActivate) { + this.firstActivate = firstActivate; + } + public String getHardwareType() { + return hardwareType; + } + public void setHardwareType(String hardwareType) { + this.hardwareType = hardwareType; + } + public String getSoftwareVersion() { + return softwareVersion; + } + public void setSoftwareVersion(String softwareVersion) { + this.softwareVersion = softwareVersion; + } + public String getWaterRemind() { + return waterRemind; + } + public void setWaterRemind(String waterRemind) { + this.waterRemind = waterRemind; + } + public Date getRemindDate() { + return remindDate; + } + public void setRemindDate(Date remindDate) { + this.remindDate = remindDate; + } + public Integer getRemindCycle() { + return remindCycle; + } + public void setRemindCycle(Integer remindCycle) { + this.remindCycle = remindCycle; + } + public String getTodayRemind() { + return todayRemind; + } + public void setTodayRemind(String todayRemind) { + this.todayRemind = todayRemind; + } + public String getBrandCode() { + return brandCode; + } + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + public Date getCreateDate() { + return createDate; + } + public void setCreateDate(Date createDate) { + this.createDate = createDate; + } + +} diff --git a/src/main/java/com/ifish/entity/DeviceCamera.java b/src/main/java/com/ifish/entity/DeviceCamera.java new file mode 100644 index 0000000..38815d7 --- /dev/null +++ b/src/main/java/com/ifish/entity/DeviceCamera.java @@ -0,0 +1,22 @@ +package com.ifish.entity; + +import java.io.Serializable; + +/** + * @ClassName: tbl_device_camera + * @date 2015年7月2日 下午16:40:00 + * + */ +public class DeviceCamera implements Serializable{ + + private static final long serialVersionUID = 3231903227046749991L; + //ID + private DeviceCameraId deviceCameraId; + + public DeviceCameraId getDeviceCameraId() { + return deviceCameraId; + } + public void setDeviceCameraId(DeviceCameraId deviceCameraId) { + this.deviceCameraId = deviceCameraId; + } +} diff --git a/src/main/java/com/ifish/entity/DeviceCameraId.java b/src/main/java/com/ifish/entity/DeviceCameraId.java new file mode 100644 index 0000000..4cc52eb --- /dev/null +++ b/src/main/java/com/ifish/entity/DeviceCameraId.java @@ -0,0 +1,47 @@ +package com.ifish.entity; + +import java.io.Serializable; + +public class DeviceCameraId implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer deviceId; + private String cameraId; + + public DeviceCameraId() { + } + public DeviceCameraId(Integer deviceId, String cameraId) { + this.deviceId = deviceId; + this.cameraId = cameraId; + } + public Integer getDeviceId() { + return deviceId; + } + public void setDeviceId(Integer deviceId) { + this.deviceId = deviceId; + } + public String getCameraId() { + return cameraId; + } + public void setCameraId(String cameraId) { + this.cameraId = cameraId; + } + + @Override + public boolean equals(Object obj) { + if(obj instanceof DeviceCameraId){ + DeviceCameraId pk=(DeviceCameraId)obj; + if(this.deviceId.equals(pk.deviceId)&&this.cameraId.equals(pk.cameraId)){ + return true; + } + } + return false; + } + + @Override + public int hashCode() { + return super.hashCode(); + } + +} diff --git a/src/main/java/com/ifish/entity/DeviceUser.java b/src/main/java/com/ifish/entity/DeviceUser.java new file mode 100644 index 0000000..69251c0 --- /dev/null +++ b/src/main/java/com/ifish/entity/DeviceUser.java @@ -0,0 +1,84 @@ +package com.ifish.entity; + +import java.io.Serializable; +import java.util.Date; + +/** + * @ClassName: tbl_device_user + * @date 2015年7月2日 下午16:40:00 + * + */ +public class DeviceUser implements Serializable{ + + private static final long serialVersionUID = -6056043883433438749L; + //ID + private DeviceUserId priId = new DeviceUserId(); + //1、主控制权,0、被分享者 + private String isMaster; + //显示名称 + private String showName; + //保存的显示图标 + private String customIconName; + //保存的显示名称 + private String customShowName; + //修改时间 + private Date updateTime; + //创建时间 + private Date createTime; + + public DeviceUser() {} + + public DeviceUser(DeviceUserId priId, String isMaster, String showName) { + this.priId = priId; + this.isMaster = isMaster; + this.showName = showName; + this.customIconName = ""; + this.customShowName = ""; + this.updateTime = new Date(); + this.createTime = new Date(); + } + + public DeviceUserId getPriId() { + return priId; + } + public void setPriId(DeviceUserId priId) { + this.priId = priId; + } + public String getShowName() { + return showName; + } + public void setShowName(String showName) { + this.showName = showName; + } + public Date getUpdateTime() { + return updateTime; + } + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + public Date getCreateTime() { + return createTime; + } + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + public String getIsMaster() { + return isMaster; + } + public void setIsMaster(String isMaster) { + this.isMaster = isMaster; + } + public String getCustomIconName() { + return customIconName; + } + public void setCustomIconName(String customIconName) { + this.customIconName = customIconName; + } + public String getCustomShowName() { + return customShowName; + } + public void setCustomShowName(String customShowName) { + this.customShowName = customShowName; + } + +} diff --git a/src/main/java/com/ifish/entity/DeviceUserId.java b/src/main/java/com/ifish/entity/DeviceUserId.java new file mode 100644 index 0000000..de09193 --- /dev/null +++ b/src/main/java/com/ifish/entity/DeviceUserId.java @@ -0,0 +1,47 @@ +package com.ifish.entity; + +import java.io.Serializable; + +public class DeviceUserId implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer userId; + private Integer deviceId; + + public DeviceUserId() {} + + public DeviceUserId(Integer userId, Integer deviceId) { + this.userId = userId; + this.deviceId = deviceId; + } + public Integer getUserId() { + return userId; + } + public void setUserId(Integer userId) { + this.userId = userId; + } + public Integer getDeviceId() { + return deviceId; + } + public void setDeviceId(Integer deviceId) { + this.deviceId = deviceId; + } + + @Override + public boolean equals(Object obj) { + if(obj instanceof DeviceUserId){ + DeviceUserId pk=(DeviceUserId)obj; + if(this.userId.equals(pk.userId)&&this.deviceId.equals(pk.deviceId)){ + return true; + } + } + return false; + } + + @Override + public int hashCode() { + return super.hashCode(); + } + +} diff --git a/src/main/java/com/ifish/entity/GoldControl.java b/src/main/java/com/ifish/entity/GoldControl.java new file mode 100644 index 0000000..d520a6c --- /dev/null +++ b/src/main/java/com/ifish/entity/GoldControl.java @@ -0,0 +1,71 @@ +package com.ifish.entity; + +import java.io.Serializable; +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +/** + * 等级控制信息 + * @author Administrator + * + */ +@Entity +@Table(name="tbl_gold_control") +public class GoldControl implements Serializable{ + + private static final long serialVersionUID = -4825126780492039784L; + /** + * ID + */ + @Id + private GoldControlId goldControlId; + /** + * 控制日期参数 + */ + @Column(name="control_param",nullable=false,length=10) + private String controlParam; + + /** + * 更新日期 + */ + @Column(name="update_time",columnDefinition="timestamp") + private Date updateTime; + + public GoldControl() {} + + public GoldControl(GoldControlId goldControlId, String controlParam, + Date updateTime) { + this.goldControlId = goldControlId; + this.controlParam = controlParam; + this.updateTime = updateTime; + } + + public GoldControlId getGoldControlId() { + return goldControlId; + } + + public void setGoldControlId(GoldControlId goldControlId) { + this.goldControlId = goldControlId; + } + + public String getControlParam() { + return controlParam; + } + + public void setControlParam(String controlParam) { + this.controlParam = controlParam; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + +} diff --git a/src/main/java/com/ifish/entity/GoldControlId.java b/src/main/java/com/ifish/entity/GoldControlId.java new file mode 100644 index 0000000..095e2fe --- /dev/null +++ b/src/main/java/com/ifish/entity/GoldControlId.java @@ -0,0 +1,60 @@ +package com.ifish.entity; + +import java.io.Serializable; + +import javax.persistence.Column; +import javax.persistence.Embeddable; + +/** + * 金币控制信息ID + * @author Administrator + * + */ +@Embeddable +public class GoldControlId implements Serializable{ + + private static final long serialVersionUID = -728035080350308137L; + /** + * 用户ID + */ + @Column(name="user_id") + private Integer userId; + /** + * 规则类型 + */ + @Column(name="task_type",nullable=false,length=20) + private String ruleType; + + public GoldControlId() {} + + public GoldControlId(Integer userId, String ruleType) { + this.userId = userId; + this.ruleType = ruleType; + } + + public Integer getUserId() { + return userId; + } + public void setUserId(Integer userId) { + this.userId = userId; + } + + public String getRuleType() { + return ruleType; + } + + public void setRuleType(String ruleType) { + this.ruleType = ruleType; + } + + @Override + public int hashCode() { + return super.hashCode(); + } + + @Override + public boolean equals(Object obj) { + return super.equals(obj); + } + +} diff --git a/src/main/java/com/ifish/entity/GoldExpendRecord.java b/src/main/java/com/ifish/entity/GoldExpendRecord.java new file mode 100644 index 0000000..07cf10f --- /dev/null +++ b/src/main/java/com/ifish/entity/GoldExpendRecord.java @@ -0,0 +1,129 @@ +package com.ifish.entity; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.ifish.enums.GoldExpendTypeEnum; +import com.ifish.serializer.CustomDateSerializer; + +/** + * 获取金币记录 + * @author Administrator + * + */ +@Entity +@Table(name="tbl_gold_expend_record") +public class GoldExpendRecord implements Serializable{ + + private static final long serialVersionUID = 8682996968614095485L; + /** + * 记录ID + */ + @Id + @GeneratedValue(strategy=GenerationType.IDENTITY) + @Column(name="record_id") + private Integer recordId; + /** + * 用户ID + */ + @Column(name="user_id",nullable=false) + private Integer userId; + /** + * 消耗方式 + */ + @Column(name="expend_type",nullable=false,length=20) + private String expendType; + /** + * 消耗值 + */ + @Column(name="expend_value",nullable=false,precision=6,scale=2) + private BigDecimal expendValue; + /** + * ID + */ + @Column(name="relation_id") + private Integer relationId; + /** + * 记录描述 + */ + @Column(name="record_remark",nullable=false,length=50) + private String recordRemark; + /** + * 创建时间 + */ + @JsonSerialize(using = CustomDateSerializer.class) + @Column(name="create_time",nullable=false) + @Temporal(TemporalType.TIMESTAMP) + private Date createTime; + + public GoldExpendRecord() {} + + public GoldExpendRecord(Integer userId,BigDecimal expendValue,GoldExpendTypeEnum goldExpendType) { + this.userId = userId; + this.expendValue = expendValue; + this.expendType = goldExpendType.getKey(); + this.recordRemark = goldExpendType.getValue(); + this.createTime = new Date(); + } + + public Integer getRecordId() { + return recordId; + } + public void setRecordId(Integer recordId) { + this.recordId = recordId; + } + public String getRecordRemark() { + return recordRemark; + } + public void setRecordRemark(String recordRemark) { + this.recordRemark = recordRemark; + } + public Date getCreateTime() { + return createTime; + } + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + public Integer getUserId() { + return userId; + } + public void setUserId(Integer userId) { + this.userId = userId; + } + + public String getExpendType() { + return expendType; + } + + public void setExpendType(String expendType) { + this.expendType = expendType; + } + + public BigDecimal getExpendValue() { + return expendValue; + } + + public void setExpendValue(BigDecimal expendValue) { + this.expendValue = expendValue; + } + + public Integer getRelationId() { + return relationId; + } + + public void setRelationId(Integer relationId) { + this.relationId = relationId; + } + +} diff --git a/src/main/java/com/ifish/entity/GoldGetRecord.java b/src/main/java/com/ifish/entity/GoldGetRecord.java new file mode 100644 index 0000000..740c952 --- /dev/null +++ b/src/main/java/com/ifish/entity/GoldGetRecord.java @@ -0,0 +1,133 @@ +package com.ifish.entity; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.ifish.enums.GoldGetTypeEnum; +import com.ifish.serializer.CustomDateSerializer; + +/** + * 获取金币记录 + * @author Administrator + * + */ +@Entity +@Table(name="tbl_gold_get_record") +public class GoldGetRecord implements Serializable{ + + private static final long serialVersionUID = 8682996968614095485L; + /** + * 记录ID + */ + @Id + @GeneratedValue(strategy=GenerationType.IDENTITY) + @Column(name="record_id") + private Integer recordId; + /** + * 用户ID + */ + @Column(name="user_id",nullable=false) + private Integer userId; + /** + * 获取方式 + */ + @Column(name="get_type",nullable=false,length=20) + private String ruleType; + /** + * 金币值 + */ + @Column(name="get_value",nullable=false,precision=3,scale=2) + private BigDecimal addValue; + /** + * 问题ID + */ + @Column(name="relation_id") + private Integer relationId; + /** + * 记录描述 + */ + @Column(name="record_remark",nullable=false,length=50) + private String recordRemark; + /** + * 创建时间 + */ + @JsonSerialize(using = CustomDateSerializer.class) + @Column(name="create_time",nullable=false) + @Temporal(TemporalType.TIMESTAMP) + private Date createTime; + + public GoldGetRecord() {} + + public GoldGetRecord(Integer userId, String ruleType, + BigDecimal addValue, String recordRemark) { + this.userId = userId; + this.ruleType = ruleType; + this.addValue = addValue; + this.recordRemark = recordRemark; + this.createTime = new Date(); + } + public GoldGetRecord(Integer userId,BigDecimal addValue,GoldGetTypeEnum goldGetTypeEnum) { + this.userId = userId; + this.addValue = addValue; + this.ruleType = goldGetTypeEnum.getKey(); + this.recordRemark = goldGetTypeEnum.getValue(); + this.createTime = new Date(); + } + + public Integer getRecordId() { + return recordId; + } + public void setRecordId(Integer recordId) { + this.recordId = recordId; + } + public String getRecordRemark() { + return recordRemark; + } + public void setRecordRemark(String recordRemark) { + this.recordRemark = recordRemark; + } + public Date getCreateTime() { + return createTime; + } + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + public Integer getUserId() { + return userId; + } + public void setUserId(Integer userId) { + this.userId = userId; + } + public String getRuleType() { + return ruleType; + } + public void setRuleType(String ruleType) { + this.ruleType = ruleType; + } + public BigDecimal getAddValue() { + return addValue; + } + public void setAddValue(BigDecimal addValue) { + this.addValue = addValue; + } + public Integer getRelationId() { + return relationId; + } + + public void setRelationId(Integer relationId) { + this.relationId = relationId; + } + + +} diff --git a/src/main/java/com/ifish/entity/GoldTask.java b/src/main/java/com/ifish/entity/GoldTask.java new file mode 100644 index 0000000..fd48b1c --- /dev/null +++ b/src/main/java/com/ifish/entity/GoldTask.java @@ -0,0 +1,101 @@ +package com.ifish.entity; + +import java.io.Serializable; +import java.math.BigDecimal; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +/** + * 获取金币规则 + * @author Administrator + * + */ +@Entity +@Table(name="tbl_gold_task") +public class GoldTask implements Serializable{ + + private static final long serialVersionUID = -3681549432190225803L; + /** + * 规则类型 + */ + @Id + @Column(name="task_type",nullable=false,length=20) + private String ruleType; + /** + * 规则名称 + */ + @Column(name="task_name",nullable=false,length=20) + private String ruleName; + /** + * 增加金币值 + */ + @Column(name="add_value",nullable=false,precision=3,scale=2) + private BigDecimal addValue; + /** + * 加成类型(once:一次,everyDay:每天,everyTime:每次) + */ + @Column(name="add_type",nullable=false,length=20) + private String addType; + /** + * 是否返回app显示(1:是,0:否) + */ + @Column(name="state",nullable=false,length=1) + private String state; + /** + * 排序字段 + */ + @Column(name="order_num") + private Integer orderNum; + /** + * 任务描述 + */ + @Column(name="task_remark",nullable=false,length=50) + private String ruleRemark; + + public String getRuleType() { + return ruleType; + } + public void setRuleType(String ruleType) { + this.ruleType = ruleType; + } + public String getRuleName() { + return ruleName; + } + public void setRuleName(String ruleName) { + this.ruleName = ruleName; + } + public BigDecimal getAddValue() { + return addValue; + } + public void setAddValue(BigDecimal addValue) { + this.addValue = addValue; + } + public String getAddType() { + return addType; + } + public void setAddType(String addType) { + this.addType = addType; + } + public String getState() { + return state; + } + public void setState(String state) { + this.state = state; + } + public String getRuleRemark() { + return ruleRemark; + } + public void setRuleRemark(String ruleRemark) { + this.ruleRemark = ruleRemark; + } + public Integer getOrderNum() { + return orderNum; + } + public void setOrderNum(Integer orderNum) { + this.orderNum = orderNum; + } + +} diff --git a/src/main/java/com/ifish/entity/Grade.java b/src/main/java/com/ifish/entity/Grade.java new file mode 100644 index 0000000..068b2c4 --- /dev/null +++ b/src/main/java/com/ifish/entity/Grade.java @@ -0,0 +1,90 @@ +package com.ifish.entity; + +import java.io.Serializable; +import java.math.BigDecimal; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +/** + * 等级信息 + * @author Administrator + * + */ +@Entity +@Table(name="tbl_grade") +public class Grade implements Serializable{ + + private static final long serialVersionUID = -4501110511210925531L; + /** + * 等级 + */ + @Id + @Column(name="grade_num") + private Integer gradeNum; + /** + * 等级名称 + */ + @Column(name="grade_name",nullable=false,length=10) + private String gradeName; + /** + * 最小经验值<= + */ + @Column(name="min_value",nullable=false) + private Integer minValue; + /** + * 最大经验值< + */ + @Column(name="max_value",nullable=false) + private Integer maxValue; + /** + * 金币加成 + */ + @Column(name="gold_addition",precision=3,scale=2) + private BigDecimal goldAddition; + /** + * 等级描述 + */ + @Column(name="grade_remark",nullable=false,length=50) + private String gradeRemark; + + public Integer getGradeNum() { + return gradeNum; + } + public void setGradeNum(Integer gradeNum) { + this.gradeNum = gradeNum; + } + public String getGradeName() { + return gradeName; + } + public void setGradeName(String gradeName) { + this.gradeName = gradeName; + } + public Integer getMinValue() { + return minValue; + } + public void setMinValue(Integer minValue) { + this.minValue = minValue; + } + public Integer getMaxValue() { + return maxValue; + } + public void setMaxValue(Integer maxValue) { + this.maxValue = maxValue; + } + public String getGradeRemark() { + return gradeRemark; + } + public void setGradeRemark(String gradeRemark) { + this.gradeRemark = gradeRemark; + } + public BigDecimal getGoldAddition() { + return goldAddition; + } + public void setGoldAddition(BigDecimal goldAddition) { + this.goldAddition = goldAddition; + } + +} diff --git a/src/main/java/com/ifish/entity/GradeControl.java b/src/main/java/com/ifish/entity/GradeControl.java new file mode 100644 index 0000000..b285255 --- /dev/null +++ b/src/main/java/com/ifish/entity/GradeControl.java @@ -0,0 +1,71 @@ +package com.ifish.entity; + +import java.io.Serializable; +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +/** + * 等级控制信息 + * @author Administrator + * + */ +@Entity +@Table(name="tbl_grade_control") +public class GradeControl implements Serializable{ + + private static final long serialVersionUID = 4967272971514676023L; + /** + * ID + */ + @Id + private GradeControlId gradeControlId; + /** + * 控制日期参数 + */ + @Column(name="control_param",nullable=false,length=10) + private String controlParam; + + /** + * 更新日期 + */ + @Column(name="update_time",columnDefinition="timestamp") + private Date updateTime; + + public GradeControl() {} + + public GradeControl(GradeControlId gradeControlId, String controlParam, + Date updateTime) { + this.gradeControlId = gradeControlId; + this.controlParam = controlParam; + this.updateTime = updateTime; + } + + public GradeControlId getGradeControlId() { + return gradeControlId; + } + + public void setGradeControlId(GradeControlId gradeControlId) { + this.gradeControlId = gradeControlId; + } + + public String getControlParam() { + return controlParam; + } + + public void setControlParam(String controlParam) { + this.controlParam = controlParam; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + +} diff --git a/src/main/java/com/ifish/entity/GradeControlId.java b/src/main/java/com/ifish/entity/GradeControlId.java new file mode 100644 index 0000000..a66f890 --- /dev/null +++ b/src/main/java/com/ifish/entity/GradeControlId.java @@ -0,0 +1,60 @@ +package com.ifish.entity; + +import java.io.Serializable; + +import javax.persistence.Column; +import javax.persistence.Embeddable; + +/** + * 等级控制信息ID + * @author Administrator + * + */ +@Embeddable +public class GradeControlId implements Serializable{ + + private static final long serialVersionUID = -728035080350308137L; + /** + * 用户ID + */ + @Column(name="user_id") + private Integer userId; + /** + * 规则类型 + */ + @Column(name="task_type",nullable=false,length=20) + private String ruleType; + + public GradeControlId() {} + + public GradeControlId(Integer userId, String ruleType) { + this.userId = userId; + this.ruleType = ruleType; + } + + public Integer getUserId() { + return userId; + } + public void setUserId(Integer userId) { + this.userId = userId; + } + + public String getRuleType() { + return ruleType; + } + + public void setRuleType(String ruleType) { + this.ruleType = ruleType; + } + + @Override + public int hashCode() { + return super.hashCode(); + } + + @Override + public boolean equals(Object obj) { + return super.equals(obj); + } + +} diff --git a/src/main/java/com/ifish/entity/GradeRecord.java b/src/main/java/com/ifish/entity/GradeRecord.java new file mode 100644 index 0000000..cd95593 --- /dev/null +++ b/src/main/java/com/ifish/entity/GradeRecord.java @@ -0,0 +1,115 @@ +package com.ifish.entity; + +import java.io.Serializable; +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.ifish.serializer.CustomDateSerializer; + +/** + * 等级经验值获取记录 + * @author Administrator + * + */ +@Entity +@Table(name="tbl_grade_record") +public class GradeRecord implements Serializable{ + + private static final long serialVersionUID = 4877610293427598136L; + /** + * 记录ID + */ + @Id + @GeneratedValue(strategy=GenerationType.IDENTITY) + @Column(name="record_id") + private Integer recordId; + /** + * 用户ID + */ + @Column(name="user_id",nullable=false) + private Integer userId; + /** + * 规则类型 + */ + @Column(name="task_type",nullable=false,length=20) + private String ruleType; + /** + * 增加经验值 + */ + @Column(name="add_value",nullable=false) + private Integer addValue; + /** + * 记录描述 + */ + @Column(name="record_remark",nullable=false,length=50) + private String recordRemark; + /** + * 创建时间 + */ + @JsonSerialize(using = CustomDateSerializer.class) + @Column(name="create_time",nullable=true) + @Temporal(TemporalType.TIMESTAMP) + private Date createTime; + + public GradeRecord() {} + + public GradeRecord(Integer userId, String ruleType, Integer addValue, + String recordRemark) { + this.userId = userId; + this.ruleType = ruleType; + this.addValue = addValue; + this.recordRemark = recordRemark; + this.createTime = new Date(); + } + + public Integer getRecordId() { + return recordId; + } + public void setRecordId(Integer recordId) { + this.recordId = recordId; + } + public Integer getUserId() { + return userId; + } + public void setUserId(Integer userId) { + this.userId = userId; + } + public Date getCreateTime() { + return createTime; + } + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + public String getRecordRemark() { + return recordRemark; + } + public void setRecordRemark(String recordRemark) { + this.recordRemark = recordRemark; + } + + public String getRuleType() { + return ruleType; + } + + public void setRuleType(String ruleType) { + this.ruleType = ruleType; + } + + public Integer getAddValue() { + return addValue; + } + + public void setAddValue(Integer addValue) { + this.addValue = addValue; + } + +} diff --git a/src/main/java/com/ifish/entity/GradeTask.java b/src/main/java/com/ifish/entity/GradeTask.java new file mode 100644 index 0000000..93aa487 --- /dev/null +++ b/src/main/java/com/ifish/entity/GradeTask.java @@ -0,0 +1,100 @@ +package com.ifish.entity; + +import java.io.Serializable; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +/** + * 获取经验值规则 + * @author Administrator + * + */ +@Entity +@Table(name="tbl_grade_task") +public class GradeTask implements Serializable{ + + private static final long serialVersionUID = 8410405690637553622L; + /** + * 规则类型 + */ + @Id + @Column(name="task_type",nullable=false,length=20) + private String ruleType; + /** + * 规则名称 + */ + @Column(name="task_name",nullable=false,length=20) + private String ruleName; + /** + * 增加经验值 + */ + @Column(name="add_value",nullable=false) + private Integer addValue; + /** + * 加成类型(once:一次,everyDay:每天,everyTime:每次) + */ + @Column(name="add_type",nullable=false,length=20) + private String addType; + /** + * 是否返回app显示(1:是,0:否) + */ + @Column(name="state",nullable=false,length=1) + private String state; + /** + * 排序字段 + */ + @Column(name="order_num") + private Integer orderNum; + /** + * 规则描述 + */ + @Column(name="task_remark",nullable=false,length=50) + private String ruleRemark; + + public String getRuleType() { + return ruleType; + } + public void setRuleType(String ruleType) { + this.ruleType = ruleType; + } + public String getRuleName() { + return ruleName; + } + public void setRuleName(String ruleName) { + this.ruleName = ruleName; + } + public Integer getAddValue() { + return addValue; + } + public void setAddValue(Integer addValue) { + this.addValue = addValue; + } + public String getAddType() { + return addType; + } + public void setAddType(String addType) { + this.addType = addType; + } + public String getState() { + return state; + } + public void setState(String state) { + this.state = state; + } + public Integer getOrderNum() { + return orderNum; + } + public void setOrderNum(Integer orderNum) { + this.orderNum = orderNum; + } + public String getRuleRemark() { + return ruleRemark; + } + public void setRuleRemark(String ruleRemark) { + this.ruleRemark = ruleRemark; + } + +} diff --git a/src/main/java/com/ifish/entity/HardwareType.java b/src/main/java/com/ifish/entity/HardwareType.java new file mode 100644 index 0000000..a79bbb8 --- /dev/null +++ b/src/main/java/com/ifish/entity/HardwareType.java @@ -0,0 +1,144 @@ +package com.ifish.entity; + +import java.io.Serializable; +import java.util.Date; + +/** + * @ClassName: tbl_hardware_type + * @date 2015年7月2日 下午16:40:00 + * + */ +public class HardwareType implements Serializable{ + + private static final long serialVersionUID = -3276528943627616026L; + //类型编号 + private String hardwareType; + //类型名称 + private String hardwareName; + //控制个数 + private Integer controlAmount; + //定时器个数 + private Integer timerAmount; + //是否有模式 + private String isWorkModel; + //是否自定义图标 + private String isCustomIcon; + //显示名称 + private String allShowName; + //默认图标 + private String defaultIconName; + //默认名称 + private String defaultShowName; + //自定义图标根地址 + private String iconLink; + //根地址下图标名称 + private String allIconName; + //描述 + private String hardwareDesc; + //修改时间 + private Date updateTime; + //创建时间 + private Date createTime; + //是否有背光 + private String isLightness; + //是否有柜灯 + private String isSarkLamp; + + public String getHardwareType() { + return hardwareType; + } + public void setHardwareType(String hardwareType) { + this.hardwareType = hardwareType; + } + public String getHardwareName() { + return hardwareName; + } + public void setHardwareName(String hardwareName) { + this.hardwareName = hardwareName; + } + public String getHardwareDesc() { + return hardwareDesc; + } + public void setHardwareDesc(String hardwareDesc) { + this.hardwareDesc = hardwareDesc; + } + public Date getCreateTime() { + return createTime; + } + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + public Integer getControlAmount() { + return controlAmount; + } + public void setControlAmount(Integer controlAmount) { + this.controlAmount = controlAmount; + } + public Integer getTimerAmount() { + return timerAmount; + } + public void setTimerAmount(Integer timerAmount) { + this.timerAmount = timerAmount; + } + public String getIsCustomIcon() { + return isCustomIcon; + } + public void setIsCustomIcon(String isCustomIcon) { + this.isCustomIcon = isCustomIcon; + } + public String getIconLink() { + return iconLink; + } + public void setIconLink(String iconLink) { + this.iconLink = iconLink; + } + public String getAllIconName() { + return allIconName; + } + public void setAllIconName(String allIconName) { + this.allIconName = allIconName; + } + public Date getUpdateTime() { + return updateTime; + } + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + public String getIsLightness() { + return isLightness; + } + public void setIsLightness(String isLightness) { + this.isLightness = isLightness; + } + public String getIsSarkLamp() { + return isSarkLamp; + } + public void setIsSarkLamp(String isSarkLamp) { + this.isSarkLamp = isSarkLamp; + } + public String getIsWorkModel() { + return isWorkModel; + } + public void setIsWorkModel(String isWorkModel) { + this.isWorkModel = isWorkModel; + } + public String getAllShowName() { + return allShowName; + } + public void setAllShowName(String allShowName) { + this.allShowName = allShowName; + } + public String getDefaultIconName() { + return defaultIconName; + } + public void setDefaultIconName(String defaultIconName) { + this.defaultIconName = defaultIconName; + } + public String getDefaultShowName() { + return defaultShowName; + } + public void setDefaultShowName(String defaultShowName) { + this.defaultShowName = defaultShowName; + } + +} diff --git a/src/main/java/com/ifish/entity/IfishDoctor.java b/src/main/java/com/ifish/entity/IfishDoctor.java new file mode 100644 index 0000000..2e83443 --- /dev/null +++ b/src/main/java/com/ifish/entity/IfishDoctor.java @@ -0,0 +1,106 @@ +package com.ifish.entity; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; + +import org.hibernate.validator.constraints.Length; +import org.hibernate.validator.constraints.NotBlank; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.ifish.serializer.CustomDateSerializer; + +/** + * @ClassName: tbl_fish_doctor + * @date 2015年7月2日 下午16:40:00 * + */ +@Entity +@Table(name="tbl_fish_doctor") +public class IfishDoctor implements Serializable{ + + private static final long serialVersionUID = -4328045174375463938L; + /** + * ID + */ + @Id + @GeneratedValue(strategy=GenerationType.IDENTITY) + @Column(name="question_id") + private Integer questionId; + /** + * 用户ID + */ + @Column(name="user_id",nullable=true) + @NotNull + @Min(1) + private Integer userId; + /** + * 是否打赏 + */ + @Column(name="is_pay_tour",nullable=false,length=1) + private String isPayTour; + /** + * 打赏金额 + */ + @Column(name="pay_tour_sum",nullable=false) + private BigDecimal payTourSum; + /** + * 提问内容 + */ + @Column(name="question_content",nullable=true,length=200) + @NotBlank + @Length(max=200) + private String questionContent; + /** + * 创建时间 + */ + @JsonSerialize(using = CustomDateSerializer.class) + @Column(name="create_time",columnDefinition="timestamp",updatable=false,length=1) + private Date createTime; + + public Integer getQuestionId() { + return questionId; + } + public void setQuestionId(Integer questionId) { + this.questionId = questionId; + } + public Integer getUserId() { + return userId; + } + public void setUserId(Integer userId) { + this.userId = userId; + } + public String getQuestionContent() { + return questionContent; + } + public void setQuestionContent(String questionContent) { + this.questionContent = questionContent; + } + public Date getCreateTime() { + return createTime; + } + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + public String getIsPayTour() { + return isPayTour; + } + public void setIsPayTour(String isPayTour) { + this.isPayTour = isPayTour; + } + public BigDecimal getPayTourSum() { + return payTourSum; + } + public void setPayTourSum(BigDecimal payTourSum) { + this.payTourSum = payTourSum; + } + +} diff --git a/src/main/java/com/ifish/entity/IfishGoods.java b/src/main/java/com/ifish/entity/IfishGoods.java new file mode 100644 index 0000000..af28c72 --- /dev/null +++ b/src/main/java/com/ifish/entity/IfishGoods.java @@ -0,0 +1,160 @@ +package com.ifish.entity; + +import java.io.Serializable; +import java.math.BigDecimal; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Transient; + +/** + * 商品管理 + * @author Administrator + * + */ +@Entity +@Table(name="tbl_ifish_goods") +public class IfishGoods implements Serializable{ + + private static final long serialVersionUID = -5086333556284372931L; + /** + * 商品ID + */ + @Id + @GeneratedValue(strategy=GenerationType.IDENTITY) + @Column(name="goods_id") + private Integer goodsId; + /** + * 商品名称 + */ + @Column(name="goods_name",nullable=false,length=20) + private String goodsName; + /** + * 是否是淘宝链接 + */ + @Column(name="is_taobao_link",nullable=false) + private Integer isTaobaoLink; + /** + * 商品链接 + */ + @Column(name="goods_link",nullable=false,length=100) + private String goodsLink; + /** + * 商铺图片 + */ + @Column(name="goods_picture",nullable=false,length=20) + private String goodsPicture; + /** + * 原价格 + */ + @Column(name="ori_price",nullable=false,scale=2,precision=7) + private BigDecimal oriPrice; + /** + * 优惠价格 + */ + @Column(name="pre_price",nullable=false,scale=2,precision=7) + private BigDecimal prePrice; + /** + * 是否显示 + */ + @Column(name="is_show",nullable=false) + private Integer isShow; + /** + * 商品位置 + */ + @Column(name="goods_place",nullable=false) + private Integer goodsPlace; + /** + * 所属店铺 + */ + @Column(name="shop_id",nullable=false) + private Integer shopId; + /** + * 点击量 + */ + @Column(name="click_num",nullable=false) + private Integer clickNum; + /** + * 店铺名称 + */ + @Transient + private String shopName; + + public Integer getGoodsId() { + return goodsId; + } + public void setGoodsId(Integer goodsId) { + this.goodsId = goodsId; + } + public String getGoodsName() { + return goodsName; + } + public void setGoodsName(String goodsName) { + this.goodsName = goodsName; + } + public String getGoodsLink() { + return goodsLink; + } + public void setGoodsLink(String goodsLink) { + this.goodsLink = goodsLink; + } + public String getGoodsPicture() { + return goodsPicture; + } + public void setGoodsPicture(String goodsPicture) { + this.goodsPicture = goodsPicture; + } + public BigDecimal getOriPrice() { + return oriPrice; + } + public void setOriPrice(BigDecimal oriPrice) { + this.oriPrice = oriPrice; + } + public BigDecimal getPrePrice() { + return prePrice; + } + public void setPrePrice(BigDecimal prePrice) { + this.prePrice = prePrice; + } + public Integer getIsShow() { + return isShow; + } + public void setIsShow(Integer isShow) { + this.isShow = isShow; + } + public Integer getGoodsPlace() { + return goodsPlace; + } + public void setGoodsPlace(Integer goodsPlace) { + this.goodsPlace = goodsPlace; + } + public Integer getShopId() { + return shopId; + } + public void setShopId(Integer shopId) { + this.shopId = shopId; + } + public String getShopName() { + return shopName; + } + public void setShopName(String shopName) { + this.shopName = shopName; + } + public Integer getClickNum() { + return clickNum; + } + public void setClickNum(Integer clickNum) { + this.clickNum = clickNum; + } + public Integer getIsTaobaoLink() { + return isTaobaoLink; + } + public void setIsTaobaoLink(Integer isTaobaoLink) { + this.isTaobaoLink = isTaobaoLink; + } + +} diff --git a/src/main/java/com/ifish/entity/IfishShop.java b/src/main/java/com/ifish/entity/IfishShop.java new file mode 100644 index 0000000..bc0dc25 --- /dev/null +++ b/src/main/java/com/ifish/entity/IfishShop.java @@ -0,0 +1,48 @@ +package com.ifish.entity; + +import java.io.Serializable; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +/** + * 店铺管理 + * @author Administrator + * + */ +@Entity +@Table(name="tbl_ifish_shop") +public class IfishShop implements Serializable{ + + private static final long serialVersionUID = 7045978553607756344L; + /** + * 店铺ID + */ + @Id + @GeneratedValue(strategy=GenerationType.IDENTITY) + @Column(name="shop_id") + private Integer shopId; + /** + * 店铺名称 + */ + @Column(name="shop_name",nullable=false,length=20) + private String shopName; + + public Integer getShopId() { + return shopId; + } + public void setShopId(Integer shopId) { + this.shopId = shopId; + } + public String getShopName() { + return shopName; + } + public void setShopName(String shopName) { + this.shopName = shopName; + } + +} diff --git a/src/main/java/com/ifish/entity/Information.java b/src/main/java/com/ifish/entity/Information.java new file mode 100644 index 0000000..9547cea --- /dev/null +++ b/src/main/java/com/ifish/entity/Information.java @@ -0,0 +1,142 @@ +package com.ifish.entity; + +import java.io.Serializable; +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import javax.persistence.Transient; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.ifish.enums.BooleanEnum; +import com.ifish.serializer.CustomDateSerializer; + +/** + * @ClassName: tbl_information + * + */ +@Entity +@Table(name="tbl_information") +public class Information implements Serializable{ + + private static final long serialVersionUID = 7472598147626976361L; + /** + * ID + */ + @Id + @Column(name="info_id") + private Integer infoId; + /** + * app展示 + */ + @Column(name="app_show",length=1) + private String appShow; + /** + * 链接 + */ + @Column(name="link",length=100) + private String link; + /** + * 标题 + */ + @Column(name="title",length=50) + private String title; + /** + * 内容 + */ + @Column(name="contents",length=50) + private String contents; + /** + * 图片 + */ + @Column(name="image",length=20) + private String image; + /** + * 编辑器ID + */ + @Column(name="ueditor_id") + private Integer ueditorId; + /** + * 类型 + */ + @Column(name="ueditor_type",length=1) + private String ueditorType; + /** + * 创建时间 + */ + @JsonSerialize(using=CustomDateSerializer.class) + @Column(name="create_time") + @Temporal(TemporalType.TIMESTAMP) + private Date createTime; + /** + * 是否拼接用户ID + */ + @Transient + private String isAddUserId = BooleanEnum.NO.getKey(); + + public Integer getInfoId() { + return infoId; + } + public void setInfoId(Integer infoId) { + this.infoId = infoId; + } + public Date getCreateTime() { + return createTime; + } + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + public String getAppShow() { + return appShow; + } + public void setAppShow(String appShow) { + this.appShow = appShow; + } + public String getLink() { + return link; + } + public void setLink(String link) { + this.link = link; + } + public String getTitle() { + return title; + } + public void setTitle(String title) { + this.title = title; + } + public Integer getUeditorId() { + return ueditorId; + } + public void setUeditorId(Integer ueditorId) { + this.ueditorId = ueditorId; + } + public String getIsAddUserId() { + return isAddUserId; + } + public void setIsAddUserId(String isAddUserId) { + this.isAddUserId = isAddUserId; + } + public String getContents() { + return contents; + } + public void setContents(String contents) { + this.contents = contents; + } + public String getUeditorType() { + return ueditorType; + } + public void setUeditorType(String ueditorType) { + this.ueditorType = ueditorType; + } + public String getImage() { + return image; + } + public void setImage(String image) { + this.image = image; + } + +} diff --git a/src/main/java/com/ifish/entity/InformationStats.java b/src/main/java/com/ifish/entity/InformationStats.java new file mode 100644 index 0000000..6d1f1fb --- /dev/null +++ b/src/main/java/com/ifish/entity/InformationStats.java @@ -0,0 +1,45 @@ +package com.ifish.entity; + +import java.io.Serializable; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +/** + * 资讯数据统计 + * @author Administrator + * + */ +@Entity +@Table(name="tbl_information_stats") +public class InformationStats implements Serializable{ + + private static final long serialVersionUID = -8449695970790949331L; + /** + * 资讯ID + */ + @Id + @Column(name="info_id",nullable=false) + private Integer infoId; + /** + * 点击量 + */ + @Column(name="click_num",nullable=false) + private Integer clickNum; + + public Integer getInfoId() { + return infoId; + } + public void setInfoId(Integer infoId) { + this.infoId = infoId; + } + public Integer getClickNum() { + return clickNum; + } + public void setClickNum(Integer clickNum) { + this.clickNum = clickNum; + } + +} diff --git a/src/main/java/com/ifish/entity/LiveBanner.java b/src/main/java/com/ifish/entity/LiveBanner.java new file mode 100644 index 0000000..51733c4 --- /dev/null +++ b/src/main/java/com/ifish/entity/LiveBanner.java @@ -0,0 +1,55 @@ +package com.ifish.entity; + +import java.io.Serializable; + +/** + * @ClassName: tbl_live_banner + * @date 2015年7月2日 下午16:40:00 + * + */ +public class LiveBanner implements Serializable{ + + private static final long serialVersionUID = -6459241094002600290L; + //ID + private Integer bannerId; + //是否展示 + private String appShow; + //类型 + private String bannerType; + //链接 + private String bannerLink; + //banner图片 + private String bannerImg; + + public Integer getBannerId() { + return bannerId; + } + public void setBannerId(Integer bannerId) { + this.bannerId = bannerId; + } + public String getAppShow() { + return appShow; + } + public void setAppShow(String appShow) { + this.appShow = appShow; + } + public String getBannerType() { + return bannerType; + } + public void setBannerType(String bannerType) { + this.bannerType = bannerType; + } + public String getBannerLink() { + return bannerLink; + } + public void setBannerLink(String bannerLink) { + this.bannerLink = bannerLink; + } + public String getBannerImg() { + return bannerImg; + } + public void setBannerImg(String bannerImg) { + this.bannerImg = bannerImg; + } + +} diff --git a/src/main/java/com/ifish/entity/LiveMessage.java b/src/main/java/com/ifish/entity/LiveMessage.java new file mode 100644 index 0000000..7a56dd0 --- /dev/null +++ b/src/main/java/com/ifish/entity/LiveMessage.java @@ -0,0 +1,130 @@ +package com.ifish.entity; + +import java.io.Serializable; +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Transient; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.ifish.serializer.CustomDateSerializer; + +/** + * @ClassName: tbl_live_message + * @date 2015年7月2日 下午16:40:00 * + */ +@Entity +@Table(name="tbl_live_message") +public class LiveMessage implements Serializable{ + + private static final long serialVersionUID = -1369523508980093389L; + /** + * ID + */ + @Id + @GeneratedValue(strategy=GenerationType.IDENTITY) + @Column(name="message_id") + private Integer messageId; + /** + * 直播间ID + */ + @Column(name="room_id",nullable=true) + private Integer roomId; + /** + * 用户ID + */ + @Column(name="user_id",nullable=true) + private Integer userId; + /** + * @用户ID + */ + @Column(name="as_user_id") + private Integer asUserId; + /** + * @用户名称 + */ + @Transient + private String asUserName; + /** + * 头像 + */ + @Transient + private String userImg; + /** + * 用户 + */ + @Transient + private String userName; + /** + * 内容 + */ + @Column(name="message_content",nullable=true,length=200) + private String messageContent; + /** + * 创建时间 + */ + @JsonSerialize(using = CustomDateSerializer.class) + @Column(name="create_time",columnDefinition="timestamp",updatable=false,length=1) + private Date createTime; + + public Integer getMessageId() { + return messageId; + } + public void setMessageId(Integer messageId) { + this.messageId = messageId; + } + public Integer getRoomId() { + return roomId; + } + public void setRoomId(Integer roomId) { + this.roomId = roomId; + } + public Integer getUserId() { + return userId; + } + public void setUserId(Integer userId) { + this.userId = userId; + } + public String getMessageContent() { + return messageContent; + } + public void setMessageContent(String messageContent) { + this.messageContent = messageContent; + } + public Date getCreateTime() { + return createTime; + } + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + public Integer getAsUserId() { + return asUserId; + } + public void setAsUserId(Integer asUserId) { + this.asUserId = asUserId; + } + public String getAsUserName() { + return asUserName; + } + public void setAsUserName(String asUserName) { + this.asUserName = asUserName; + } + public String getUserImg() { + return userImg; + } + public void setUserImg(String userImg) { + this.userImg = userImg; + } + public String getUserName() { + return userName; + } + public void setUserName(String userName) { + this.userName = userName; + } + +} diff --git a/src/main/java/com/ifish/entity/LiveRoom.java b/src/main/java/com/ifish/entity/LiveRoom.java new file mode 100644 index 0000000..aa99647 --- /dev/null +++ b/src/main/java/com/ifish/entity/LiveRoom.java @@ -0,0 +1,118 @@ +package com.ifish.entity; + +import java.io.Serializable; +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; + +/** + * @ClassName: tbl_live_room + * @date 2015年7月2日 下午16:40:00 + * + */ +@Entity +@Table(name="tbl_live_room") +public class LiveRoom implements Serializable{ + + private static final long serialVersionUID = -5155435715428041950L; + /** + * ID + */ + @Id + @GeneratedValue(strategy=GenerationType.IDENTITY) + @Column(name="room_id") + private Integer roomId; + /** + * 用户ID + */ + @Column(name="user_id",nullable=false) + private Integer userId; + /** + * 直播间名称 + */ + @Column(name="room_name",nullable=false) + private String roomName; + /** + * 直播间描述 + */ + @Column(name="room_desc") + private String roomDesc; + /** + * 直播间状态 + */ + @Column(name="room_status",nullable=false) + private String roomStatus; + /** + * 人气值 + */ + @Column(name="popularity_value") + private Integer popularityValue; + /** + * 首次分享 + */ + @Column(name="first_share") + private String firstShare; + /** + * 创建时间 + */ + @Column(name="create_time") + @Temporal(TemporalType.TIMESTAMP) + private Date createTime; + + public Integer getRoomId() { + return roomId; + } + public void setRoomId(Integer roomId) { + this.roomId = roomId; + } + public Integer getUserId() { + return userId; + } + public void setUserId(Integer userId) { + this.userId = userId; + } + public String getRoomName() { + return roomName; + } + public void setRoomName(String roomName) { + this.roomName = roomName; + } + public String getRoomDesc() { + return roomDesc; + } + public void setRoomDesc(String roomDesc) { + this.roomDesc = roomDesc; + } + public String getRoomStatus() { + return roomStatus; + } + public void setRoomStatus(String roomStatus) { + this.roomStatus = roomStatus; + } + public Integer getPopularityValue() { + return popularityValue; + } + public void setPopularityValue(Integer popularityValue) { + this.popularityValue = popularityValue; + } + public String getFirstShare() { + return firstShare; + } + public void setFirstShare(String firstShare) { + this.firstShare = firstShare; + } + public Date getCreateTime() { + return createTime; + } + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + +} diff --git a/src/main/java/com/ifish/entity/LiveRoomZan.java b/src/main/java/com/ifish/entity/LiveRoomZan.java new file mode 100644 index 0000000..8064f2a --- /dev/null +++ b/src/main/java/com/ifish/entity/LiveRoomZan.java @@ -0,0 +1,36 @@ +package com.ifish.entity; + +import java.io.Serializable; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +/** + * 直播间点赞 + * @author Administrator + * + */ +@Entity +@Table(name="tbl_live_room_zan") +public class LiveRoomZan implements Serializable{ + + private static final long serialVersionUID = 336837412612295706L; + /** + * id + */ + @Id + LiveRoomZanId id; + + public LiveRoomZan() {} + public LiveRoomZan(LiveRoomZanId id) { + this.id = id; + } + public LiveRoomZanId getId() { + return id; + } + public void setId(LiveRoomZanId id) { + this.id = id; + } + +} diff --git a/src/main/java/com/ifish/entity/LiveRoomZanId.java b/src/main/java/com/ifish/entity/LiveRoomZanId.java new file mode 100644 index 0000000..f03b708 --- /dev/null +++ b/src/main/java/com/ifish/entity/LiveRoomZanId.java @@ -0,0 +1,47 @@ +package com.ifish.entity; + +import java.io.Serializable; + +import javax.persistence.Column; +import javax.persistence.Embeddable; + +/** + * 直播间点赞 + * @author Administrator + * + */ +@Embeddable +public class LiveRoomZanId implements Serializable{ + + private static final long serialVersionUID = -275072147659071118L; + /** + * 直播间ID + */ + @Column(name="room_id",nullable=false) + private Integer roomId; + /** + * 用户ID + */ + @Column(name="user_id",nullable=false) + private Integer userId; + + public LiveRoomZanId() {} + public LiveRoomZanId(Integer roomId, Integer userId) { + super(); + this.roomId = roomId; + this.userId = userId; + } + public Integer getRoomId() { + return roomId; + } + public void setRoomId(Integer roomId) { + this.roomId = roomId; + } + public Integer getUserId() { + return userId; + } + public void setUserId(Integer userId) { + this.userId = userId; + } + +} diff --git a/src/main/java/com/ifish/entity/LookReport.java b/src/main/java/com/ifish/entity/LookReport.java new file mode 100644 index 0000000..770653c --- /dev/null +++ b/src/main/java/com/ifish/entity/LookReport.java @@ -0,0 +1,153 @@ +package com.ifish.entity; + +import java.io.Serializable; +import java.util.Date; + +/** + * @ClassName: tbl_look_report + * @date 2015年7月2日 下午16:40:00 + * + */ +public class LookReport implements Serializable{ + + private static final long serialVersionUID = -3068461096525224795L; + //ID + private Integer reportId; + //分享图片 + private String shareImg; + //看护时间 + private Date timestamp; + //水质观察 + private String index1; + //喂食提醒 + private String index2; + //健康状况 + private String index3; + //喂养建议 + private String suggestion; + //得分 + private String totalIndex; + //百分比 + private String baifenbi; + //商家头像 + private String userImg; + //店铺名称 + private String shopsName; + //个性签名 + private String signature; + //创建时间 + private Date createTime; + //html文件名字 + private String htmlName; + //水质观察 + private String index1Text; + //喂食提醒 + private String index2Text; + //健康状况 + private String index3Text; + + + public String getShopsName() { + return shopsName; + } + public void setShopsName(String shopsName) { + this.shopsName = shopsName; + } + public Integer getReportId() { + return reportId; + } + public void setReportId(Integer reportId) { + this.reportId = reportId; + } + public String getShareImg() { + return shareImg; + } + public void setShareImg(String shareImg) { + this.shareImg = shareImg; + } + public Date getTimestamp() { + return timestamp; + } + public void setTimestamp(Date timestamp) { + this.timestamp = timestamp; + } + public String getIndex1() { + return index1; + } + public void setIndex1(String index1) { + this.index1 = index1; + } + public String getIndex2() { + return index2; + } + public void setIndex2(String index2) { + this.index2 = index2; + } + public String getIndex3() { + return index3; + } + public void setIndex3(String index3) { + this.index3 = index3; + } + public String getSuggestion() { + return suggestion; + } + public void setSuggestion(String suggestion) { + this.suggestion = suggestion; + } + public String getTotalIndex() { + return totalIndex; + } + public void setTotalIndex(String totalIndex) { + this.totalIndex = totalIndex; + } + public String getBaifenbi() { + return baifenbi; + } + public void setBaifenbi(String baifenbi) { + this.baifenbi = baifenbi; + } + public String getUserImg() { + return userImg; + } + public void setUserImg(String userImg) { + this.userImg = userImg; + } + public String getSignature() { + return signature; + } + public void setSignature(String signature) { + this.signature = signature; + } + public Date getCreateTime() { + return createTime; + } + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + public String getHtmlName() { + return htmlName; + } + public void setHtmlName(String htmlName) { + this.htmlName = htmlName; + } + public String getIndex1Text() { + return index1Text; + } + public void setIndex1Text(String index1Text) { + this.index1Text = index1Text; + } + public String getIndex2Text() { + return index2Text; + } + public void setIndex2Text(String index2Text) { + this.index2Text = index2Text; + } + public String getIndex3Text() { + return index3Text; + } + public void setIndex3Text(String index3Text) { + this.index3Text = index3Text; + } + +} diff --git a/src/main/java/com/ifish/entity/PushList.java b/src/main/java/com/ifish/entity/PushList.java new file mode 100644 index 0000000..1d15a71 --- /dev/null +++ b/src/main/java/com/ifish/entity/PushList.java @@ -0,0 +1,137 @@ +package com.ifish.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.ifish.serializer.CustomDateSerializer; + +/** + * @ClassName: tbl_push_list + * @date 2015年7月2日 下午16:40:00 + * + */ +public class PushList implements Serializable{ + + private static final long serialVersionUID = -6718129027121198763L; + //ID + private Integer pushId; + //用户ID + private Integer userId; + //设备ID + private Integer deviceId; + //看护报告ID + private Integer reportId; + //推送手机类型 + private String phoneType; + //显示名称 + private String showName; + //推送消息类型 + private String pushType; + //推送标题 + private String pushTitle; + //推送内容 + private String pushContext; + //链接 + private String pushLink; + //极光推送状态 + private String jpushStatus; + //云信推送状态 + private String neteaseStatus; + //创建时间 + private Date createTime; + + public PushList() {} + + public PushList(Integer userId, Integer deviceId, String showName,String pushType,String neteaseStatus,String pushTitle,String pushContext) { + this.userId = userId; + this.deviceId = deviceId; + this.showName = showName; + this.pushType = pushType; + this.neteaseStatus = neteaseStatus; + this.pushTitle = pushTitle; + this.pushContext = pushContext; + this.createTime = new Date(); + } + + public Integer getPushId() { + return pushId; + } + public void setPushId(Integer pushId) { + this.pushId = pushId; + } + public Integer getUserId() { + return userId; + } + public void setUserId(Integer userId) { + this.userId = userId; + } + public Integer getDeviceId() { + return deviceId; + } + public void setDeviceId(Integer deviceId) { + this.deviceId = deviceId; + } + public String getShowName() { + return showName; + } + public void setShowName(String showName) { + this.showName = showName; + } + public String getPushType() { + return pushType; + } + public void setPushType(String pushType) { + this.pushType = pushType; + } + public String getPushTitle() { + return pushTitle; + } + public void setPushTitle(String pushTitle) { + this.pushTitle = pushTitle; + } + public String getPushContext() { + return pushContext; + } + public void setPushContext(String pushContext) { + this.pushContext = pushContext; + } + @JsonSerialize(using = CustomDateSerializer.class) + public Date getCreateTime() { + return createTime; + } + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + public String getPhoneType() { + return phoneType; + } + public void setPhoneType(String phoneType) { + this.phoneType = phoneType; + } + public String getPushLink() { + return pushLink; + } + public void setPushLink(String pushLink) { + this.pushLink = pushLink; + } + public Integer getReportId() { + return reportId; + } + public void setReportId(Integer reportId) { + this.reportId = reportId; + } + public String getJpushStatus() { + return jpushStatus; + } + public void setJpushStatus(String jpushStatus) { + this.jpushStatus = jpushStatus; + } + public String getNeteaseStatus() { + return neteaseStatus; + } + public void setNeteaseStatus(String neteaseStatus) { + this.neteaseStatus = neteaseStatus; + } + +} diff --git a/src/main/java/com/ifish/entity/QuestionsFeedback.java b/src/main/java/com/ifish/entity/QuestionsFeedback.java new file mode 100644 index 0000000..93abf09 --- /dev/null +++ b/src/main/java/com/ifish/entity/QuestionsFeedback.java @@ -0,0 +1,64 @@ +package com.ifish.entity; + +import java.io.Serializable; +import java.util.Date; + +/** + * @ClassName: tbl_questions_feedback + * @date 2015年7月2日 下午16:40:00 + * + */ +public class QuestionsFeedback implements Serializable{ + + private static final long serialVersionUID = -2969437537060946970L; + //ID + private Integer questionId; + //用户ID + private Integer userId; + //问题内容 + private String questionContent; + //回复内容 + private String questionReply; + //回复时间 + private Date replyTime; + //创建时间 + private Date createTime; + + public Integer getQuestionId() { + return questionId; + } + public void setQuestionId(Integer questionId) { + this.questionId = questionId; + } + public Integer getUserId() { + return userId; + } + public void setUserId(Integer userId) { + this.userId = userId; + } + public String getQuestionContent() { + return questionContent; + } + public void setQuestionContent(String questionContent) { + this.questionContent = questionContent; + } + public String getQuestionReply() { + return questionReply; + } + public void setQuestionReply(String questionReply) { + this.questionReply = questionReply; + } + public Date getCreateTime() { + return createTime; + } + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + public Date getReplyTime() { + return replyTime; + } + public void setReplyTime(Date replyTime) { + this.replyTime = replyTime; + } + +} diff --git a/src/main/java/com/ifish/entity/ShopsInfo.java b/src/main/java/com/ifish/entity/ShopsInfo.java new file mode 100644 index 0000000..4965ae0 --- /dev/null +++ b/src/main/java/com/ifish/entity/ShopsInfo.java @@ -0,0 +1,192 @@ +package com.ifish.entity; + +import java.io.Serializable; +import java.util.Date; + +/** + * @ClassName: shops_info + * @date 2015年7月2日 下午16:40:00 + * + */ +public class ShopsInfo implements Serializable{ + + private static final long serialVersionUID = 5256045896328402625L; + //ID + private Integer shopsId; + //用户ID + private Integer userId; + //店家姓名 + private String userName; + //店铺名称 + private String shopsName; + //店家电话 + private String shopsPhone; + //省 + private String shopsProvince; + //市 + private String shopsCity; + //区 + private String shopsArea; + //店家地址 + private String shopsAddress; + //身份证正面 + private String picture1; + //身份证背面 + private String picture2; + //营业执照 + private String picture3; + //店铺招牌 + private String picture4; + //审核状态 + private String status; + //app显示 + private String appShow; + //不通过原因 + private String reason; + //修改时间 + private Date updateTime; + //创建时间 + private Date createTime; + //会员类型 + private String typeKey; + //备注 + private String remark; + //微信号 + private String weixinCode; + //网店地址 + private String shopLink; + + public Integer getShopsId() { + return shopsId; + } + public void setShopsId(Integer shopsId) { + this.shopsId = shopsId; + } + public String getUserName() { + return userName; + } + public void setUserName(String userName) { + this.userName = userName; + } + public String getShopsName() { + return shopsName; + } + public void setShopsName(String shopsName) { + this.shopsName = shopsName; + } + public String getShopsPhone() { + return shopsPhone; + } + public void setShopsPhone(String shopsPhone) { + this.shopsPhone = shopsPhone; + } + public String getShopsAddress() { + return shopsAddress; + } + public void setShopsAddress(String shopsAddress) { + this.shopsAddress = shopsAddress; + } + public String getPicture1() { + return picture1; + } + public void setPicture1(String picture1) { + this.picture1 = picture1; + } + public String getPicture2() { + return picture2; + } + public void setPicture2(String picture2) { + this.picture2 = picture2; + } + public String getPicture3() { + return picture3; + } + public void setPicture3(String picture3) { + this.picture3 = picture3; + } + public String getStatus() { + return status; + } + public void setStatus(String status) { + this.status = status; + } + public Date getUpdateTime() { + return updateTime; + } + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + public Date getCreateTime() { + return createTime; + } + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + public String getShopsProvince() { + return shopsProvince; + } + public void setShopsProvince(String shopsProvince) { + this.shopsProvince = shopsProvince; + } + public String getShopsCity() { + return shopsCity; + } + public void setShopsCity(String shopsCity) { + this.shopsCity = shopsCity; + } + public String getShopsArea() { + return shopsArea; + } + public void setShopsArea(String shopsArea) { + this.shopsArea = shopsArea; + } + public String getReason() { + return reason; + } + public void setReason(String reason) { + this.reason = reason; + } + public Integer getUserId() { + return userId; + } + public void setUserId(Integer userId) { + this.userId = userId; + } + public String getPicture4() { + return picture4; + } + public void setPicture4(String picture4) { + this.picture4 = picture4; + } + public String getTypeKey() { + return typeKey; + } + public void setTypeKey(String typeKey) { + this.typeKey = typeKey; + } + public String getRemark() { + return remark; + } + public void setRemark(String remark) { + this.remark = remark; + } + public String getAppShow() { + return appShow; + } + public void setAppShow(String appShow) { + this.appShow = appShow; + } + public String getWeixinCode() { + return weixinCode; + } + public void setWeixinCode(String weixinCode) { + this.weixinCode = weixinCode; + } + public String getShopLink() { + return shopLink; + } + public void setShopLink(String shopLink) { + this.shopLink = shopLink; + } + +} diff --git a/src/main/java/com/ifish/entity/ShopsUserInfo.java b/src/main/java/com/ifish/entity/ShopsUserInfo.java new file mode 100644 index 0000000..0b3e4c6 --- /dev/null +++ b/src/main/java/com/ifish/entity/ShopsUserInfo.java @@ -0,0 +1,164 @@ +package com.ifish.entity; + +import java.io.Serializable; +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; + +/** + * 商家会员信息 + * @author Administrator + * + */ +@Entity +@Table(name="tbl_shops_user_info") +public class ShopsUserInfo implements Serializable { + + private static final long serialVersionUID = -1540472446611945759L; + /** + * ID + */ + @Id + private ShopsUserInfoId id; + /** + * 会员等级 + */ + @Column(name="member_level",nullable=false) + private int memberLevel; + /** + * 用户名称 + */ + @Column(name="user_name",nullable=false,length=10) + private String userName; + /** + * 手机号码 + */ + @Column(name="phone_number",nullable=false,length=11) + private String phoneNumber; + /** + * 省 + */ + @Column(name="province",nullable=false,length=30) + private String province; + /** + * 市 + */ + @Column(name="city",nullable=false,length=30) + private String city; + /** + * 区 + */ + @Column(name="area",nullable=false,length=30) + private String area; + /** + * 地址 + */ + @Column(name="address",nullable=false,length=100) + private String address; + /** + * 备注 + */ + @Column(name="remark",nullable=false,length=50) + private String remark; + /** + * 修改时间 + */ + @Column(name="update_time") + @Temporal(TemporalType.TIMESTAMP) + private Date updateTime; + + /** + * 创建时间 + */ + @Column(name="create_time") + @Temporal(TemporalType.TIMESTAMP) + private Date createTime; + + public ShopsUserInfo() {} + + public ShopsUserInfo(ShopsUserInfoId id, int memberLevel) { + this.id = id; + this.memberLevel = memberLevel; + } + + public ShopsUserInfoId getId() { + return id; + } + public void setId(ShopsUserInfoId id) { + this.id = id; + } + public int getMemberLevel() { + return memberLevel; + } + public void setMemberLevel(int memberLevel) { + this.memberLevel = memberLevel; + } + public String getAddress() { + return address; + } + public void setAddress(String address) { + this.address = address; + } + public String getRemark() { + return remark; + } + public void setRemark(String remark) { + this.remark = remark; + } + public Date getUpdateTime() { + return updateTime; + } + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + public String getPhoneNumber() { + return phoneNumber; + } + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; + } + public String getUserName() { + return userName; + } + public void setUserName(String userName) { + this.userName = userName; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + +} diff --git a/src/main/java/com/ifish/entity/ShopsUserInfoId.java b/src/main/java/com/ifish/entity/ShopsUserInfoId.java new file mode 100644 index 0000000..d177c65 --- /dev/null +++ b/src/main/java/com/ifish/entity/ShopsUserInfoId.java @@ -0,0 +1,47 @@ +package com.ifish.entity; + +import java.io.Serializable; + +import javax.persistence.Column; +import javax.persistence.Embeddable; + +/** + * 商家用户信息ID + * @author Administrator + * + */ +@Embeddable +public class ShopsUserInfoId implements Serializable{ + + private static final long serialVersionUID = -6202050811830542892L; + /** + * 商家ID + */ + @Column(name="shops_id",nullable=false) + private Integer shopsId; + /** + * 用户ID + */ + @Column(name="user_id",nullable=false) + private Integer userId; + + public ShopsUserInfoId() {} + + public ShopsUserInfoId(Integer shopsId, Integer userId) { + this.shopsId = shopsId; + this.userId = userId; + } + public Integer getShopsId() { + return shopsId; + } + public void setShopsId(Integer shopsId) { + this.shopsId = shopsId; + } + public Integer getUserId() { + return userId; + } + public void setUserId(Integer userId) { + this.userId = userId; + } + +} diff --git a/src/main/java/com/ifish/entity/Ueditor.java b/src/main/java/com/ifish/entity/Ueditor.java new file mode 100644 index 0000000..3d8cffe --- /dev/null +++ b/src/main/java/com/ifish/entity/Ueditor.java @@ -0,0 +1,85 @@ +package com.ifish.entity; + +import java.io.Serializable; +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.ifish.serializer.CustomDateSerializer; + +/** + * @ClassName: tbl_ueditor + * @date 2015年7月2日 下午16:40:00 * + */ +@Entity +@Table(name="tbl_ueditor") +public class Ueditor implements Serializable{ + + private static final long serialVersionUID = -6939110411331900619L; + /** + * ID + */ + @Id + @GeneratedValue(strategy=GenerationType.IDENTITY) + @Column(name="ueditor_id") + private Integer ueditorId; + /** + * 标题 + */ + @Column(name="ueditor_title",nullable=true,length=50) + private String ueditorTitle; + /** + * html名称 + */ + @Column(name="html_name",length=100) + private String htmlName; + /** + * 信息类型 + */ + @Column(name="ueditor_type",nullable=true,length=1) + private String ueditorType; + /** + * 创建时间 + */ + @Column(name="create_time",columnDefinition="timestamp",updatable=false,length=1) + private Date createTime; + + public Integer getUeditorId() { + return ueditorId; + } + public void setUeditorId(Integer ueditorId) { + this.ueditorId = ueditorId; + } + public String getUeditorTitle() { + return ueditorTitle; + } + public void setUeditorTitle(String ueditorTitle) { + this.ueditorTitle = ueditorTitle; + } + @JsonSerialize(using = CustomDateSerializer.class) + public Date getCreateTime() { + return createTime; + } + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + public String getHtmlName() { + return htmlName; + } + public void setHtmlName(String htmlName) { + this.htmlName = htmlName; + } + public String getUeditorType() { + return ueditorType; + } + public void setUeditorType(String ueditorType) { + this.ueditorType = ueditorType; + } + +} diff --git a/src/main/java/com/ifish/entity/User.java b/src/main/java/com/ifish/entity/User.java new file mode 100644 index 0000000..7715048 --- /dev/null +++ b/src/main/java/com/ifish/entity/User.java @@ -0,0 +1,293 @@ +package com.ifish.entity; + +import java.io.Serializable; +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.ifish.serializer.CustomDateSerializer; + +/** + * 用户信息 + * @date 2015年7月2日 下午16:40:00 + * + */ +@Entity +@Table(name="tbl_user") +public class User implements Serializable{ + + private static final long serialVersionUID = 9090213827766125261L; + /** + * 用户ID + */ + @Id + @GeneratedValue(strategy=GenerationType.IDENTITY) + @Column(name="user_id") + private Integer userId; + /** + * 用户昵称 + */ + @Column(name="nick_name",nullable=false,length=20) + private String nickName; + /** + * 用户密码 + */ + @Column(name="user_password",nullable=false,length=32) + private String userPassword; + /** + * 手机号码 + */ + @Column(name="phone_number",unique=true,nullable=false,length=11) + private String phoneNumber; + /** + * 用户头像 + */ + @Column(name="user_img",length=100) + private String userImg; + /** + * 性别 + */ + @Column(name="user_sex",length=1) + private String userSex; + /** + * 个性签名 + */ + @Column(name="signature",length=30) + private String signature; + /** + * 注册手机类型 + */ + @Column(name="phone_type",updatable=false,length=10) + private String phoneType; + /** + * 登陆手机类型 + */ + @Column(name="login_type",updatable=false,length=10) + private String loginType; + /** + * 最后一次登陆 + */ + @Column(name="login_time") + @Temporal(TemporalType.TIMESTAMP) + private Date loginTime; + /** + * 地址 + */ + @Column(name="address",length=200) + private String address; + /** + * 是否注册技威 + */ + @Column(name="is_register_gwell",length=1) + private String isRegisterGwell; + /** + * code1 + */ + @Column(name="P2PVerify_code1",length=50) + private String p2PVerifyCode1; + /** + * code2 + */ + @Column(name="P2PVerify_code2",length=50) + private String p2PVerifyCode2; + /** + * UserID + */ + @Column(name="gwell_userID",length=50) + private String gwellUserID; + /** + * 是否注册云信 + */ + @Column(name="is_register_netease",length=1) + private String isRegisterNetease; + /** + * 云信token + */ + @Column(name="netease_token",length=50) + private String neteaseToken; + /** + * 用户类型(0:普通用户,1:商家用户) + */ + @Column(name="user_type",length=10) + private String userType; + /** + * 商家ID + */ + @Column(name="shops_user_id") + private Integer shopsUserId; + /** + * 经度 + */ + @Column(name="longitude") + private Double longitude; + /** + * 纬度 + */ + @Column(name="latitude") + private Double latitude; + /** + * 修改时间 + */ + @JsonSerialize(using = CustomDateSerializer.class) + @Column(name="update_time") + @Temporal(TemporalType.TIMESTAMP) + private Date updateTime; + /** + * 创建时间 + */ + @JsonSerialize(using = CustomDateSerializer.class) + @Column(name="create_time",updatable=false) + @Temporal(TemporalType.TIMESTAMP) + private Date createTime; + + public Integer getUserId() { + return userId; + } + public void setUserId(Integer userId) { + this.userId = userId; + } + public String getNickName() { + return nickName; + } + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getUserPassword() { + return userPassword; + } + public void setUserPassword(String userPassword) { + this.userPassword = userPassword; + } + public String getPhoneNumber() { + return phoneNumber; + } + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; + } + public String getUserImg() { + return userImg; + } + public void setUserImg(String userImg) { + this.userImg = userImg; + } + public String getUserSex() { + return userSex; + } + public void setUserSex(String userSex) { + this.userSex = userSex; + } + public String getSignature() { + return signature; + } + public void setSignature(String signature) { + this.signature = signature; + } + public Date getUpdateTime() { + return updateTime; + } + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + public Date getCreateTime() { + return createTime; + } + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + public String getPhoneType() { + return phoneType; + } + public void setPhoneType(String phoneType) { + this.phoneType = phoneType; + } + + public String getLoginType() { + return loginType; + } + + public void setLoginType(String loginType) { + this.loginType = loginType; + } + public String getAddress() { + return address; + } + public void setAddress(String address) { + this.address = address; + } + public String getIsRegisterGwell() { + return isRegisterGwell; + } + public void setIsRegisterGwell(String isRegisterGwell) { + this.isRegisterGwell = isRegisterGwell; + } + public String getGwellUserID() { + return gwellUserID; + } + public void setGwellUserID(String gwellUserID) { + this.gwellUserID = gwellUserID; + } + public String getP2PVerifyCode1() { + return p2PVerifyCode1; + } + public void setP2PVerifyCode1(String p2pVerifyCode1) { + p2PVerifyCode1 = p2pVerifyCode1; + } + public String getP2PVerifyCode2() { + return p2PVerifyCode2; + } + public void setP2PVerifyCode2(String p2pVerifyCode2) { + p2PVerifyCode2 = p2pVerifyCode2; + } + public String getUserType() { + return userType; + } + public void setUserType(String userType) { + this.userType = userType; + } + public Integer getShopsUserId() { + return shopsUserId; + } + public void setShopsUserId(Integer shopsUserId) { + this.shopsUserId = shopsUserId; + } + public String getIsRegisterNetease() { + return isRegisterNetease; + } + public void setIsRegisterNetease(String isRegisterNetease) { + this.isRegisterNetease = isRegisterNetease; + } + public String getNeteaseToken() { + return neteaseToken; + } + public void setNeteaseToken(String neteaseToken) { + this.neteaseToken = neteaseToken; + } + public Double getLongitude() { + return longitude; + } + public void setLongitude(Double longitude) { + this.longitude = longitude; + } + public Double getLatitude() { + return latitude; + } + public void setLatitude(Double latitude) { + this.latitude = latitude; + } + public Date getLoginTime() { + return loginTime; + } + public void setLoginTime(Date loginTime) { + this.loginTime = loginTime; + } + +} diff --git a/src/main/java/com/ifish/entity/UserActivity.java b/src/main/java/com/ifish/entity/UserActivity.java new file mode 100644 index 0000000..4156b83 --- /dev/null +++ b/src/main/java/com/ifish/entity/UserActivity.java @@ -0,0 +1,74 @@ +package com.ifish.entity; + +import java.io.Serializable; +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; + +/** + * 用户动态 + * @author Administrator + * + */ +@Entity +@Table(name="tbl_user_activity") +public class UserActivity implements Serializable{ + + private static final long serialVersionUID = 1646629105686460668L; + /** + * 动态ID + */ + @Id + @Column(name="activity_id") + @GeneratedValue(strategy=GenerationType.IDENTITY) + private Integer activityId; + /** + * 用户ID + */ + @Column(name="user_id",nullable=false) + private Integer userId; + /** + * 动态类型 + */ + @Column(name="activity_type",length=20,nullable=false) + private String activityType; + /** + * 创建时间 + */ + @Column(name="create_time") + @Temporal(TemporalType.TIMESTAMP) + private Date createTime; + + public Integer getActivityId() { + return activityId; + } + public void setActivityId(Integer activityId) { + this.activityId = activityId; + } + public Integer getUserId() { + return userId; + } + public void setUserId(Integer userId) { + this.userId = userId; + } + public String getActivityType() { + return activityType; + } + public void setActivityType(String activityType) { + this.activityType = activityType; + } + public Date getCreateTime() { + return createTime; + } + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + +} diff --git a/src/main/java/com/ifish/entity/UserAsset.java b/src/main/java/com/ifish/entity/UserAsset.java new file mode 100644 index 0000000..1bd45e7 --- /dev/null +++ b/src/main/java/com/ifish/entity/UserAsset.java @@ -0,0 +1,108 @@ +package com.ifish.entity; + +import java.io.Serializable; +import java.math.BigDecimal; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +/** + * 用户资产表(金币,经验值等) + * @author Administrator + */ +@Entity +@Table(name="tbl_user_asset") +public class UserAsset implements Serializable{ + + private static final long serialVersionUID = 5604899088149487004L; + /** + * 用户ID + */ + @Id + @Column(name="user_id",nullable=false) + private Integer userId; + /** + * 经验值 + */ + @Column(name="grade_value",nullable=false) + private Integer gradeValue; + /** + * 金币 + */ + @Column(name="gold_value",nullable=false,precision=9,scale=2) + private BigDecimal goldValue; + /** + * 最后一次签到日期 + */ + @Column(name="last_signin_date",nullable=false) + private String lastSigninDate; + /** + * 连续签到天数 + */ + @Column(name="keep_signin_num",nullable=false) + private Integer keepSigninNum; + /** + * 最后一次登陆日期 + */ + @Column(name="last_login_date",nullable=false) + private String lastLoginDate; + + public UserAsset() {} + + public UserAsset(Integer userId) { + this.userId = userId; + this.gradeValue = 0; + this.goldValue = new BigDecimal(0); + this.lastSigninDate = ""; + this.keepSigninNum = 0; + this.lastLoginDate = ""; + } + + public UserAsset(Integer userId,BigDecimal goldValue) { + this.userId = userId; + this.gradeValue = 0; + this.goldValue = goldValue; + this.lastSigninDate = ""; + this.keepSigninNum = 0; + this.lastLoginDate = ""; + } + public Integer getUserId() { + return userId; + } + public void setUserId(Integer userId) { + this.userId = userId; + } + public Integer getGradeValue() { + return gradeValue; + } + public void setGradeValue(Integer gradeValue) { + this.gradeValue = gradeValue; + } + public BigDecimal getGoldValue() { + return goldValue; + } + public void setGoldValue(BigDecimal goldValue) { + this.goldValue = goldValue; + } + public String getLastSigninDate() { + return lastSigninDate; + } + public void setLastSigninDate(String lastSigninDate) { + this.lastSigninDate = lastSigninDate; + } + public Integer getKeepSigninNum() { + return keepSigninNum; + } + public void setKeepSigninNum(Integer keepSigninNum) { + this.keepSigninNum = keepSigninNum; + } + public String getLastLoginDate() { + return lastLoginDate; + } + public void setLastLoginDate(String lastLoginDate) { + this.lastLoginDate = lastLoginDate; + } + +} diff --git a/src/main/java/com/ifish/entity/VenderList.java b/src/main/java/com/ifish/entity/VenderList.java new file mode 100644 index 0000000..64743df --- /dev/null +++ b/src/main/java/com/ifish/entity/VenderList.java @@ -0,0 +1,67 @@ +package com.ifish.entity; + +import java.io.Serializable; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +/** + * @ClassName: tbl_vender_list + * @date 2015年7月2日 下午16:40:00 + * + */ +@Entity +@Table(name="tbl_vender_list") +public class VenderList implements Serializable{ + + private static final long serialVersionUID = 1989223583119300872L; + /** + * 厂家编号 + */ + @Id + @Column(name="brand_code",nullable=true,length=20) + private String brandCode; + /** + * 厂家名称 + */ + @Column(name="brand_name",nullable=true,length=20) + private String brandName; + /** + * 品牌介绍 + */ + @Column(name="brand_introduce",length=100) + private String brandIntroduce; + /** + * logo + */ + @Column(name="brand_logo",length=100) + private String logo; + + public String getBrandName() { + return brandName; + } + public void setBrandName(String brandName) { + this.brandName = brandName; + } + public String getBrandIntroduce() { + return brandIntroduce; + } + public void setBrandIntroduce(String brandIntroduce) { + this.brandIntroduce = brandIntroduce; + } + public String getLogo() { + return logo; + } + public void setLogo(String logo) { + this.logo = logo; + } + public String getBrandCode() { + return brandCode; + } + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + +} diff --git a/src/main/java/com/ifish/entity/Version.java b/src/main/java/com/ifish/entity/Version.java new file mode 100644 index 0000000..39696e8 --- /dev/null +++ b/src/main/java/com/ifish/entity/Version.java @@ -0,0 +1,73 @@ +package com.ifish.entity; + +import java.io.Serializable; +import java.util.Date; + +/** + * @ClassName: tbl_version + * @date 2015年7月2日 下午16:40:00 + * + */ +public class Version implements Serializable{ + + private static final long serialVersionUID = -6718129027121198763L; + //版本ID + private Integer versionId; + //版本号 + private String versionCode; + //手机类型 + private String phoneType; + //更新类型,1强制升级,0,不强制 + private String isMustUpdate; + //更新内容 + private String uploadContent; + //下载地址 + private String appAddress; + //创建时间 + private Date createTime; + + public Integer getVersionId() { + return versionId; + } + public void setVersionId(Integer versionId) { + this.versionId = versionId; + } + public String getVersionCode() { + return versionCode; + } + public void setVersionCode(String versionCode) { + this.versionCode = versionCode; + } + public String getUploadContent() { + return uploadContent; + } + public void setUploadContent(String uploadContent) { + this.uploadContent = uploadContent; + } + public String getAppAddress() { + return appAddress; + } + public void setAppAddress(String appAddress) { + this.appAddress = appAddress; + } + public Date getCreateTime() { + return createTime; + } + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + public String getIsMustUpdate() { + return isMustUpdate; + } + public void setIsMustUpdate(String isMustUpdate) { + this.isMustUpdate = isMustUpdate; + } + public String getPhoneType() { + return phoneType; + } + public void setPhoneType(String phoneType) { + this.phoneType = phoneType; + } + + +} diff --git a/src/main/java/com/ifish/entity/hbm/BrowseRoom.hbm.xml b/src/main/java/com/ifish/entity/hbm/BrowseRoom.hbm.xml new file mode 100644 index 0000000..9489f1d --- /dev/null +++ b/src/main/java/com/ifish/entity/hbm/BrowseRoom.hbm.xml @@ -0,0 +1,13 @@ + + + + + false + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/ifish/entity/hbm/Camera.hbm.xml b/src/main/java/com/ifish/entity/hbm/Camera.hbm.xml new file mode 100644 index 0000000..a9d3274 --- /dev/null +++ b/src/main/java/com/ifish/entity/hbm/Camera.hbm.xml @@ -0,0 +1,14 @@ + + + + + false + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/ifish/entity/hbm/CameraActive.hbm.xml b/src/main/java/com/ifish/entity/hbm/CameraActive.hbm.xml new file mode 100644 index 0000000..67c18d5 --- /dev/null +++ b/src/main/java/com/ifish/entity/hbm/CameraActive.hbm.xml @@ -0,0 +1,13 @@ + + + + + false + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/ifish/entity/hbm/CameraUser.hbm.xml b/src/main/java/com/ifish/entity/hbm/CameraUser.hbm.xml new file mode 100644 index 0000000..3067bb2 --- /dev/null +++ b/src/main/java/com/ifish/entity/hbm/CameraUser.hbm.xml @@ -0,0 +1,17 @@ + + + + + false + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/ifish/entity/hbm/Device.hbm.xml b/src/main/java/com/ifish/entity/hbm/Device.hbm.xml new file mode 100644 index 0000000..79e90f1 --- /dev/null +++ b/src/main/java/com/ifish/entity/hbm/Device.hbm.xml @@ -0,0 +1,26 @@ + + + + + false + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/ifish/entity/hbm/DeviceCamera.hbm.xml b/src/main/java/com/ifish/entity/hbm/DeviceCamera.hbm.xml new file mode 100644 index 0000000..d6bb31e --- /dev/null +++ b/src/main/java/com/ifish/entity/hbm/DeviceCamera.hbm.xml @@ -0,0 +1,11 @@ + + + + + false + + + + + + \ No newline at end of file diff --git a/src/main/java/com/ifish/entity/hbm/DeviceUser.hbm.xml b/src/main/java/com/ifish/entity/hbm/DeviceUser.hbm.xml new file mode 100644 index 0000000..28bb4f1 --- /dev/null +++ b/src/main/java/com/ifish/entity/hbm/DeviceUser.hbm.xml @@ -0,0 +1,17 @@ + + + + + false + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/ifish/entity/hbm/HardwareType.hbm.xml b/src/main/java/com/ifish/entity/hbm/HardwareType.hbm.xml new file mode 100644 index 0000000..d621b1e --- /dev/null +++ b/src/main/java/com/ifish/entity/hbm/HardwareType.hbm.xml @@ -0,0 +1,25 @@ + + + + + false + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/ifish/entity/hbm/LiveBanner.hbm.xml b/src/main/java/com/ifish/entity/hbm/LiveBanner.hbm.xml new file mode 100644 index 0000000..077adc7 --- /dev/null +++ b/src/main/java/com/ifish/entity/hbm/LiveBanner.hbm.xml @@ -0,0 +1,14 @@ + + + + + false + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/ifish/entity/hbm/LookReport.hbm.xml b/src/main/java/com/ifish/entity/hbm/LookReport.hbm.xml new file mode 100644 index 0000000..2d1b70f --- /dev/null +++ b/src/main/java/com/ifish/entity/hbm/LookReport.hbm.xml @@ -0,0 +1,22 @@ + + + + + false + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/ifish/entity/hbm/PushList.hbm.xml b/src/main/java/com/ifish/entity/hbm/PushList.hbm.xml new file mode 100644 index 0000000..5cc5d0a --- /dev/null +++ b/src/main/java/com/ifish/entity/hbm/PushList.hbm.xml @@ -0,0 +1,22 @@ + + + + + false + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/ifish/entity/hbm/QuestionsFeedback.hbm.xml b/src/main/java/com/ifish/entity/hbm/QuestionsFeedback.hbm.xml new file mode 100644 index 0000000..b6e507c --- /dev/null +++ b/src/main/java/com/ifish/entity/hbm/QuestionsFeedback.hbm.xml @@ -0,0 +1,15 @@ + + + + + false + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/ifish/entity/hbm/ShopsInfo.hbm.xml b/src/main/java/com/ifish/entity/hbm/ShopsInfo.hbm.xml new file mode 100644 index 0000000..66fe446 --- /dev/null +++ b/src/main/java/com/ifish/entity/hbm/ShopsInfo.hbm.xml @@ -0,0 +1,31 @@ + + + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/ifish/entity/hbm/Version.hbm.xml b/src/main/java/com/ifish/entity/hbm/Version.hbm.xml new file mode 100644 index 0000000..a75dee8 --- /dev/null +++ b/src/main/java/com/ifish/entity/hbm/Version.hbm.xml @@ -0,0 +1,16 @@ + + + + + false + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/ifish/enums/ActivityTypeEnum.java b/src/main/java/com/ifish/enums/ActivityTypeEnum.java new file mode 100644 index 0000000..8c45add --- /dev/null +++ b/src/main/java/com/ifish/enums/ActivityTypeEnum.java @@ -0,0 +1,62 @@ +package com.ifish.enums; + +/** + * 动态类型 + * + * @author Administrator + * + */ +public enum ActivityTypeEnum { + everyDaySignin("everyDaySignin", "每天签到"), + readInformation("readInformation", "阅读资讯"), + openGoodsLink("openGoodsLink", "查看商品"), + roomLeaveMsg("roomLeaveMsg", "爱鱼看看留言"), + ifishCommunity("ifishCommunity", "爱鱼圈"), + shareIfishApp("shareIfishApp", "分享爱鱼奇"), + shareCameraPicture("shareCameraPicture", "图片分享"), + shareLookReport("shareLookReport", "看护报告"), + rename("rename", "更换姓名"), + uploadHeadImg("uploadHeadImg", "上传头像"), + openShareCamera("openShareCamera", "开启分享"), + choiceLookShops("choiceLookShops", "优选商家"), + ifishDoctor("ifishDoctor", "鱼医生"), + everyDayLogin("everyDayLogin", "每天登陆"), + registerGive("registerGive", "注册赠送"), + //升级 + upgrade("upgrade", "等级提升"), + bindDevice("bindDevice", "绑定水族箱"), + bindCamera("bindCamera", "绑定摄像头"), + //温度预警 + warningByTemperature("warningByTemperature", "温度预警"), + //换水提醒 + reminderByChangeWater("reminderByChangeWater", "换水提醒"), + //商家入驻 + merchantsSettled("merchantsSettled", "商家入驻"); + + private ActivityTypeEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public static boolean getValueByKey(String key) { + for (ActivityTypeEnum actype : ActivityTypeEnum.values()) { + if (actype.getKey().equals(key)) { + return true; + } + } + return false; + } + + private String key; + + private String value; + + public String getKey() { + return key; + } + + public String getValue() { + return value; + } + +} diff --git a/src/main/java/com/ifish/enums/AdTypeEnum.java b/src/main/java/com/ifish/enums/AdTypeEnum.java new file mode 100644 index 0000000..3992c81 --- /dev/null +++ b/src/main/java/com/ifish/enums/AdTypeEnum.java @@ -0,0 +1,43 @@ +package com.ifish.enums; + +public enum AdTypeEnum { + one(1,"首页广告位"), + two(2,"资讯广告位"), + three(3,"优选商家广告位"), + four(4,"签到广告位"), + five(5,"爱鱼看看广告位"), + six(6,"鱼医生广告位"), + seven(7,"loading页广告位"); + + private AdTypeEnum(Integer key,String value){ + this.key = key; + this.value = value; + } + + //普通方法 + public static AdTypeEnum getAdTypeEnum(Integer key) { + for (AdTypeEnum c : AdTypeEnum.values()) { + if (c.getKey().equals(key)) { + return c; + } + } + return null; + } + + private Integer key; + private String value; + + public Integer getKey() { + return key; + } + public void setKey(Integer key) { + this.key = key; + } + public String getValue() { + return value; + } + public void setValue(String value) { + this.value = value; + } + +} diff --git a/src/main/java/com/ifish/enums/AddTypeEnum.java b/src/main/java/com/ifish/enums/AddTypeEnum.java new file mode 100644 index 0000000..84988fe --- /dev/null +++ b/src/main/java/com/ifish/enums/AddTypeEnum.java @@ -0,0 +1,53 @@ +package com.ifish.enums; + +import com.alibaba.fastjson.JSONObject; + + +public enum AddTypeEnum { + once("once","一次"), + everyDay("everyDay","每天"), + everyTime("everyTime","每次"), + keepSignIn("keepSignIn","连续签到"), + addUpSignIn("addUpSignIn","累计签到"); + + private AddTypeEnum(String key,String value){ + this.key = key; + this.value = value; + } + + //普通方法 + public static String getValue(String key) { + for (AddTypeEnum c : AddTypeEnum.values()) { + if (c.getKey().equals(key)) { + return c.getValue(); + } + } + return null; + } + + //普通方法 + public static JSONObject getJson() { + JSONObject json = new JSONObject(); + for (AddTypeEnum addTypeEnum : AddTypeEnum.values()) { + json.put(addTypeEnum.getKey(), addTypeEnum.getValue()); + } + return json; + } + + private String key; + private String value; + + public String getKey() { + return key; + } + public void setKey(String key) { + this.key = key; + } + public String getValue() { + return value; + } + public void setValue(String value) { + this.value = value; + } + +} diff --git a/src/main/java/com/ifish/enums/BooleanEnum.java b/src/main/java/com/ifish/enums/BooleanEnum.java new file mode 100644 index 0000000..d2e1851 --- /dev/null +++ b/src/main/java/com/ifish/enums/BooleanEnum.java @@ -0,0 +1,29 @@ +package com.ifish.enums; + +public enum BooleanEnum { + NO("0","否"), + YES("1","是"); + + private BooleanEnum(String key,String value){ + this.key = key; + this.value = value; + } + + private String key; + private String value; + + + public String getKey() { + return key; + } + public void setKey(String key) { + this.key = key; + } + public String getValue() { + return value; + } + public void setValue(String value) { + this.value = value; + } + +} diff --git a/src/main/java/com/ifish/enums/GoldExpendTypeEnum.java b/src/main/java/com/ifish/enums/GoldExpendTypeEnum.java new file mode 100644 index 0000000..f72519f --- /dev/null +++ b/src/main/java/com/ifish/enums/GoldExpendTypeEnum.java @@ -0,0 +1,56 @@ +package com.ifish.enums; + +import com.alibaba.fastjson.JSONObject; + +/** + * 金币消耗方式 + * @author Administrator + * + */ +public enum GoldExpendTypeEnum { + + questionPayTour("questionPayTour","鱼医生打赏"), + liveRoomPayTour("liveRoomPayTour","爱鱼看看打赏"), + exchangeCoupon("exchangeCoupon","兑换优惠券"); + + private GoldExpendTypeEnum(String key,String value){ + this.key = key; + this.value = value; + } + + //普通方法 + public static String getValue(String key) { + for (GoldExpendTypeEnum c : GoldExpendTypeEnum.values()) { + if (c.getKey().equals(key)) { + return c.getValue(); + } + } + return null; + } + + //普通方法 + public static JSONObject getJson() { + JSONObject json = new JSONObject(); + for (GoldExpendTypeEnum ruleEnum : GoldExpendTypeEnum.values()) { + json.put(ruleEnum.getKey(), ruleEnum.getValue()); + } + return json; + } + + private String key; + private String value; + + public String getKey() { + return key; + } + public void setKey(String key) { + this.key = key; + } + public String getValue() { + return value; + } + public void setValue(String value) { + this.value = value; + } + +} diff --git a/src/main/java/com/ifish/enums/GoldGetTypeEnum.java b/src/main/java/com/ifish/enums/GoldGetTypeEnum.java new file mode 100644 index 0000000..8377ce7 --- /dev/null +++ b/src/main/java/com/ifish/enums/GoldGetTypeEnum.java @@ -0,0 +1,73 @@ +package com.ifish.enums; + +import com.alibaba.fastjson.JSONObject; + +/** + * 金币获取方式 + * @author Administrator + * + */ +public enum GoldGetTypeEnum { + //每天加成 + everyDaySignin("everyDaySignin","每天签到"), + readInformation("readInformation","阅读资讯"), + openGoodsLink("openGoodsLink","查看商品"), + roomLeaveMsg("roomLeaveMsg","爱鱼看看留言"), + ifishCommunity("ifishCommunity","爱鱼圈"), + shareCameraPicture("shareCameraPicture","图片分享"), + shareLookReport("shareLookReport","看护报告"), + hitGoldenEgg("hitGoldenEgg","砸金蛋"), + shareIfishApp("shareIfishApp","分享爱鱼奇"), + //一次加成 + rename("rename","更换姓名"), + uploadHeadImg("uploadHeadImg","上传头像"), + openShareCamera("openShareCamera","开启分享"), + choiceLookShops("choiceLookShops","优选商家"), + ifishDoctor("ifishDoctor","鱼医生"), + //每次加成 + questionPayTour("questionPayTour","问题打赏"), + liveRoomPayTour("liveRoomPayTour","爱鱼看看打赏"), + //系统赠送 + registerGive("registerGive","注册赠送"); + + private GoldGetTypeEnum(String key,String value){ + this.key = key; + this.value = value; + } + + //普通方法 + public static String getValue(String key) { + for (GoldGetTypeEnum c : GoldGetTypeEnum.values()) { + if (c.getKey().equals(key)) { + return c.getValue(); + } + } + return null; + } + + //普通方法 + public static JSONObject getJson() { + JSONObject json = new JSONObject(); + for (GoldGetTypeEnum ruleEnum : GoldGetTypeEnum.values()) { + json.put(ruleEnum.getKey(), ruleEnum.getValue()); + } + return json; + } + + private String key; + private String value; + + public String getKey() { + return key; + } + public void setKey(String key) { + this.key = key; + } + public String getValue() { + return value; + } + public void setValue(String value) { + this.value = value; + } + +} diff --git a/src/main/java/com/ifish/enums/GradeGetTypeEnum.java b/src/main/java/com/ifish/enums/GradeGetTypeEnum.java new file mode 100644 index 0000000..938a52a --- /dev/null +++ b/src/main/java/com/ifish/enums/GradeGetTypeEnum.java @@ -0,0 +1,39 @@ +package com.ifish.enums; + +/** + * 经验获取方式 + * @author Administrator + */ +public enum GradeGetTypeEnum { + //一次加成 + bindDevice("bindDevice","绑定水族箱"), + bindCamera("bindCamera","绑定摄像头"), + //每天加成 + everyDayLogin("everyDayLogin","每天登陆"); + + private String key; + private String value; + + private GradeGetTypeEnum(String key,String value){ + this.key = key; + this.value = value; + } + + public String getKey(String key){ + for (GradeGetTypeEnum em : GradeGetTypeEnum.values()) { + if(em.getKey().equals(key)){ + return em.getValue(); + } + } + return null; + } + + public String getKey() { + return key; + } + + public String getValue() { + return value; + } + +} diff --git a/src/main/java/com/ifish/enums/GwellEnum.java b/src/main/java/com/ifish/enums/GwellEnum.java new file mode 100644 index 0000000..042dbe0 --- /dev/null +++ b/src/main/java/com/ifish/enums/GwellEnum.java @@ -0,0 +1,29 @@ +package com.ifish.enums; + +public enum GwellEnum { + success("0","注册成功"),//注册成功 + fail("1","注册失败"),//注册失败 + repeat("7","邮箱已被注册");//邮箱已被注册 + + private GwellEnum(String key,String value){ + this.key = key; + this.value = value; + } + + private String key; + private String value; + + + public String getKey() { + return key; + } + public void setKey(String key) { + this.key = key; + } + public String getValue() { + return value; + } + public void setValue(String value) { + this.value = value; + } +} diff --git a/src/main/java/com/ifish/enums/IfishShopPlaceEnum.java b/src/main/java/com/ifish/enums/IfishShopPlaceEnum.java new file mode 100644 index 0000000..3546878 --- /dev/null +++ b/src/main/java/com/ifish/enums/IfishShopPlaceEnum.java @@ -0,0 +1,55 @@ +package com.ifish.enums; + +import com.alibaba.fastjson.JSONObject; + +/** + * 商品位置 + * @author Administrator + * + */ +public enum IfishShopPlaceEnum { + one(1,"首页"), + two(2,"鱼医生"), + three(3,"探索-爱鱼严选"), + fore(4,"商家-进货管理"); + + private IfishShopPlaceEnum(Integer key,String value){ + this.key = key; + this.value = value; + } + + //普通方法 + public static IfishShopPlaceEnum getAdTypeEnum(Integer key) { + for (IfishShopPlaceEnum c : IfishShopPlaceEnum.values()) { + if (c.getKey().equals(key)) { + return c; + } + } + return null; + } + + public static JSONObject getJson() { + JSONObject json = new JSONObject(); + for (IfishShopPlaceEnum adTypeEnum : IfishShopPlaceEnum.values()) { + json.put(adTypeEnum.getKey().toString(), adTypeEnum.getValue()); + } + return json; + } + + private Integer key; + private String value; + + public Integer getKey() { + return key; + } + public void setKey(Integer key) { + this.key = key; + } + public String getValue() { + return value; + } + public void setValue(String value) { + this.value = value; + } + +} diff --git a/src/main/java/com/ifish/enums/Index1Enum.java b/src/main/java/com/ifish/enums/Index1Enum.java new file mode 100644 index 0000000..b27a453 --- /dev/null +++ b/src/main/java/com/ifish/enums/Index1Enum.java @@ -0,0 +1,40 @@ +package com.ifish.enums; + +public enum Index1Enum { + number0("0","简直是鱼儿的地狱啊"), + number10("10","鱼儿能继续活下去也是个奇迹"), + number20("20","还凑合~"), + number30("30","良好,棒棒哒"); + + private Index1Enum(String key,String value){ + this.key = key; + this.value = value; + } + + private String key; + private String value; + + //普通方法 + public static String getValue(String key) { + for (Index1Enum c : Index1Enum.values()) { + if (c.getKey().equals(key)) { + return c.getValue(); + } + } + return null; + } + + public String getKey() { + return key; + } + public void setKey(String key) { + this.key = key; + } + public String getValue() { + return value; + } + public void setValue(String value) { + this.value = value; + } + +} diff --git a/src/main/java/com/ifish/enums/Index2Enum.java b/src/main/java/com/ifish/enums/Index2Enum.java new file mode 100644 index 0000000..bf1bed5 --- /dev/null +++ b/src/main/java/com/ifish/enums/Index2Enum.java @@ -0,0 +1,40 @@ +package com.ifish.enums; + +public enum Index2Enum { + number0("0","这是有多久没喂了"), + number10("10","喂太少了,鱼儿快饿死啦"), + number20("20","喂太多了,以后少喂点"), + number30("30","饱食度刚好,赞一个"); + + private Index2Enum(String key,String value){ + this.key = key; + this.value = value; + } + + private String key; + private String value; + + //普通方法 + public static String getValue(String key) { + for (Index2Enum c : Index2Enum.values()) { + if (c.getKey().equals(key)) { + return c.getValue(); + } + } + return null; + } + + public String getKey() { + return key; + } + public void setKey(String key) { + this.key = key; + } + public String getValue() { + return value; + } + public void setValue(String value) { + this.value = value; + } + +} diff --git a/src/main/java/com/ifish/enums/Index3Enum.java b/src/main/java/com/ifish/enums/Index3Enum.java new file mode 100644 index 0000000..98b6b71 --- /dev/null +++ b/src/main/java/com/ifish/enums/Index3Enum.java @@ -0,0 +1,40 @@ +package com.ifish.enums; + +public enum Index3Enum { + number0("0","病怏怏的,快不行了"), + number15("15","需要赶紧上药了哦"), + number25("25","还好,多观察几天"), + number40("40","活蹦乱跳,好着呢"); + + private Index3Enum(String key,String value){ + this.key = key; + this.value = value; + } + + private String key; + private String value; + + //普通方法 + public static String getValue(String key) { + for (Index3Enum c : Index3Enum.values()) { + if (c.getKey().equals(key)) { + return c.getValue(); + } + } + return null; + } + + public String getKey() { + return key; + } + public void setKey(String key) { + this.key = key; + } + public String getValue() { + return value; + } + public void setValue(String value) { + this.value = value; + } + +} diff --git a/src/main/java/com/ifish/enums/LiveRoomOrderTypeEnum.java b/src/main/java/com/ifish/enums/LiveRoomOrderTypeEnum.java new file mode 100644 index 0000000..b0fe3a2 --- /dev/null +++ b/src/main/java/com/ifish/enums/LiveRoomOrderTypeEnum.java @@ -0,0 +1,45 @@ +package com.ifish.enums; + + +/** + * 直播间排序 + * @author Administrator + * + */ +public enum LiveRoomOrderTypeEnum { + one(1,"时间倒序"), + two(2,"人气值倒序"), + three(3,"后台推荐顺序"); + + private LiveRoomOrderTypeEnum(Integer key,String value){ + this.key = key; + this.value = value; + } + + //普通方法 + public static LiveRoomOrderTypeEnum getAdTypeEnum(Integer key) { + for (LiveRoomOrderTypeEnum c : LiveRoomOrderTypeEnum.values()) { + if (c.getKey().equals(key)) { + return c; + } + } + return null; + } + + private Integer key; + private String value; + + public Integer getKey() { + return key; + } + public void setKey(Integer key) { + this.key = key; + } + public String getValue() { + return value; + } + public void setValue(String value) { + this.value = value; + } + +} diff --git a/src/main/java/com/ifish/enums/MemberLevelEnum.java b/src/main/java/com/ifish/enums/MemberLevelEnum.java new file mode 100644 index 0000000..045fe19 --- /dev/null +++ b/src/main/java/com/ifish/enums/MemberLevelEnum.java @@ -0,0 +1,28 @@ +package com.ifish.enums; + +/** + * 商家会员等级 + * @author Administrator + * + */ +public enum MemberLevelEnum { + level_1(1,"等级1"), + level_2(2,"等级2"), + level_3(3,"等级3"); + + private MemberLevelEnum(int key,String value){ + this.key = key; + this.value = value; + } + + private int key; + private String value; + + + public int getKey() { + return key; + } + public String getValue() { + return value; + } +} diff --git a/src/main/java/com/ifish/enums/NeteaseEnum.java b/src/main/java/com/ifish/enums/NeteaseEnum.java new file mode 100644 index 0000000..b0e5062 --- /dev/null +++ b/src/main/java/com/ifish/enums/NeteaseEnum.java @@ -0,0 +1,28 @@ +package com.ifish.enums; + +public enum NeteaseEnum { + status200("200","操作成功"), + status414("414","参数错误"); + + private NeteaseEnum(String key,String value){ + this.key = key; + this.value = value; + } + + private String key; + private String value; + + + public String getKey() { + return key; + } + public void setKey(String key) { + this.key = key; + } + public String getValue() { + return value; + } + public void setValue(String value) { + this.value = value; + } +} diff --git a/src/main/java/com/ifish/enums/PayTourTypeEnum.java b/src/main/java/com/ifish/enums/PayTourTypeEnum.java new file mode 100644 index 0000000..e786fda --- /dev/null +++ b/src/main/java/com/ifish/enums/PayTourTypeEnum.java @@ -0,0 +1,53 @@ +package com.ifish.enums; + +import java.math.BigDecimal; + +import com.alibaba.fastjson.JSONObject; + + +public enum PayTourTypeEnum { + gold10("0",new BigDecimal(10)), + gold20("1",new BigDecimal(20)), + gold50("2",new BigDecimal(50)); + + private PayTourTypeEnum(String key,BigDecimal value){ + this.key = key; + this.value = value; + } + + //普通方法 + public static BigDecimal getValue(String key) { + for (PayTourTypeEnum c : PayTourTypeEnum.values()) { + if (c.getKey().equals(key)) { + return c.getValue(); + } + } + return null; + } + + //普通方法 + public static JSONObject getJson() { + JSONObject json = new JSONObject(); + for (PayTourTypeEnum addTypeEnum : PayTourTypeEnum.values()) { + json.put(addTypeEnum.getKey(), addTypeEnum.getValue()); + } + return json; + } + + private String key; + private BigDecimal value; + + public String getKey() { + return key; + } + public void setKey(String key) { + this.key = key; + } + public BigDecimal getValue() { + return value; + } + public void setValue(BigDecimal value) { + this.value = value; + } + +} diff --git a/src/main/java/com/ifish/enums/PhoneTypeEnum.java b/src/main/java/com/ifish/enums/PhoneTypeEnum.java new file mode 100644 index 0000000..e5d16a0 --- /dev/null +++ b/src/main/java/com/ifish/enums/PhoneTypeEnum.java @@ -0,0 +1,29 @@ +package com.ifish.enums; + +public enum PhoneTypeEnum { + ios("ios","ios"), + android("android","安卓"); + + private PhoneTypeEnum(String key,String value){ + this.key = key; + this.value = value; + } + + private String key; + private String value; + + + public String getKey() { + return key; + } + public void setKey(String key) { + this.key = key; + } + public String getValue() { + return value; + } + public void setValue(String value) { + this.value = value; + } + +} diff --git a/src/main/java/com/ifish/enums/PushTypeEnum.java b/src/main/java/com/ifish/enums/PushTypeEnum.java new file mode 100644 index 0000000..d2a30b9 --- /dev/null +++ b/src/main/java/com/ifish/enums/PushTypeEnum.java @@ -0,0 +1,45 @@ +package com.ifish.enums; + +public enum PushTypeEnum { + remove_device("remove_device","解绑通知"), + wendu_warn("wendu_warn","温度预警"), + qu_reply("qu_reply","问题反馈"), + app_update("app_update","IOS更新推送"), + remind_water("remind_water","换水提醒"), + offline_push("offline_push","离线通知"), + send_report("send_report","看护报告"), + shops_push("shops_push","看护通知"), + all_push("all_push","所有用户推送"); + + private PushTypeEnum(String key,String value){ + this.key = key; + this.value = value; + } + + private String key; + private String value; + + //普通方法 + public static String getValue(String key) { + for (PushTypeEnum c : PushTypeEnum.values()) { + if (c.getKey().equals(key)) { + return c.getValue(); + } + } + return null; + } + + public String getKey() { + return key; + } + public void setKey(String key) { + this.key = key; + } + public String getValue() { + return value; + } + public void setValue(String value) { + this.value = value; + } + +} diff --git a/src/main/java/com/ifish/enums/ResultEnum.java b/src/main/java/com/ifish/enums/ResultEnum.java new file mode 100644 index 0000000..b2693a4 --- /dev/null +++ b/src/main/java/com/ifish/enums/ResultEnum.java @@ -0,0 +1,63 @@ +package com.ifish.enums; + +/** + * 请求结果状态码 + * + * @author ggw + * + */ +public enum ResultEnum { + success("100", "成功"), + fail101("101", "失败"), + warn201("201", "手机已经注册过"), + warn202("202", "手机未注册"), + warn203("203", "未知操作"),//获取验证码时 + warn204("204", "密码不正确"), + warn205("205", "图片格式不正确"), + warn206("206", "上传图片太大"), + warn207("207", "设备不存在"), + warn208("208", "激活码已被使用"), + warn209("209", "无效的激活码"), + warn210("210", "摄像头不存在"), + warn211("211", "用户ID不存在"), + warn212("212", "请填写正确的商家手机号"), + warn213("213", "包含敏感词"), + warn214("214", "直播间已存在"), + warn215("215", "金币不足"), + warn216("216", "金币规则不存在"), + warn217("217", "打赏金额错误"), + warn218("218", "没有商家"), + warn219("219", "优惠券已停止兑换"), + warn220("220", "用户能兑换数量达到上限"), + warn221("221", "优惠券已全部兑换完"), + warn222("222", "请上传正确的商品介绍图"), + warn223("223", "请上传正确的商品介绍视频"), + error400("400", "安全校验失败"), + error401("401", "参数校验失败"), + error402("402", "参数不存在"); + + private ResultEnum(String key, String value) { + this.key = key; + this.value = value; + } + + private String key; + private String value; + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + +} diff --git a/src/main/java/com/ifish/enums/RoomStatusEnum.java b/src/main/java/com/ifish/enums/RoomStatusEnum.java new file mode 100644 index 0000000..7daae3a --- /dev/null +++ b/src/main/java/com/ifish/enums/RoomStatusEnum.java @@ -0,0 +1,30 @@ +package com.ifish.enums; + +public enum RoomStatusEnum { + status0("0","未开播"), + status1("1","直播中"), + status2("2","被禁播"); + + private RoomStatusEnum(String key,String value){ + this.key = key; + this.value = value; + } + + private String key; + private String value; + + + public String getKey() { + return key; + } + public void setKey(String key) { + this.key = key; + } + public String getValue() { + return value; + } + public void setValue(String value) { + this.value = value; + } + +} diff --git a/src/main/java/com/ifish/enums/SendTypeEnum.java b/src/main/java/com/ifish/enums/SendTypeEnum.java new file mode 100644 index 0000000..88d8c85 --- /dev/null +++ b/src/main/java/com/ifish/enums/SendTypeEnum.java @@ -0,0 +1,34 @@ +package com.ifish.enums; + +/** + * 获取验证码操作类型 + * @author ggw + * + */ +public enum SendTypeEnum { + register("1","注册操作"), + findpwd("2","找回密码操作"); + + private SendTypeEnum(String key,String value){ + this.key = key; + this.value = value; + } + + private String key; + private String value; + + + public String getKey() { + return key; + } + public void setKey(String key) { + this.key = key; + } + public String getValue() { + return value; + } + public void setValue(String value) { + this.value = value; + } + +} diff --git a/src/main/java/com/ifish/enums/ShopsStatusEnum.java b/src/main/java/com/ifish/enums/ShopsStatusEnum.java new file mode 100644 index 0000000..a206d3a --- /dev/null +++ b/src/main/java/com/ifish/enums/ShopsStatusEnum.java @@ -0,0 +1,31 @@ +package com.ifish.enums; + +public enum ShopsStatusEnum { + status0("0","审核失败"), + status1("1","审核通过"), + status2("2","待审核"), + status3("3","禁用"); + + private ShopsStatusEnum(String key,String value){ + this.key = key; + this.value = value; + } + + private String key; + private String value; + + + public String getKey() { + return key; + } + public void setKey(String key) { + this.key = key; + } + public String getValue() { + return value; + } + public void setValue(String value) { + this.value = value; + } + +} diff --git a/src/main/java/com/ifish/enums/SmsSignEnum.java b/src/main/java/com/ifish/enums/SmsSignEnum.java new file mode 100644 index 0000000..55eb9d7 --- /dev/null +++ b/src/main/java/com/ifish/enums/SmsSignEnum.java @@ -0,0 +1,32 @@ +package com.ifish.enums; + +public enum SmsSignEnum { + sign1("sign1","活动验证"), + sign2("sign2","变更验证"), + sign3("sign3","登录验证"), + sign4("sign4","注册验证"), + sign5("sign5","身份验证"); + + private SmsSignEnum(String key,String value){ + this.key = key; + this.value = value; + } + + private String key; + private String value; + + + public String getKey() { + return key; + } + public void setKey(String key) { + this.key = key; + } + public String getValue() { + return value; + } + public void setValue(String value) { + this.value = value; + } + +} diff --git a/src/main/java/com/ifish/enums/SmsTemplateEnum.java b/src/main/java/com/ifish/enums/SmsTemplateEnum.java new file mode 100644 index 0000000..9038d30 --- /dev/null +++ b/src/main/java/com/ifish/enums/SmsTemplateEnum.java @@ -0,0 +1,34 @@ +package com.ifish.enums; + +public enum SmsTemplateEnum { + SMS_720021("SMS_720021","身份验证验证码"), + SMS_720020("SMS_720020","登陆确认验证码"), + SMS_720019("SMS_720019","登陆异常验证码"), + SMS_720018("SMS_720018","用户注册验证码"), + SMS_720017("SMS_720017","活动确认验证码"), + SMS_720016("SMS_720016","修改密码验证码"), + SMS_720015("SMS_720015","信息变更验证码"); + + private SmsTemplateEnum(String key,String value){ + this.key = key; + this.value = value; + } + + private String key; + private String value; + + + public String getKey() { + return key; + } + public void setKey(String key) { + this.key = key; + } + public String getValue() { + return value; + } + public void setValue(String value) { + this.value = value; + } + +} diff --git a/src/main/java/com/ifish/enums/SubDirectoryEnum.java b/src/main/java/com/ifish/enums/SubDirectoryEnum.java new file mode 100644 index 0000000..c8f93a8 --- /dev/null +++ b/src/main/java/com/ifish/enums/SubDirectoryEnum.java @@ -0,0 +1,40 @@ +package com.ifish.enums; + + +/** + * 子目录 + * @author Administrator + * + */ +public enum SubDirectoryEnum { + headImage("app/","头像"), + banner("banner/","banner图"), + look("look/","看护报告"), + ueditorHtml("ueditorHtml/","后台生成的网页"), + adInfo("Img/adInfo/","广告图片"), + information("Img/information/","资讯图片"), + ifishGoods("Img/goods/","商品图片"), + ifishCommodity("Img/commodity/","商家商品介绍图"); + + private SubDirectoryEnum(String key,String value){ + this.key = key; + this.value = value; + } + + private String key; + private String value; + + public String getKey() { + return key; + } + public void setKey(String key) { + this.key = key; + } + public String getValue() { + return value; + } + public void setValue(String value) { + this.value = value; + } + +} diff --git a/src/main/java/com/ifish/enums/UeditorTypeEnum.java b/src/main/java/com/ifish/enums/UeditorTypeEnum.java new file mode 100644 index 0000000..1db448a --- /dev/null +++ b/src/main/java/com/ifish/enums/UeditorTypeEnum.java @@ -0,0 +1,39 @@ +package com.ifish.enums; + +import com.alibaba.fastjson.JSONObject; + +public enum UeditorTypeEnum { + yespinglun("1","可评论"), + nopinglun("0","不可评论"); + + private UeditorTypeEnum(String key,String value){ + this.key = key; + this.value = value; + } + + private String key; + private String value; + + //普通方法 + public static JSONObject getJson() { + JSONObject json = new JSONObject(); + for (UeditorTypeEnum ueditorTypeEnumEnum : UeditorTypeEnum.values()) { + json.put(ueditorTypeEnumEnum.getKey(), ueditorTypeEnumEnum.getValue()); + } + return json; + } + + public String getKey() { + return key; + } + public void setKey(String key) { + this.key = key; + } + public String getValue() { + return value; + } + public void setValue(String value) { + this.value = value; + } + +} diff --git a/src/main/java/com/ifish/enums/UserTypeEnum.java b/src/main/java/com/ifish/enums/UserTypeEnum.java new file mode 100644 index 0000000..8b6e318 --- /dev/null +++ b/src/main/java/com/ifish/enums/UserTypeEnum.java @@ -0,0 +1,29 @@ +package com.ifish.enums; + +public enum UserTypeEnum { + userType0("0","普通用户"), + userType1("1","商家用户"); + + private UserTypeEnum(String key,String value){ + this.key = key; + this.value = value; + } + + private String key; + private String value; + + + public String getKey() { + return key; + } + public void setKey(String key) { + this.key = key; + } + public String getValue() { + return value; + } + public void setValue(String value) { + this.value = value; + } + +} diff --git a/src/main/java/com/ifish/exception/ExceptionHandle.java b/src/main/java/com/ifish/exception/ExceptionHandle.java new file mode 100644 index 0000000..ee2cc47 --- /dev/null +++ b/src/main/java/com/ifish/exception/ExceptionHandle.java @@ -0,0 +1,37 @@ +package com.ifish.exception; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.ifish.dto.JsonResult; +import com.ifish.enums.ResultEnum; +import com.ifish.util.ResultUtil; + +/** + * 异常处理 + * @author Administrator + */ +@ControllerAdvice +public class ExceptionHandle{ + + private static Logger log = LoggerFactory.getLogger(ExceptionHandle.class); + + @ExceptionHandler(value=Exception.class) + @ResponseBody + public JsonResult Handle(Exception e) { + log.error("Exception:"+e.toString()); + e.printStackTrace(); + //自定义异常 + if(e instanceof IfishException){ + IfishException ifishException = (IfishException) e; + return ResultUtil.error(ifishException.getResult()); + } + else{ + return ResultUtil.error(ResultEnum.fail101.getKey()); + } + } + +} diff --git a/src/main/java/com/ifish/exception/IfishException.java b/src/main/java/com/ifish/exception/IfishException.java new file mode 100644 index 0000000..0e7847b --- /dev/null +++ b/src/main/java/com/ifish/exception/IfishException.java @@ -0,0 +1,26 @@ +package com.ifish.exception; + +import com.ifish.enums.ResultEnum; + +/** + * 自定义异常 + * + * @author Administrator + * + */ +public class IfishException extends RuntimeException { + + private static final long serialVersionUID = 4182058914725642218L; + + private String result; + + public IfishException(ResultEnum resultEnum) { + super(resultEnum.getValue()); + this.result = resultEnum.getKey(); + } + + public String getResult() { + return result; + } + +} diff --git a/src/main/java/com/ifish/gwell/GwellApi.java b/src/main/java/com/ifish/gwell/GwellApi.java new file mode 100644 index 0000000..740c151 --- /dev/null +++ b/src/main/java/com/ifish/gwell/GwellApi.java @@ -0,0 +1,224 @@ +package com.ifish.gwell; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.ifish.enums.GwellEnum; +import com.ifish.mail.Mail; +import com.ifish.netease.CheckSumBuilder; + +public class GwellApi { + + private static Logger log = LoggerFactory.getLogger(GwellApi.class); + + /** + * 注册 + * @param phoneNumber + * @return + */ + public static Map Register(String phoneNumber){ + String email = getEmail(phoneNumber); + String pwd = getPwd(phoneNumber); + Map map = new HashMap(); + URL url = null; + HttpURLConnection httpurlconnection = null; + try{ + if(url==null){ + url = new URL("http://api1.cloudlinks.cn/Users/RegisterCheck.ashx"); + } + if(httpurlconnection==null){ + //以post方式请求 + httpurlconnection = (HttpURLConnection)url.openConnection(); + httpurlconnection.setReadTimeout(30000); + httpurlconnection.setConnectTimeout(30000); + //是否输入参数 + httpurlconnection.setDoOutput(true); + //提交模式 + httpurlconnection.setRequestMethod("POST"); + } + StringBuffer params = new StringBuffer(); + params.append("Email="+email+"&"); + params.append("Pwd="+pwd+"&"); + params.append("RePwd="+pwd+"&"); + params.append("VersionFlag=1&"); + params.append("CountryCode=&"); + params.append("IgnoreSafeWarning=1"); + OutputStream out = httpurlconnection.getOutputStream(); + out.write(params.toString().getBytes()); + out.flush(); + out.close(); + //获取响应代码 + int code = httpurlconnection.getResponseCode(); + if(code==200){ + //获取页面内容 + InputStream in= httpurlconnection .getInputStream(); + BufferedReader breader = new BufferedReader(new InputStreamReader(in,"utf-8")); + String jsonStr=""; + String str = breader.readLine(); + while(str != null){ + jsonStr+=str; + str = breader.readLine(); + } + breader.close(); + in.close(); + //System.out.println(jsonStr); + JSONObject json = JSON.parseObject(jsonStr); + String error_code = json.getString("error_code"); + //注册成功 + if(error_code.equals("0")){ + String P2PVerifyCode1 = json.getString("P2PVerifyCode1"); + String P2PVerifyCode2 = json.getString("P2PVerifyCode2"); + String UserID = json.getString("UserID"); + map.put("result", GwellEnum.success.getKey()); + map.put("P2PVerifyCode1", P2PVerifyCode1); + map.put("P2PVerifyCode2", P2PVerifyCode2); + map.put("UserID", UserID); + return map; + } + //邮箱已被注册 + else if(error_code.equals("7")){ + String error = json.getString("error"); + map.put("result", GwellEnum.repeat.getKey()); + map.put("error", error); + } + //失败 + else if(error_code.equals("1")){ + //发送邮件 + Mail.send(phoneNumber+"注册技威失败了", "注册技威失败!错误信息:"+jsonStr); + String error = json.getString("error"); + map.put("result", GwellEnum.fail.getKey()); + map.put("error", error); + return map; + } + } + } + catch(Exception e){ + e.printStackTrace(); + log.error(e.toString()); + } + finally{ + if(httpurlconnection!=null){ + httpurlconnection.disconnect(); + } + } + return map; + } + + + /** + * 登陆 + * @param phoneNumber + * @return + */ + public static Map Login(String phoneNumber){ + String email = getEmail(phoneNumber); + String pwd = getPwd(phoneNumber); + Map map = new HashMap(); + URL url = null; + HttpURLConnection httpurlconnection = null; + try{ + if(url==null){ + url = new URL("http://api1.cloudlinks.cn/Users/LoginCheck.ashx"); + } + if(httpurlconnection==null){ + //以post方式请求 + httpurlconnection = (HttpURLConnection)url.openConnection(); + httpurlconnection.setReadTimeout(30000); + httpurlconnection.setConnectTimeout(30000); + //是否输入参数 + httpurlconnection.setDoOutput(true); + //提交模式 + httpurlconnection.setRequestMethod("POST"); + } + StringBuffer params = new StringBuffer(); + params.append("User="+email+"&"); + params.append("Pwd="+pwd+"&"); + params.append("VersionFlag=1&"); + params.append("AppVersion=3014666&"); + params.append("AppOS=3"); + OutputStream out = httpurlconnection.getOutputStream(); + out.write(params.toString().getBytes()); + out.flush(); + out.close(); + //获取响应代码 + int code = httpurlconnection.getResponseCode(); + if(code==200){ + //获取页面内容 + InputStream in= httpurlconnection .getInputStream(); + BufferedReader breader = new BufferedReader(new InputStreamReader(in,"utf-8")); + String jsonStr=""; + String str = breader.readLine(); + while(str != null){ + jsonStr+=str; + str = breader.readLine(); + } + breader.close(); + in.close(); + //System.out.println(jsonStr); + JSONObject json = JSON.parseObject(jsonStr); + String error_code = json.getString("error_code"); + if(error_code.equals("0")){ + String P2PVerifyCode1 = json.getString("P2PVerifyCode1"); + String P2PVerifyCode2 = json.getString("P2PVerifyCode2"); + String UserID = json.getString("UserID"); + map.put("result", GwellEnum.success.getKey()); + map.put("P2PVerifyCode1", P2PVerifyCode1); + map.put("P2PVerifyCode2", P2PVerifyCode2); + map.put("UserID", UserID); + return map; + } + else{ + String error = json.getString("error"); + map.put("result", GwellEnum.fail.getKey()); + map.put("error", error); + return map; + } + } + } + catch(Exception e){ + log.error(e.toString()); + } + finally{ + if(httpurlconnection!=null){ + httpurlconnection.disconnect(); + } + } + return map; + } + + /** + * 获取用户名 + * @param phoneNumber + * @return + */ + public static String getEmail(String phoneNumber){ + String email = "ifish7"+phoneNumber+"@ifish7.com"; + return email; + } + /** + * 获取密码 + * @param phoneNumber + * @return + */ + public static String getPwd(String phoneNumber){ + String pwd = CheckSumBuilder.getMD5("ifish"+phoneNumber); + return pwd; + } + + + public static void main(String[] args) { + Register("15216102193"); + } + +} diff --git a/src/main/java/com/ifish/helper/CameraUserHelper.java b/src/main/java/com/ifish/helper/CameraUserHelper.java new file mode 100644 index 0000000..c94b0fe --- /dev/null +++ b/src/main/java/com/ifish/helper/CameraUserHelper.java @@ -0,0 +1,79 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ifish.helper; + +import com.ifish.entity.Camera; +import com.ifish.entity.CameraUser; +import com.ifish.mapper.Tbl_Camera_Mapper; +import com.ifish.mapper.Tbl_Camera_User_Mapper; +import com.ifish.util.RedisKey; +import com.ifish.util.StringUtil; +import java.util.List; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * + * @author Administrator + */ +@Component +public class CameraUserHelper implements CameraUserHelperI { + + @Autowired + private Tbl_Camera_User_Mapper tbl_Camera_User_Mapper; + + @Autowired + private Tbl_Camera_Mapper tbl_Camera_Mapper; + + @Autowired + private RedisHelperI redisHelperI; + + /** + * 根据用户Id获取用户绑定的摄像头 + * + * @param userId + * @return + */ + public List getCameraUserListByUserId(Integer userId) throws Exception { + + List cameraUserList = null; + String key = RedisKey.CameraUser_key + userId; + String redisString = redisHelperI.getRedis(key); + if (StringUtils.isNotBlank(redisString)) { + cameraUserList = (List) StringUtil.JsonToList(redisString, CameraUser.class); + } else { + cameraUserList = tbl_Camera_User_Mapper.getCameraUserListByUserId(userId); + if (cameraUserList != null && cameraUserList.size() > 0) { + redisHelperI.setRedis(key, StringUtil.ObjectToJson(cameraUserList)); + } + } + return cameraUserList; + } + + /** + * 根据摄像头Id获取摄像头信息 + * + * @param cameraId + * @return + * @throws Exception + */ + public Camera getCameraById(String cameraId) throws Exception { + Camera camera = null; + String key = RedisKey.CameraUser_key + cameraId; + String redisString = redisHelperI.getRedis(key); + if (StringUtils.isNotBlank(redisString)) { + camera = (Camera) StringUtil.JsonToBean(redisString, Camera.class); + } else { + camera = tbl_Camera_Mapper.getCameraById(cameraId); + if (camera != null && StringUtils.isNotBlank(camera.getCameraId())) { + redisHelperI.setRedis(key, StringUtil.ObjectToJson(camera)); + } + } + return camera; + } + +} diff --git a/src/main/java/com/ifish/helper/CameraUserHelperI.java b/src/main/java/com/ifish/helper/CameraUserHelperI.java new file mode 100644 index 0000000..f99429e --- /dev/null +++ b/src/main/java/com/ifish/helper/CameraUserHelperI.java @@ -0,0 +1,35 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ifish.helper; + +import com.ifish.entity.Camera; +import com.ifish.entity.CameraUser; +import java.util.List; + +/** + * + * @author Administrator + */ +public interface CameraUserHelperI { + + /** + * 根据用户Id获取用户绑定的摄像头 + * + * @param userId + * @return + */ + List getCameraUserListByUserId(Integer userId) throws Exception; + + /** + * 根据摄像头Id获取摄像头信息 + * + * @param cameraId + * @return + * @throws Exception + */ + Camera getCameraById(String cameraId) throws Exception; + +} diff --git a/src/main/java/com/ifish/helper/CommodityInfoHelper.java b/src/main/java/com/ifish/helper/CommodityInfoHelper.java new file mode 100644 index 0000000..7b00cd5 --- /dev/null +++ b/src/main/java/com/ifish/helper/CommodityInfoHelper.java @@ -0,0 +1,161 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ifish.helper; + +import com.ifish.bean.CommodityInfoBean; +import com.ifish.dto.JsonResult; +import com.ifish.dto.PageingDto; +import com.ifish.enums.ResultEnum; +import com.ifish.exception.IfishException; +import com.ifish.mapper.Tbl_Commodity_Info_Mapper; +import com.ifish.util.IfishFilePath; +import java.io.File; +import java.util.List; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; +import com.ifish.util.IfishUtil; + +/** + * 商品管理所有接口方法 + * + * @author Administrator + */ +@Component +public class CommodityInfoHelper implements CommodityInfoHelperI { + + @Autowired + private Tbl_Commodity_Info_Mapper tbl_Commodity_Info_Mapper; + + @Autowired + private FastDFSClientI fastDFSClientI; + + @Override + public JsonResult createCommodityInfo(CommodityInfoBean commodityInfoBean, MultipartFile img, MultipartFile vedio) { + try { + //保存图片 + if (img != null) { + if (!img.getOriginalFilename().equals("")) { + String filename = String.valueOf(System.currentTimeMillis()) + ".png"; + File picFile = new File(IfishFilePath.path_commodity + "/" + commodityInfoBean.getUserId(), filename); + //不存在则创建 + if (!picFile.exists()) { + picFile.mkdirs(); + } + //保存 + img.transferTo(picFile); + commodityInfoBean.setCommodityImg(filename); + } else { + return new JsonResult(ResultEnum.warn222.getKey(), ""); + } + } else { + return new JsonResult(ResultEnum.warn223.getKey(), ""); + } + //保存视频 + if (vedio != null) { + String url = fastDFSClientI.uploadFileToFastDFS(vedio); + if (StringUtils.isNotBlank(url)) { + commodityInfoBean.setCommodityVideo(url); + } else { + return new JsonResult(ResultEnum.warn223.getKey(), ""); + } + } else { + return new JsonResult(ResultEnum.warn223.getKey(), ""); + } + + int i = tbl_Commodity_Info_Mapper.createCommodityInfo(commodityInfoBean); + if (i > 0) { + int id = commodityInfoBean.getCommodityId(); + commodityInfoBean = tbl_Commodity_Info_Mapper.getCommodityInfoByID(id); + return new JsonResult(ResultEnum.success.getKey(), commodityInfoBean); + } else { + return new JsonResult(ResultEnum.fail101.getKey(), ""); + } + } catch (Exception e) { + return new JsonResult(ResultEnum.error401.getKey(), ""); + } + } + + @Override + public JsonResult updateCommodityInfo(CommodityInfoBean commodityInfoBean) { + if (commodityInfoBean.getCommodityId() <= 0) { + //ID不能为空 + return new JsonResult(ResultEnum.error401.getKey(), ""); + } + try { + String str = commodityInfoBean.getCommodityName(); + if (StringUtils.isNotBlank(str)) { + commodityInfoBean.setCommodityName(str.substring(str.indexOf(',') + 1, str.length())); + } + int i = tbl_Commodity_Info_Mapper.updateCommodityInfo(commodityInfoBean); + if (i > 0) { + int id = commodityInfoBean.getCommodityId(); + commodityInfoBean = tbl_Commodity_Info_Mapper.getCommodityInfoByID(id); + return new JsonResult(ResultEnum.success.getKey(), commodityInfoBean); + } else { + //修改失败 + return new JsonResult(ResultEnum.fail101.getKey(), ""); + } + } catch (Exception e) { + //修改出错 + return new JsonResult(ResultEnum.error401.getKey(), ""); + } + } + + @Override + public JsonResult getCommodityInfo(Integer commodityId) { + if (commodityId <= 0) { + return new JsonResult(ResultEnum.error401.getKey(), ""); + } + try { + CommodityInfoBean commodityInfoBean = tbl_Commodity_Info_Mapper.getCommodityInfoByID(commodityId); + if (commodityInfoBean != null && commodityInfoBean.getCommodityId() >= 0) { + return new JsonResult(ResultEnum.success.getKey(), commodityInfoBean); + } else { + return new JsonResult(ResultEnum.fail101.getKey(), ""); + } + } catch (Exception e) { + return new JsonResult(ResultEnum.error401.getKey(), ""); + } + } + + @Override + public PageingDto getCommodityInfoByPage(Integer pageSize, Integer firstResult, Integer shopId, Integer commodityState, String orderBy) { + try { + if (StringUtils.isBlank(orderBy)) { + orderBy = "create_time"; + } + PageingDto page = new PageingDto<>(); + List list = tbl_Commodity_Info_Mapper.getCommodityInfoByPage(shopId, firstResult, pageSize, commodityState, orderBy); + int count = tbl_Commodity_Info_Mapper.getCommodityInfoCountByPage(shopId, commodityState); + page.setTotal(count); + page.setFirstResult(firstResult); + page.setData(list); + page.setResult("100"); + return page; + } catch (Exception e) { + throw new IfishException(ResultEnum.fail101); + } + } + + @Override + public JsonResult deleteCommodityInfo(Integer commodityId) { + if (commodityId <= 0) { + return new JsonResult(ResultEnum.error401.getKey(), ""); + } + try { + int i = tbl_Commodity_Info_Mapper.deleteCommodityInfoById(commodityId); + if (i > 0) { + return new JsonResult(ResultEnum.success.getKey(), ""); + } else { + return new JsonResult(ResultEnum.fail101.getKey(), ""); + } + } catch (Exception e) { + return new JsonResult(ResultEnum.error401.getKey(), ""); + } + } +} diff --git a/src/main/java/com/ifish/helper/CommodityInfoHelperI.java b/src/main/java/com/ifish/helper/CommodityInfoHelperI.java new file mode 100644 index 0000000..d1fc296 --- /dev/null +++ b/src/main/java/com/ifish/helper/CommodityInfoHelperI.java @@ -0,0 +1,62 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ifish.helper; + +import com.ifish.bean.CommodityInfoBean; +import com.ifish.dto.JsonResult; +import com.ifish.dto.PageingDto; +import org.springframework.web.multipart.MultipartFile; + +/** + * 商品管理所有接口方法 + * + * @author Administrator + */ +public interface CommodityInfoHelperI { + + /** + * 创建商品 + * + * @param commodityInfoBean + * @return + */ + public JsonResult createCommodityInfo(CommodityInfoBean commodityInfoBean, MultipartFile img, MultipartFile vedio); + + /** + * 修改商品 + * + * @param commodityInfoBean + * @return + */ + public JsonResult updateCommodityInfo(CommodityInfoBean commodityInfoBean); + + /** + * 根据商品ID查询商品详情 + * + * @param commodityId + * @return + */ + public JsonResult getCommodityInfo(Integer commodityId); + + /** + * 根据店铺ID分页获取商品列表 + * + * @param pageSize + * @param firstResult + * @param shopId + * @param commodityState + * @return + */ + public PageingDto getCommodityInfoByPage(Integer pageSize, Integer firstResult, Integer shopId, Integer commodityState, String orderBy); + + /** + * 删除商品 + * + * @param commodityId + * @return + */ + public JsonResult deleteCommodityInfo(Integer commodityId); +} diff --git a/src/main/java/com/ifish/helper/DeviceUserHelper.java b/src/main/java/com/ifish/helper/DeviceUserHelper.java new file mode 100644 index 0000000..0b0064f --- /dev/null +++ b/src/main/java/com/ifish/helper/DeviceUserHelper.java @@ -0,0 +1,92 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ifish.helper; + +import com.ifish.bean.DeviceUserBean; +import com.ifish.entity.Device; +import com.ifish.entity.DeviceCamera; +import com.ifish.mapper.Tbl_Device_Mapper; +import com.ifish.mapper.Tbl_Device_User_Mapper; +import com.ifish.util.RedisKey; +import com.ifish.util.StringUtil; +import java.util.List; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * + * @author Administrator + */ +@Component +public class DeviceUserHelper implements DeviceUserHelperI { + + /** + * 所有tbl_device_user表的操作方法接口 + */ + @Autowired + private Tbl_Device_User_Mapper tbl_Device_User_Mapper; + + /** + * redis缓存服务器方法接口 + */ + @Autowired + private RedisHelperI redisHelperI; + + /** + * 所有tbl_device表的操作方法接口 + */ + @Autowired + private Tbl_Device_Mapper tbl_Device_Mapper; + + @Override + public List getDeviceUsersByUserId(Integer userId) throws Exception { + List deviceUserList = null; + String key = RedisKey.DeviceUser_Key + userId; + String redisString = redisHelperI.getRedis(key); + if (StringUtils.isNotBlank(redisString)) { + deviceUserList = (List) StringUtil.JsonToList(redisString, DeviceUserBean.class); + } else { + deviceUserList = tbl_Device_User_Mapper.getDeviceUsersByUserId(userId); + if (deviceUserList != null && deviceUserList.size() > 0) { + redisHelperI.setRedis(key, StringUtil.ObjectToJson(deviceUserList)); + } + } + return deviceUserList; + } + + @Override + public List getDeviceCameraListByDeviceId(Integer deviceId) throws Exception { + List deviceCameraList = null; + String key = RedisKey.DeviceCamera_key + deviceId; + String redisString = redisHelperI.getRedis(key); + if (StringUtils.isNotBlank(redisString)) { + deviceCameraList = (List) StringUtil.JsonToList(redisString, DeviceCamera.class); + } else { + deviceCameraList = tbl_Device_User_Mapper.getDeviceCameraListByDeviceId(deviceId); + if (deviceCameraList != null && deviceCameraList.size() > 0) { + redisHelperI.setRedis(key, StringUtil.ObjectToJson(deviceCameraList)); + } + } + return deviceCameraList; + } + + @Override + public Device getDeviceById(Integer deviceId) throws Exception { + Device device = null; + String key = RedisKey.Device_key + deviceId; + String redisString = redisHelperI.getRedis(key); + if (StringUtils.isNotBlank(redisString)) { + device = (Device) StringUtil.JsonToBean(redisString, Device.class); + } else { + device = tbl_Device_Mapper.getDeviceById(deviceId); + if (device != null && device.getDeviceId() > 0) { + redisHelperI.setRedis(key, StringUtil.ObjectToJson(device)); + } + } + return device; + } +} diff --git a/src/main/java/com/ifish/helper/DeviceUserHelperI.java b/src/main/java/com/ifish/helper/DeviceUserHelperI.java new file mode 100644 index 0000000..deb7634 --- /dev/null +++ b/src/main/java/com/ifish/helper/DeviceUserHelperI.java @@ -0,0 +1,44 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ifish.helper; + +import com.ifish.bean.DeviceUserBean; +import com.ifish.entity.Device; +import com.ifish.entity.DeviceCamera; +import java.util.List; + +/** + * + * @author Administrator + */ +public interface DeviceUserHelperI { + + /** + * 根据用户Id获取绑定设备集合 + * + * @param userId + * @return + */ + List getDeviceUsersByUserId(Integer userId) throws Exception; + + /** + * 根据设备Id获取绑定的摄像头信息 + * + * @param deviceId + * @return + * @throws Exception + */ + List getDeviceCameraListByDeviceId(Integer deviceId) throws Exception; + + /** + * 根据设备Id获取设备详情 + * + * @param deviceId + * @return + * @throws Exception + */ + Device getDeviceById(Integer deviceId) throws Exception; +} diff --git a/src/main/java/com/ifish/helper/FastDFSClient.java b/src/main/java/com/ifish/helper/FastDFSClient.java new file mode 100644 index 0000000..7c29b61 --- /dev/null +++ b/src/main/java/com/ifish/helper/FastDFSClient.java @@ -0,0 +1,169 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ifish.helper; + +import com.ifish.dto.JsonResult; +import com.ifish.enums.ResultEnum; +import com.ifish.util.IfishFilePath; +import com.ifish.validator.ValidateUtil; +import org.codehaus.plexus.util.StringUtils; +import org.csource.fastdfs.ClientGlobal; +import org.csource.fastdfs.StorageClient1; +import org.csource.fastdfs.StorageServer; +import org.csource.fastdfs.TrackerClient; +import org.csource.fastdfs.TrackerServer; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; + +/** + * FastDFS分布式文件管理系统接口方法 + * + * @author Administrator + */ +@Component +public class FastDFSClient implements FastDFSClientI { + + private TrackerClient trackerClient = null; + private TrackerServer trackerServer = null; + private StorageServer storageServer = null; + //使用StorageClient1进行上传 + private StorageClient1 storageClient1 = null; + + public FastDFSClient() throws Exception { + //获取classpath路径下配置文件"fdfs_client.conf"的路径 + //conf直接写相对于classpath的位置,不需要写classpath: + String conf = ""; + if (IfishFilePath.link_img_head.contains("ifish7")) { + conf = "fdfs_client_ifish7.conf"; + } else { + conf = "fdfs_client_zhangxinyanv5.conf"; + } + + String configPath = this.getClass().getClassLoader().getResource(conf).getFile(); + System.out.println(configPath); + ClientGlobal.init(configPath); + + trackerClient = new TrackerClient(); + trackerServer = trackerClient.getConnection(); + storageServer = trackerClient.getStoreStorage(trackerServer); + storageClient1 = new StorageClient1(trackerServer, storageServer); + } + + /** + * 上传一个字节型文件 + * + * @param file_buff 字节数组 + * @param file_ext_name 文件后缀 + * @return + * @throws Exception + */ + @Override + public String uploadFile(byte[] file_buff, String file_ext_name) throws Exception { + + String result = ""; + + try { + result = storageClient1.upload_file1(file_buff, file_ext_name, null); + } catch (Exception e) { + try { + result = storageClient1.upload_file1(file_buff, file_ext_name, null); + } catch (Exception a) { + return ""; + } + } + + return result; + } + + /** + * 上传一个本地文件 + * + * @param local_filename 本地文件名(路径+文件名+后缀) + * @param file_ext_name 文件后缀 + * @return + * @throws Exception + */ + @Override + public String uploadFile(String local_filename, String file_ext_name) throws Exception { + + String result = storageClient1.upload_file1(local_filename, file_ext_name, null); + + return result; + } + + /** + * 上传一个文件 + * + * @param group_name 指定位置 + * @param local_filename 本地文件名(路径+文件名+后缀) + * @param file_ext_name 文件后缀 + * @return + * @throws Exception + */ + @Override + public String uploadFile(String group_name, String local_filename, String file_ext_name) throws Exception { + + String result = storageClient1.upload_file1(group_name, local_filename, file_ext_name, null); + + return result; + } + + @Override + public JsonResult uploadFile(MultipartFile file) { + try { + String type = getFileType(file); + if (StringUtils.isBlank(type)) { + return null; + } + byte[] bt = file.getBytes(); + String url = uploadFile(bt, type); + JsonResult js = new JsonResult(ResultEnum.success.getKey(), "http://139.196.24.156:8017/" + url); + return js; + } catch (Exception e) { + JsonResult js = new JsonResult(ResultEnum.fail101.getKey()); + return js; + } + } + + public String getFileType(MultipartFile file) { + String[] allowTypes = new String[]{".mp4", ".png", ".jpg", ".bmp"}; + String filename = file.getOriginalFilename(); + if (StringUtils.isNotBlank(filename)) { + for (String allowType : allowTypes) { + if (filename.contains(allowType)) { + return allowType.replace(".", ""); + } + } + } + return ""; + } + + @Override + public String uploadFileToFastDFS(MultipartFile file) { + try { + String type = getFileType(file); + if (StringUtils.isBlank(type)) { + return null; + } + byte[] bt = file.getBytes(); + String url = uploadFile(bt, type); + if (url.contains("group1/M00/")) { + url = url.replace("group1/M00/", ""); + } else { + return ""; + } + //本地返回测试环境fastfds,线上返回正式服务器部署的fastfds + if (ValidateUtil.IsWinOrUnix()) { + return IfishFilePath.fastDFS_url_app + url; + } else { + return IfishFilePath.link_img_head + url; + } + + } catch (Exception e) { + return ""; + } + } +} diff --git a/src/main/java/com/ifish/helper/FastDFSClientI.java b/src/main/java/com/ifish/helper/FastDFSClientI.java new file mode 100644 index 0000000..9276908 --- /dev/null +++ b/src/main/java/com/ifish/helper/FastDFSClientI.java @@ -0,0 +1,64 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ifish.helper; + +import com.ifish.dto.JsonResult; +import org.springframework.web.multipart.MultipartFile; + +/** + * FastDFS分布式文件管理系统接口方法 + * + * @author Administrator + */ +public interface FastDFSClientI { + + /** + * 上传一个字节型文件 + * + * @param file_buff 字节数组 + * @param file_ext_name 文件后缀 + * @return + * @throws Exception + */ + String uploadFile(byte[] file_buff, String file_ext_name) throws Exception; + + /** + * 上传一个本地文件 + * + * @param local_filename 本地文件名(路径+文件名+后缀) + * @param file_ext_name 文件后缀 + * @return + * @throws Exception + */ + String uploadFile(String local_filename, String file_ext_name) throws Exception; + + /** + * 上传一个文件 + * + * @param group_name 指定位置 + * @param local_filename 本地文件名(路径+文件名+后缀) + * @param file_ext_name 文件后缀 + * @return + * @throws Exception + */ + String uploadFile(String group_name, String local_filename, String file_ext_name) throws Exception; + + /** + * 上传一个MultipartFile类型文件,返回成功后结果,适用于保存不完整路径方法 + * + * @param file + * @return + */ + JsonResult uploadFile(MultipartFile file); + + /** + * 上传一个MultipartFile类型文件,返回成功后文件路径,适用于保存完整路径方法 + * + * @param file + * @return + */ + String uploadFileToFastDFS(MultipartFile file); +} diff --git a/src/main/java/com/ifish/helper/HardWareVenderHelper.java b/src/main/java/com/ifish/helper/HardWareVenderHelper.java new file mode 100644 index 0000000..09035d1 --- /dev/null +++ b/src/main/java/com/ifish/helper/HardWareVenderHelper.java @@ -0,0 +1,78 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ifish.helper; + +import com.ifish.bean.VenderListBean; +import com.ifish.entity.HardwareType; +import com.ifish.entity.VenderList; +import com.ifish.mapper.Tbl_Hardware_Type_Mapper; +import com.ifish.mapper.Tbl_Vender_list_Mapper; +import com.ifish.util.RedisKey; +import com.ifish.util.StringUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * + * @author Administrator + */ +@Component +public class HardWareVenderHelper implements HardWareVenderHelperI { + + /** + * 所有tbl_Hardware_Type表的操作方法接口 + */ + @Autowired + private Tbl_Hardware_Type_Mapper tbl_Hardware_Type_Mapper; + + /** + * redis缓存服务器方法接口 + */ + @Autowired + private RedisHelperI redisHelperI; + + @Autowired + private Tbl_Vender_list_Mapper tbl_Vender_list_Mapper; + + @Override + public HardwareType getHardwareTypeByTypeCode(String code) throws Exception { + HardwareType hardwareType = null; + String key = RedisKey.HardWareType_key + code; + String redisString = redisHelperI.getRedis(key); + if (StringUtils.isNotBlank(redisString)) { + hardwareType = (HardwareType) StringUtil.JsonToBean(redisString, HardwareType.class); + } else { + hardwareType = tbl_Hardware_Type_Mapper.getHardwareTypeByTypeCode(code); + if (hardwareType != null && StringUtils.isNotBlank(hardwareType.getHardwareType())) { + redisHelperI.setRedis(key, StringUtil.ObjectToJson(hardwareType)); + } + } + return hardwareType; + } + + @Override + public VenderList getVenderListByBrandCode(String code) throws Exception { + VenderList venderList = new VenderList(); + VenderListBean venderListBean = null; + String key = RedisKey.VenderList_key + code; + String redisString = redisHelperI.getRedis(key); + if (StringUtils.isNotBlank(redisString)) { + venderList = (VenderList) StringUtil.JsonToBean(redisString, VenderList.class); + } else { + venderListBean = tbl_Vender_list_Mapper.getVenderListByBrandCode(code); + if (venderListBean != null && StringUtils.isNotBlank(venderListBean.getBrandCode())) { + venderList.setBrandCode(venderListBean.getBrandCode()); + venderList.setBrandIntroduce(venderListBean.getBrandIntroduce()); + venderList.setBrandName(venderListBean.getBrandName()); + venderList.setLogo(venderListBean.getBrandLogo()); + redisHelperI.setRedis(key, StringUtil.ObjectToJson(venderList)); + } + } + return venderList; + } + +} diff --git a/src/main/java/com/ifish/helper/HardWareVenderHelperI.java b/src/main/java/com/ifish/helper/HardWareVenderHelperI.java new file mode 100644 index 0000000..6850d25 --- /dev/null +++ b/src/main/java/com/ifish/helper/HardWareVenderHelperI.java @@ -0,0 +1,34 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ifish.helper; + +import com.ifish.entity.HardwareType; +import com.ifish.entity.VenderList; + +/** + * + * @author Administrator + */ +public interface HardWareVenderHelperI { + + /** + * 根据设备型号获取设备类型参数 + * + * @param code + * @return + */ + HardwareType getHardwareTypeByTypeCode(String code) throws Exception; + + /** + * 根据厂家code获取厂家信息 + * + * @param code + * @return + * @throws Exception + */ + VenderList getVenderListByBrandCode(String code) throws Exception; + +} diff --git a/src/main/java/com/ifish/helper/RedisHelper.java b/src/main/java/com/ifish/helper/RedisHelper.java new file mode 100644 index 0000000..8efec46 --- /dev/null +++ b/src/main/java/com/ifish/helper/RedisHelper.java @@ -0,0 +1,140 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ifish.helper; + +import com.ifish.util.IfishUtil; +import java.util.Iterator; +import java.util.Set; +import java.util.concurrent.TimeUnit; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Component; + +/** + * redis缓存服务器所有接口方法 + * + * @author Administrator + */ +@Component +public class RedisHelper implements RedisHelperI { + + @Autowired + private StringRedisTemplate redis; + + /* + *获取缓存值 + */ + @Override + public String getRedis(String key) { + return redis.opsForValue().get(key.toLowerCase()); + } + + /* + *设置缓存(默认时间为1天) + */ + @Override + public void setRedis(String key, String value) { + if (value == null) { + return; + } + redis.opsForValue().set(key.toLowerCase(), value, IfishUtil.CacheTime_DAYS, TimeUnit.DAYS); + } + + /*设置自定义时效缓存 + *key 缓存名称,value缓存值(string),time(保存时间),unit(时间类型) + */ + @Override + public void setRedis(String key, String value, int time, TimeUnit unit) { + if (value == null) { + return; + } + redis.opsForValue().set(key.toLowerCase(), value, time, unit); + } + + /* + *设置按天时效缓存 + */ + @Override + public void setRedisToDAYS(String key, String value) { + if (value == null) { + return; + } + redis.opsForValue().set(key.toLowerCase(), value, IfishUtil.CacheTime_DAYS, TimeUnit.DAYS); + } + + /* + *设置按时时效缓存 + */ + @Override + public void setRedisToHOURS(String key, String value) { + if (value == null) { + return; + } + redis.opsForValue().set(key.toLowerCase(), value, IfishUtil.CacheTime_HOURS, TimeUnit.HOURS); + } + + /* + *设置按分时效缓存 + */ + @Override + public void setRedisToMINUTES(String key, String value) { + if (value == null) { + return; + } + redis.opsForValue().set(key.toLowerCase(), value, IfishUtil.CacheTime_MINUTES, TimeUnit.MINUTES); + } + + /* + *设置按秒时效缓存 + */ + @Override + public void setRedisToSECONDS(String key, String value) { + if (value == null) { + return; + } + redis.opsForValue().set(key.toLowerCase(), value, IfishUtil.CacheTime_SECONDS, TimeUnit.SECONDS); + } + + /* + *删除缓存值 + */ + @Override + public void deleteRedis(String key) { + redis.delete(key.toLowerCase()); + } + + /* + *删除带前缀的批量缓存 + *tagkey 缓存前缀 + *如省份缓存 province:10,前缀为province + */ + @Override + public void delRedisByTagKey(String tagkey) { + Set set = redis.keys(tagkey.toLowerCase() + "*"); + Iterator it = set.iterator(); + while (it.hasNext()) { + String keyStr = it.next(); + redis.delete(keyStr); + } + } + + /* + * 删除当前缓存数据库所有的key + * 排除系数设置缓存 + */ + @Override + public void deleteDBRedis() { + Set set = redis.keys("*"); + Iterator it = set.iterator(); + while (it.hasNext()) { + String keyStr = it.next(); + //排除系数设置缓存 + if (!keyStr.contains("recommendsetting:")) { + redis.delete(keyStr); + } + } + } +} diff --git a/src/main/java/com/ifish/helper/RedisHelperI.java b/src/main/java/com/ifish/helper/RedisHelperI.java new file mode 100644 index 0000000..7a59d0e --- /dev/null +++ b/src/main/java/com/ifish/helper/RedisHelperI.java @@ -0,0 +1,68 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ifish.helper; + +import java.util.concurrent.TimeUnit; + +/** + * redis缓存服务器所有接口方法 + * + * @author Administrator + */ +public interface RedisHelperI { + + /* + *删除带前缀的批量缓存 + *tagkey 缓存前缀 + *如省份缓存 province:10,前缀为province + */ + void delRedisByTagKey(String tagkey); + + /* + *删除缓存值 + */ + void deleteRedis(String key); + + /* + *删除当前缓存数据库所有的key + */ + void deleteDBRedis(); + + /* + *获取缓存值 + */ + String getRedis(String key); + + /* + *设置缓存(有效时间默认为1天) + */ + void setRedis(String key, String value); + + /*设置自定义时效缓存 + *key 缓存名称,value缓存值(string),time(保存时间),unit(时间类型) + */ + void setRedis(String key, String value, int time, TimeUnit unit); + + /* + *设置按天时效缓存 + */ + void setRedisToDAYS(String key, String value); + + /* + *设置按时时效缓存 + */ + void setRedisToHOURS(String key, String value); + + /* + *设置按分时效缓存 + */ + void setRedisToMINUTES(String key, String value); + + /* + *设置按秒时效缓存 + */ + void setRedisToSECONDS(String key, String value); +} diff --git a/src/main/java/com/ifish/helper/ShopsInfoHelper.java b/src/main/java/com/ifish/helper/ShopsInfoHelper.java new file mode 100644 index 0000000..2b2b416 --- /dev/null +++ b/src/main/java/com/ifish/helper/ShopsInfoHelper.java @@ -0,0 +1,49 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ifish.helper; + +import com.ifish.entity.ShopsInfo; +import com.ifish.mapper.Tbl_Shops_Info_Mapper; +import com.ifish.util.RedisKey; +import com.ifish.util.StringUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * + * @author Administrator + */ +@Component +public class ShopsInfoHelper implements ShopsInfoHelperI { + + /** + * tbl_shops_info表操作方法接口 + */ + @Autowired + private Tbl_Shops_Info_Mapper tbl_Shops_Info_Mapper; + + /** + * redis缓存服务器方法接口 + */ + @Autowired + private RedisHelperI redisHelperI; + + @Override + public ShopsInfo getShopsInfoByUserId(Integer userId) throws Exception { + ShopsInfo shopsInfo = null; + String key = RedisKey.ShopsInfo_Key + userId; + String shopString = redisHelperI.getRedis(key); + if (StringUtils.isNotBlank(shopString)) { + shopsInfo = (ShopsInfo) StringUtil.JsonToBean(shopString, ShopsInfo.class); + } else { + shopsInfo = tbl_Shops_Info_Mapper.getShopsInfoByUserId(userId); + redisHelperI.setRedis(key, StringUtil.ObjectToJson(shopsInfo)); + } + return shopsInfo; + } + +} diff --git a/src/main/java/com/ifish/helper/ShopsInfoHelperI.java b/src/main/java/com/ifish/helper/ShopsInfoHelperI.java new file mode 100644 index 0000000..8871b8d --- /dev/null +++ b/src/main/java/com/ifish/helper/ShopsInfoHelperI.java @@ -0,0 +1,24 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ifish.helper; + +import com.ifish.entity.ShopsInfo; + +/** + * + * @author Administrator + */ +public interface ShopsInfoHelperI { + + /** + * 根据用户Id获取商家信息 + * + * @param userId + * @return + */ + public ShopsInfo getShopsInfoByUserId(Integer userId) throws Exception; + +} diff --git a/src/main/java/com/ifish/helper/UserActivityHelper.java b/src/main/java/com/ifish/helper/UserActivityHelper.java new file mode 100644 index 0000000..4933c8b --- /dev/null +++ b/src/main/java/com/ifish/helper/UserActivityHelper.java @@ -0,0 +1,66 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ifish.helper; + +import com.ifish.dto.JsonResult; +import com.ifish.dto.PageingDto; +import com.ifish.entity.Grade; +import com.ifish.mapper.Tbl_User_Activity_Mapper; +import com.ifish.service.CacheService; +import com.ifish.util.IfishUtil; +import com.ifish.util.ResultUtil; +import java.util.List; +import java.util.Map; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 用户动态所有接口方法 + * + * @author Administrator + */ +@Component +public class UserActivityHelper implements UserActivityHelperI { + + @Autowired + private Tbl_User_Activity_Mapper tbl_User_Activity_Mapper; + + @Autowired + private CacheService cacheService; + + @Override + public PageingDto getUserActivityByPage(Integer pageSize, Integer firstResult) { + //分页获取数据 + List list = tbl_User_Activity_Mapper.getUserActivityByPage(firstResult, pageSize); + firstResult += list.size(); + try { + for (Map map : list) { + Integer gradeValue = (Integer) map.get("grade_value"); + for (Grade grade : cacheService.getGradeList()) { + if (gradeValue >= grade.getMinValue() && gradeValue < grade.getMaxValue()) { + map.remove("grade_value"); + map.put("gradeNum", grade.getGradeNum()); + break; + } + } + } + } catch (Exception e) { + } + + //分页数据封装 + return ResultUtil.success(firstResult, tbl_User_Activity_Mapper.getUserActivityCount(), list); + } + + @Override + public JsonResult getUserActivityMaxCount() { + try { + int count = tbl_User_Activity_Mapper.getUserActivityCount(); + return new JsonResult<>("100", count); + } catch (Exception e) { + return new JsonResult<>("101", ""); + } + } +} diff --git a/src/main/java/com/ifish/helper/UserActivityHelperI.java b/src/main/java/com/ifish/helper/UserActivityHelperI.java new file mode 100644 index 0000000..1db38ea --- /dev/null +++ b/src/main/java/com/ifish/helper/UserActivityHelperI.java @@ -0,0 +1,34 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ifish.helper; + +import com.ifish.dto.JsonResult; +import com.ifish.dto.PageingDto; +import org.springframework.stereotype.Component; + +/** + * 用户动态所有接口方法 + * + * @author Administrator + */ +public interface UserActivityHelperI { + + /** + * 分页获取动态 + * + * @param pageSize + * @param firstResult + * @return + */ + public PageingDto getUserActivityByPage(Integer pageSize, Integer firstResult); + + /** + * 获取用户动态最大值 + * + * @return + */ + public JsonResult getUserActivityMaxCount(); +} diff --git a/src/main/java/com/ifish/helper/UserHelper.java b/src/main/java/com/ifish/helper/UserHelper.java new file mode 100644 index 0000000..a6ae308 --- /dev/null +++ b/src/main/java/com/ifish/helper/UserHelper.java @@ -0,0 +1,549 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ifish.helper; + +import com.ifish.bean.DeviceUserBean; +import com.ifish.entity.Camera; +import com.ifish.entity.CameraUser; +import com.ifish.entity.Device; +import com.ifish.entity.DeviceCamera; +import com.ifish.entity.HardwareType; +import com.ifish.entity.ShopsInfo; +import com.ifish.entity.User; +import com.ifish.entity.VenderList; +import com.ifish.enums.BooleanEnum; +import com.ifish.enums.GwellEnum; +import com.ifish.enums.NeteaseEnum; +import com.ifish.enums.ResultEnum; +import com.ifish.enums.SubDirectoryEnum; +import com.ifish.gwell.GwellApi; +import com.ifish.mapper.Tbl_User_Mapper; +import com.ifish.netease.NeteaseIM; +import com.ifish.util.IfishFilePath; +import com.ifish.util.IfishUtil; +import com.ifish.util.RedisKey; +import com.ifish.util.StringUtil; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 用户管理所有接口方法 + * + * @author Administrator + */ +@Component +public class UserHelper implements UserHelperI { + + /** + * redis缓存服务器方法接口 + */ + @Autowired + private RedisHelperI redisHelperI; + + /** + * 所有tbl_user表的操作方法接口 + */ + @Autowired + private Tbl_User_Mapper tbl_User_Mapper; + + /** + * 注册云信 + */ + @Autowired + private NeteaseIM neteaseIM; + + @Autowired + private DeviceUserHelperI deviceUserHelperI; + + @Autowired + private ShopsInfoHelperI shopsInfoHelperI; + + @Autowired + private HardWareVenderHelperI hardWareVenderHelperI; + + @Autowired + private CameraUserHelperI cameraUserHelperI; + + /** + * 登陆接口 + * + * @param user + * @return + */ + @Override + public Object login(User user) { + try { + User tmpUser = tmpUser = tbl_User_Mapper.getUserByPhoneNumber(user.getPhoneNumber()); + //2.如果都为空,则没有此用户,返回未注册信息 + if (tmpUser == null) { + //用户不存在 + return IfishUtil.returnJson(ResultEnum.warn202.getKey(), ""); + } + + //3.验证密码是否正确 + if (tmpUser.getUserPassword().equals(user.getUserPassword())) { + //4.如果密码正确,确认是否更新用户信息 + + //是否更新 + boolean isUpdate = false; + + //4.1未注册技威,则注册获取code1,code2 + Map gwellMap = registUserGWell(tmpUser, isUpdate); + tmpUser = (User) gwellMap.get("user"); + isUpdate = (boolean) gwellMap.get("isUpdate"); + + //4.2未注册云信,则注册云信,获取云信token + Map imMap = registUserNetease(tmpUser, isUpdate); + tmpUser = (User) imMap.get("user"); + isUpdate = (boolean) imMap.get("isUpdate"); + + //4.3登陆次数修改 + Integer logincount = tbl_User_Mapper.executeLoginUpdate(tmpUser.getUserId(), user.getLoginType()); + //修改失败,返回错误信息 + if (logincount <= 0) { + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + //4.4验证是否需要修改技威,云信等信息,如果需要则进行修改 + if (isUpdate) { + Integer updateInteger = tbl_User_Mapper.updateUser(tmpUser); + //如果修改失败,返回错误信息 + if (updateInteger <= 0) { + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + saveUserToRedis(tmpUser); + } + + //4.5 获取用户数据 + Map userMap = getUserMap(tmpUser); + //4.6自己的商家对象 + Map shopsInfoMap = getShopInfoMap(tmpUser); + //4.7选择的看护商家对象 + Map kanhuShopsInfoMap = getKanhuShopInfoMap(tmpUser); + //4.8获取用户绑定设备信息,设备和摄像头信息 + Map deviceMap = getDeviceList(tmpUser); + //4.9获取用户绑定摄像头信息 + List list2 = getCameraList(tmpUser); + Map dataMap = new HashMap(); + dataMap.put("user", userMap); + dataMap.put("shopsInfo", shopsInfoMap); + dataMap.put("shopsInfo2", kanhuShopsInfoMap); + dataMap.put("device", deviceMap.get("list")); + dataMap.put("camera", list2); + dataMap.put("deviceCamera", deviceMap.get("list3")); + return IfishUtil.returnJson(ResultEnum.success.getKey(), dataMap); + } else { + //密码不正确 + return IfishUtil.returnJson(ResultEnum.warn204.getKey(), ""); + } + } catch (Exception e) { + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + } + + /** + * 根据用户ID从缓存中获取用户对象 + * + * @param userId + * @return + * @throws Exception + */ + @Override + public User getUserById(Integer userId) throws Exception { + User tmpUser = null; + String userKey = RedisKey.User_Key + userId; + String userString = redisHelperI.getRedis(userKey); + //1.从数据库或缓存中读取用户对象 + if (StringUtils.isNotBlank(userString)) { + tmpUser = (User) StringUtil.JsonToBean(userString, User.class); + } else { + tmpUser = tbl_User_Mapper.getUserByUserId(userId + ""); + saveUserToRedis(tmpUser); + } + return tmpUser; + } + + /** + * 未注册技威,则注册获取code1,code2 + * + * @param tmpUser + * @param isUpdate + * @return + */ + private Map registUserGWell(User tmpUser, boolean isUpdate) { + //4.1未注册技威,则注册获取code1,code2 + if (tmpUser.getIsRegisterGwell().equals(BooleanEnum.NO.getKey())) { + //注册技威 + Map map = GwellApi.Register(tmpUser.getPhoneNumber()); + String result = map.get("result"); + if (result != null) { + //注册成功 + if (result.equals(GwellEnum.success.getKey())) { + String P2PVerifyCode1 = map.get("P2PVerifyCode1"); + String P2PVerifyCode2 = map.get("P2PVerifyCode2"); + String gwellUserID = map.get("UserID"); + tmpUser.setIsRegisterGwell(BooleanEnum.YES.getKey()); + tmpUser.setP2PVerifyCode1(P2PVerifyCode1); + tmpUser.setP2PVerifyCode2(P2PVerifyCode2); + tmpUser.setGwellUserID(gwellUserID); + isUpdate = true; + } //已经注册过 + else if (GwellEnum.repeat.getKey().equals(result)) { + tmpUser.setIsRegisterGwell(BooleanEnum.YES.getKey()); + isUpdate = true; + } + } + }//已经注册过技威 + else if (tmpUser.getIsRegisterGwell().equals(BooleanEnum.YES.getKey())) { + //code1和code2为空则重新登陆获取 + String P2PVerifyCode1 = tmpUser.getP2PVerifyCode1(); + String P2PVerifyCode2 = tmpUser.getP2PVerifyCode2(); + String gwellUserID = tmpUser.getGwellUserID(); + if (P2PVerifyCode1.equals("") || P2PVerifyCode2.equals("") || gwellUserID.equals("")) { + Map map = GwellApi.Login(tmpUser.getPhoneNumber()); + String result = map.get("result"); + //登陆成功 + if (result != null && result.equals(GwellEnum.success.getKey())) { + P2PVerifyCode1 = map.get("P2PVerifyCode1"); + P2PVerifyCode2 = map.get("P2PVerifyCode2"); + gwellUserID = map.get("UserID"); + tmpUser.setP2PVerifyCode1(P2PVerifyCode1); + tmpUser.setP2PVerifyCode2(P2PVerifyCode2); + tmpUser.setGwellUserID(gwellUserID); + isUpdate = true; + } + } + } + Map resultMap = new HashMap(); + resultMap.put("user", tmpUser); + resultMap.put("isUpdate", isUpdate); + return resultMap; + } + + /** + * 未注册云信,则注册云信,获取云信token + * + * @param tmpUser + * @param isUpdate + * @return + */ + private Map registUserNetease(User tmpUser, boolean isUpdate) throws Exception { + if (tmpUser.getIsRegisterNetease().equals(BooleanEnum.NO.getKey())) { + //注册云信 + Map map = neteaseIM.createAccid(tmpUser.getUserId().toString(), tmpUser.getNickName(), IfishFilePath.getPath(SubDirectoryEnum.headImage, tmpUser.getUserImg()), ""); + if (map != null) { + String code = map.get("code"); + if (code.equals(NeteaseEnum.status200.getKey())) { + tmpUser.setIsRegisterNetease(BooleanEnum.YES.getKey()); + tmpUser.setNeteaseToken(map.get("token")); + isUpdate = true; + //发送云信消息 + User imUser = getNeteaseIMUser(); + if (imUser != null) { + neteaseIM.sendMsg(imUser.getUserId().toString(), tmpUser.getUserId().toString(), "感谢您使用爱鱼奇,连接智能设备请查看下方说明书,内含操作视频:http://u.eqxiu.com/s/KmmVl87l \n摄像头售后:021-54131006\n睿芯插排售后:15757401229\n绚多插排售后:18857689069\n松诺插排售后:13392205468", ""); + } + } else if (code.equals(NeteaseEnum.status414.getKey())) { + tmpUser.setIsRegisterNetease(BooleanEnum.YES.getKey()); + isUpdate = true; + } + } + } //已注册云信 + else if (tmpUser.getIsRegisterNetease().equals(BooleanEnum.YES.getKey())) { + //token为空 + if (tmpUser.getNeteaseToken().equals("")) { + //获取云信token + Map map = neteaseIM.refreshToken(tmpUser.getUserId().toString()); + if (map != null) { + String code = map.get("code"); + if (code.equals(NeteaseEnum.status200.getKey())) { + tmpUser.setNeteaseToken(map.get("token")); + isUpdate = true; + } + } + } + } + Map resultMap = new HashMap(); + resultMap.put("user", tmpUser); + resultMap.put("isUpdate", isUpdate); + return resultMap; + } + + /** + * 登录成功,返回给App数据 + * + * @param tmpUser + * @return + */ + private Map getUserMap(User tmpUser) { + //登录成功,返回给App数据 + Map userMap = new HashMap(); + userMap.put("userId", tmpUser.getUserId().toString()); + userMap.put("phoneNumber", tmpUser.getPhoneNumber()); + userMap.put("nickName", tmpUser.getNickName()); + userMap.put("userSex", tmpUser.getUserSex()); + userMap.put("signature", tmpUser.getSignature()); + userMap.put("userImg", tmpUser.getUserImg()); + userMap.put("P2PVerifyCode1", tmpUser.getP2PVerifyCode1()); + userMap.put("P2PVerifyCode2", tmpUser.getP2PVerifyCode2()); + userMap.put("gwellUserID", tmpUser.getGwellUserID()); + userMap.put("neteaseToken", tmpUser.getNeteaseToken()); + userMap.put("userType", tmpUser.getUserType()); + userMap.put("shopsUserId", tmpUser.getShopsUserId()); + if (tmpUser.getUpdateTime() != null) { + userMap.put("updateTime", IfishUtil.format(tmpUser.getUpdateTime())); + } + + return userMap; + } + + /** + * 自己的商家对象 + * + * @param tmpUser + * @return + */ + private Map getShopInfoMap(User tmpUser) throws Exception { + Map shopsInfoMap = new HashMap(); + if (tmpUser.getUserId() != null) { + ShopsInfo shopsInfo = shopsInfoHelperI.getShopsInfoByUserId(tmpUser.getUserId()); + if (shopsInfo != null) { + shopsInfoMap.put("shopsId", shopsInfo.getShopsId()); + shopsInfoMap.put("userId", shopsInfo.getUserId()); + shopsInfoMap.put("userImg", tmpUser.getUserImg()); + shopsInfoMap.put("userName", shopsInfo.getUserName()); + shopsInfoMap.put("shopsName", shopsInfo.getShopsName()); + shopsInfoMap.put("shopsPhone", shopsInfo.getShopsPhone()); + shopsInfoMap.put("shopsProvince", shopsInfo.getShopsProvince()); + shopsInfoMap.put("shopsCity", shopsInfo.getShopsCity()); + shopsInfoMap.put("shopsArea", shopsInfo.getShopsArea()); + shopsInfoMap.put("shopsAddress", shopsInfo.getShopsAddress()); + shopsInfoMap.put("picture1", shopsInfo.getPicture1()); + shopsInfoMap.put("picture2", shopsInfo.getPicture2()); + shopsInfoMap.put("picture3", shopsInfo.getPicture3()); + shopsInfoMap.put("picture4", shopsInfo.getPicture4()); + shopsInfoMap.put("status", shopsInfo.getStatus()); + shopsInfoMap.put("reason", shopsInfo.getReason()); + } + } + return shopsInfoMap; + } + + /** + * 选择的看护商家对象 + * + * @param tmpUser + * @return + */ + private Map getKanhuShopInfoMap(User tmpUser) throws Exception { + //选择的看护商家对象 + Map shopsInfo2Map = new HashMap(); + if (tmpUser.getShopsUserId() != null && tmpUser.getShopsUserId() > 0) { + ShopsInfo shopsInfo = shopsInfoHelperI.getShopsInfoByUserId(tmpUser.getShopsUserId()); + if (shopsInfo != null) { + User tmp2User = getUserById(tmpUser.getShopsUserId()); + shopsInfo2Map.put("shopsId", shopsInfo.getShopsId()); + shopsInfo2Map.put("userId", shopsInfo.getUserId()); + shopsInfo2Map.put("userImg", tmp2User.getUserImg()); + shopsInfo2Map.put("userName", shopsInfo.getUserName()); + shopsInfo2Map.put("shopsName", shopsInfo.getShopsName()); + shopsInfo2Map.put("shopsPhone", shopsInfo.getShopsPhone()); + shopsInfo2Map.put("shopsProvince", shopsInfo.getShopsProvince()); + shopsInfo2Map.put("shopsCity", shopsInfo.getShopsCity()); + shopsInfo2Map.put("shopsArea", shopsInfo.getShopsArea()); + shopsInfo2Map.put("shopsAddress", shopsInfo.getShopsAddress()); + shopsInfo2Map.put("picture1", shopsInfo.getPicture1()); + shopsInfo2Map.put("picture2", shopsInfo.getPicture2()); + shopsInfo2Map.put("picture3", shopsInfo.getPicture3()); + shopsInfo2Map.put("picture4", shopsInfo.getPicture4()); + shopsInfo2Map.put("status", shopsInfo.getStatus()); + shopsInfo2Map.put("reason", shopsInfo.getReason()); + } + } + return shopsInfo2Map; + } + + /** + * 获取用户绑定设备信息 + * + * @param tmpUser + * @return + */ + private Map getDeviceList(User tmpUser) throws Exception { + //设备信息 + List list = new ArrayList(); + //获取用户拥有设备 + List deviceUserList = deviceUserHelperI.getDeviceUsersByUserId(tmpUser.getUserId()); + List deviceIds = new ArrayList(); + for (DeviceUserBean deviceUser : deviceUserList) { + Device device = deviceUserHelperI.getDeviceById(deviceUser.getDeviceId()); + deviceIds.add(device.getDeviceId()); + //封装设备返回信息 + list.add(getDeviceInfo(device, deviceUser)); + } + + //设备-摄像头 + List list3 = new ArrayList(); + //设备已关联摄像头 + if (deviceIds.size() > 0) { + for (Integer deviceId : deviceIds) { + List deviceCameraList = deviceUserHelperI.getDeviceCameraListByDeviceId(deviceId); + for (DeviceCamera deviceCamera : deviceCameraList) { + Map deviceCameraMap = new HashMap(); + deviceCameraMap.put("cameraId", deviceCamera.getDeviceCameraId().getCameraId()); + deviceCameraMap.put("deviceId", deviceCamera.getDeviceCameraId().getDeviceId()); + list3.add(deviceCameraMap); + } + } + } + Map map = new HashMap(); + map.put("list", list); + map.put("list3", list3); + return map; + } + + /** + * 封装设备返回信息 + * + * @param device + * @param deviceUser + * @return + */ + public Map getDeviceInfo(Device device, DeviceUserBean deviceUser) throws Exception { + Map deviceMap = new HashMap(); + deviceMap.put("userId", deviceUser.getUserId()); + deviceMap.put("deviceId", deviceUser.getDeviceId()); + deviceMap.put("isMaster", deviceUser.getIsMaster()); + deviceMap.put("showName", deviceUser.getShowName()); + deviceMap.put("macAddress", device.getMacAddress()); + deviceMap.put("isBlacklist", device.getIsBlacklist()); + deviceMap.put("customIconName", deviceUser.getCustomIconName()); + deviceMap.put("customShowName", deviceUser.getCustomShowName()); + deviceMap.put("deviceIp", device.getDeviceIP()); + deviceMap.put("loginTime", device.getLoginTime()); + if (device.getBrandCode() != null && device.getBrandCode().equals("YUEM") && device.getCreateTime().before(IfishUtil.StrToDate("2016-04-26"))) { + //是否显示预警推送 + deviceMap.put("isPushWendu", BooleanEnum.NO.getKey()); + } else { + //是否显示预警推送 + deviceMap.put("isPushWendu", BooleanEnum.YES.getKey()); + } + //控制方案 + String type = device.getHardwareType(); + if (type != null) { + HardwareType hardwareType = hardWareVenderHelperI.getHardwareTypeByTypeCode(type); + if (hardwareType != null) { + //设备类型 + deviceMap.put("type", type); + //有无工作模式 + deviceMap.put("isWorkModel", hardwareType.getIsWorkModel()); + //控制信息 + deviceMap.put("controlAmount", hardwareType.getControlAmount()); + deviceMap.put("timerAmount", hardwareType.getTimerAmount()); + //背光/柜灯 + deviceMap.put("isLightness", hardwareType.getIsLightness()); + deviceMap.put("isSarkLamp", hardwareType.getIsSarkLamp()); + //自定义图标 + deviceMap.put("isCustomIcon", hardwareType.getIsCustomIcon()); + deviceMap.put("iconLink", hardwareType.getIconLink()); + deviceMap.put("allIconName", hardwareType.getAllIconName()); + deviceMap.put("allShowName", hardwareType.getAllShowName()); + deviceMap.put("defaultIconName", hardwareType.getDefaultIconName()); + deviceMap.put("defaultShowName", hardwareType.getDefaultShowName()); + deviceMap.put("updateTime", hardwareType.getUpdateTime()); + //换水提醒 + deviceMap.put("todayRemind", device.getTodayRemind()); + deviceMap.put("waterRemind", device.getWaterRemind()); + deviceMap.put("remindDate", device.getRemindDate() != null ? IfishUtil.format1(device.getRemindDate()) : ""); + deviceMap.put("remindCycle", device.getRemindCycle() != null ? device.getRemindCycle() : ""); + } + } + //厂家 + if (device.getBrandCode() != null) { + //厂家 + VenderList venderList = new VenderList(); + venderList = hardWareVenderHelperI.getVenderListByBrandCode(device.getBrandCode()); + deviceMap.put("venderList", venderList); + } else { + //默认爱鱼奇 + VenderList defaultVenderList = new VenderList(); + defaultVenderList = hardWareVenderHelperI.getVenderListByBrandCode("AYQ"); + deviceMap.put("venderList", defaultVenderList); + } + return deviceMap; + } + + /** + * 获取用户绑定摄像头信息 + * + * @param tmpUser + * @return + */ + public List getCameraList(User tmpUser) throws Exception { + //摄像头信息 + List list2 = new ArrayList(); + //获取用户拥有摄像头 + List cameraUserList = cameraUserHelperI.getCameraUserListByUserId(tmpUser.getUserId()); + for (CameraUser cameraUser : cameraUserList) { + Camera camera = cameraUserHelperI.getCameraById(cameraUser.getCameraUserId().getCameraId()); + //封装摄像头返回信息 + list2.add(getCameraInfo(camera, cameraUser)); + } + return list2; + } + + /** + * 封装摄像头返回信息 + * + * @param device + * @param deviceUser + * @return + */ + public Map getCameraInfo(Camera camera, CameraUser cameraUser) { + Map cameraMap = new HashMap(); + cameraMap.put("cameraId", camera.getCameraId()); + cameraMap.put("isMaster", cameraUser.getIsMaster()); + cameraMap.put("isLook", cameraUser.getIsLook()); + cameraMap.put("isActive", camera.getActiveCode() != null && !camera.getActiveCode().equals("") ? "1" : "0"); + cameraMap.put("showName", cameraUser.getShowName()); + return cameraMap; + } + + /** + * 将用户对象保存至redis缓存中,有效期1天 + * + * @param user + */ + private void saveUserToRedis(User user) throws Exception { + String key = RedisKey.User_Key + user.getUserId(); + redisHelperI.setRedis(key, StringUtil.ObjectToJson(user)); + } + + /** + * 获取云信的用户信息 + * + * @return + * @throws Exception + */ + private User getNeteaseIMUser() throws Exception { + User user = null; + String key = RedisKey.User_Key + IfishFilePath.netease_phone; + String userString = redisHelperI.getRedis(key); + + //1.从数据库或缓存中读取用户对象 + if (StringUtils.isNotBlank(userString)) { + user = (User) StringUtil.JsonToBean(userString, User.class); + } else { + user = tbl_User_Mapper.getUserByPhoneNumber(IfishFilePath.netease_phone); + redisHelperI.setRedis(key, StringUtil.ObjectToJson(user), 30, TimeUnit.DAYS); + } + return user; + } +} diff --git a/src/main/java/com/ifish/helper/UserHelperI.java b/src/main/java/com/ifish/helper/UserHelperI.java new file mode 100644 index 0000000..c6d3e8c --- /dev/null +++ b/src/main/java/com/ifish/helper/UserHelperI.java @@ -0,0 +1,32 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ifish.helper; + +import com.ifish.entity.User; + +/** + * 用户管理所有接口方法 + * + * @author Administrator + */ +public interface UserHelperI { + + /** + * 登陆接口 + * + * @param user + * @return + */ + public Object login(User user); + + /** + * 根据用户Id获取用户信息 + * + * @param userId + * @return + */ + public User getUserById(Integer userId) throws Exception; +} diff --git a/src/main/java/com/ifish/hibernate/HibernateBaseDao.java b/src/main/java/com/ifish/hibernate/HibernateBaseDao.java new file mode 100644 index 0000000..84aa477 --- /dev/null +++ b/src/main/java/com/ifish/hibernate/HibernateBaseDao.java @@ -0,0 +1,165 @@ +package com.ifish.hibernate; + +import java.io.Serializable; +import java.util.List; + +import org.hibernate.Criteria; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.criterion.Criterion; +import org.hibernate.criterion.Order; +import org.hibernate.criterion.Projections; +import org.springframework.beans.factory.annotation.Autowired; + + +/** + * hibernate DAO基类 + * @author ggw + * @param + * @param + */ +public abstract class HibernateBaseDao { + + @Autowired + protected SessionFactory sessionFactory; + + protected Session getSession() { + return sessionFactory.getCurrentSession(); + } + + /** + * 根据ID查找 + * @param id + * @return + */ + @SuppressWarnings("unchecked") + public T get(ID id) { + return (T) getSession().get(getEntityClass(), id); + } + + /** + * 保存 + * @param id + * @return + */ + public T save(T t) { + getSession().save(t); + return t; + } + + /** + * 更新 + * @param id + * @return + */ + public T update(T t) { + getSession().update(t); + return t; + } + + /** + * 保存或更新 + * @param id + * @return + */ + public T saveOrUpdate(T t) { + getSession().saveOrUpdate(t); + return t; + } + + /** + * 删除 + * @param id + * @return + */ + public void delete(T t) { + getSession().delete(t); + } + + /** + * 按属性查找对象列表 + * @param criterions + * @return + */ + @SuppressWarnings("unchecked") + public List findByProperty(Criterion... criterions) { + Criteria cri = createCriteria(null,criterions); + return cri.list(); + } + + /** + * 按属性查找对象列表 + * @param criterions + * @return + */ + @SuppressWarnings("unchecked") + public List findByProperty(Order order,Criterion... criterions) { + Criteria cri = createCriteria(order,criterions); + return cri.list(); + } + + /** + * 按属性查找唯一对象 + * @param criterions + * @return + */ + @SuppressWarnings("unchecked") + public T findUniqueByProperty(Criterion... criterions) { + Criteria cri = createCriteria(null,criterions); + return (T) cri.uniqueResult(); + } + + /** + * 按属性统计记录数 + * @param criterion + * @return + */ + public int countByProperty(Criterion... criterion) { + return ((Number) (this.createCriteria(null,criterion).setProjection(Projections.rowCount()).uniqueResult())).intValue(); + } + + /** + * 按Criterion查询分页列表数据. + * @param firstResult + * @param pageSize + * @param criterion + * @return + */ + @SuppressWarnings("unchecked") + public Pagination findByCriteria(Integer firstResult,Integer pageSize,Order order,Criterion... criterion) { + Criteria criteria = createCriteria(order,criterion); + if(firstResult!=null && pageSize!=null){ + criteria.setFirstResult(firstResult); + criteria.setMaxResults(pageSize); + } + Pagination page = new Pagination(); + page.setTotalCount(this.countByProperty(criterion)); + page.setList(criteria.list()); + return page; + } + + /** + * 根据Criterion条件创建Criteria,后续可进行更多处理,辅助函数. + * @param criterions + * @return + */ + protected Criteria createCriteria(Order order,Criterion... criterions) { + Criteria criteria = getSession().createCriteria(getEntityClass()); + //筛选条件 + for (Criterion c : criterions) { + criteria.add(c); + } + //排序 + if(order!=null){ + criteria.addOrder(order); + } + return criteria; + } + + /** + * 获得Dao对于的实体类 + * @return + */ + abstract protected Class getEntityClass(); + +} diff --git a/src/main/java/com/ifish/hibernate/Pagination.java b/src/main/java/com/ifish/hibernate/Pagination.java new file mode 100644 index 0000000..c85bbb0 --- /dev/null +++ b/src/main/java/com/ifish/hibernate/Pagination.java @@ -0,0 +1,82 @@ +package com.ifish.hibernate; + +import java.util.List; + +/** + * 列表分页。包含list属性。 + */ +public class Pagination implements java.io.Serializable { + + private static final long serialVersionUID = 1L; + private int totalCount = 0; + private int pageSize = 10; + private int pageNo = 1; + private int DEF_COUNT = 10; + private List list; + + public Pagination() { + + } + + public Pagination(int pageNo, int pageSize, int totalCount) { + setTotalCount(totalCount); + setPageSize(pageSize); + setPageNo(pageNo); + } + + public Pagination(int pageNo, int pageSize, int totalCount, List list) { + setTotalCount(totalCount); + setPageSize(pageSize); + setPageNo(pageNo); + this.list = list; + } + + public void setTotalCount(int totalCount) { + if (totalCount < 0) { + this.totalCount = 0; + } else { + this.totalCount = totalCount; + } + } + + public int getTotalCount() { + return totalCount; + } + + public void setPageSize(int pageSize) { + if (pageSize < 1) { + this.pageSize = DEF_COUNT; + } else { + this.pageSize = pageSize; + } + } + + public int getPageSize() { + return pageSize; + } + + public void setPageNo(int pageNo) { + if (pageNo < 1) { + this.pageNo = 1; + } else { + this.pageNo = pageNo; + } + } + + public int getPageNo() { + return pageNo; + } + + public int getFirstResult() { + return (pageNo - 1) * pageSize; + } + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + +} diff --git a/src/main/java/com/ifish/interceptor/SecurityValidateInterceptor.java b/src/main/java/com/ifish/interceptor/SecurityValidateInterceptor.java new file mode 100644 index 0000000..19ae5b5 --- /dev/null +++ b/src/main/java/com/ifish/interceptor/SecurityValidateInterceptor.java @@ -0,0 +1,69 @@ +package com.ifish.interceptor; + +import java.io.IOException; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import com.ifish.enums.ResultEnum; +import com.ifish.exception.IfishException; +import com.ifish.netease.CheckSumBuilder; + +/** + * 安全校验拦截器 + * + * @author guogw + * + */ +public class SecurityValidateInterceptor implements HandlerInterceptor { + + public SecurityValidateInterceptor(boolean devModel) { + this.devModel = devModel; + } + + //appKey(ifishAppKey1)MD5 + private String ifishAppKey = "5fc7bdada110e3a6eefd3065b8d8d995"; + //appSecret(ifishAppSecret1)MD5前12位 + private String ifishAppSecret = "9596b393ab0f"; + //开发模式 + private boolean devModel = false; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException { + //开发模式 + if (!devModel) { + String nonce = request.getHeader("nonce"); + String appKey = request.getHeader("appKey"); + String curTime = request.getHeader("curTime"); + String checkSum = request.getHeader("checkSum"); + //校验参数完整性 + if (StringUtils.isNotBlank(checkSum) && StringUtils.isNotBlank(appKey) && StringUtils.isNotBlank(nonce) && StringUtils.isNotBlank(curTime)) { + //校验appKey + if (appKey.equals(ifishAppKey)) { + //计算md5 + String md5Sum = CheckSumBuilder.getMD5(ifishAppSecret + nonce + curTime); + if (md5Sum.equals(checkSum)) { + return true; + } + } + } + throw new IfishException(ResultEnum.error400); + } + return true; + } + + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + + } + +} diff --git a/src/main/java/com/ifish/jpush/SmsNumSend.java b/src/main/java/com/ifish/jpush/SmsNumSend.java new file mode 100644 index 0000000..003ed50 --- /dev/null +++ b/src/main/java/com/ifish/jpush/SmsNumSend.java @@ -0,0 +1,55 @@ +package com.ifish.jpush; + +import com.taobao.api.ApiException; +import com.taobao.api.DefaultTaobaoClient; +import com.taobao.api.TaobaoClient; +import com.taobao.api.request.AlibabaAliqinFcSmsNumSendRequest; +import com.taobao.api.response.AlibabaAliqinFcSmsNumSendResponse; + +public class SmsNumSend { + //公共回传参数 + private String extend=""; + //短信类型 + private String sms_type = "normal"; + //签名模板,在阿里大鱼"管理中心-短信签名管理中"中的可用签名 + //private String sms_free_sign_name="注册验证"; + //短信模板变量 + private String sms_param="爱鱼奇"; + //短信模板ID,在阿里大鱼"管理中心-短信签名管理中"中的可用模板 + //private String sms_template_code; + //URL + private String url ="http://gw.api.taobao.com/router/rest"; + //在开发平台-应用管理-概览-App Key + private String appkey ="23252927"; + //在开发平台-应用管理-概览-App Secret + private String secret ="c904889cc31bf6ba04707d7e1039ed1e"; + /*当API的访问级别为‘公开’时,SessionKey不需要填写; + 当API的访问级别为‘须用户登录’时,SessionKey必须填写; + 当API的访问级别为‘隐私数据须用户登录’时,SessionKey可填可不填; + 如何获取SessionKey,请搜索‘用户授权介绍’或点击上面的‘Session获取工具*/ + //private String sessionKey; + + /** + * 发送短信 + * @param rec_num 手机号 + * @param code 验证码 + * @return + */ + public boolean sendSmsNum(String rec_num,String code,String sign_name,String template_code){ + TaobaoClient client = new DefaultTaobaoClient(url, appkey, secret); + AlibabaAliqinFcSmsNumSendRequest req = new AlibabaAliqinFcSmsNumSendRequest(); + req.setExtend(extend); + req.setSmsType(sms_type); + req.setSmsFreeSignName(sign_name); + req.setSmsParam("{\"code\":\""+code+"\",\"product\":"+sms_param+"}"); + req.setRecNum(rec_num); + req.setSmsTemplateCode(template_code); + try { + AlibabaAliqinFcSmsNumSendResponse rsp = client.execute(req); + return rsp.getResult().getSuccess(); + } catch (ApiException e) { + e.getStackTrace(); + } + return false; + } +} diff --git a/src/main/java/com/ifish/mail/Mail.java b/src/main/java/com/ifish/mail/Mail.java new file mode 100644 index 0000000..ff13a75 --- /dev/null +++ b/src/main/java/com/ifish/mail/Mail.java @@ -0,0 +1,200 @@ +package com.ifish.mail; + +import java.util.Properties; + +import javax.mail.BodyPart; +import javax.mail.Message; +import javax.mail.Multipart; +import javax.mail.Session; +import javax.mail.Transport; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeBodyPart; +import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeMultipart; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Mail { + + private MimeMessage mimeMsg; //MIME邮件对象 + private Session session; //邮件会话对象 + private Properties props; //系统属性 + private Multipart mp; //Multipart对象,邮件内容,标题,附件等内容均添加到其中后再生成MimeMessage对象 + private static boolean needAuth = true;//smtp是否需要认证 + private static boolean isDebug = false;//是否开启调试 + //smtp认证用户名和密码 + private static String smtp = "smtp.qq.com";//SMTP服务器 + private static String username = "service@ifish7.com"; + private static String password = "Ifish72015"; + private static String from = "service@ifish7.com"; + //private static String to = "fun@ifish7.com"; + private static String to = "help@ifish7.com"; + private static Logger log = LoggerFactory.getLogger(Mail.class); + + /** + * Constructor + * + * @param smtp 邮件发送服务器 + */ + public Mail(String smtp) { + setSmtpHost(smtp); + createMimeMessage(); + } + + /** + * 设置邮件发送服务器 + * + * @param hostName String + */ + public void setSmtpHost(String hostName) { + if (props == null) { + props = System.getProperties(); //获得系统属性对象 + } + //设置SMTP主机 + props.put("mail.smtp.host", hostName); + //设置SMTP是否需要验证 + props.put("mail.smtp.auth", needAuth); + props.put("mail.smtp.starttls.enable", needAuth); + } + + /** + * 创建MIME邮件对象 + * + * @return + */ + public boolean createMimeMessage() { + try { + session = Session.getDefaultInstance(props, null); //获得邮件会话对象 + } catch (Exception e) { + log.error("获取邮件会话对象时发生错误!" + e.toString()); + return false; + } + try { + mimeMsg = new MimeMessage(session); //创建MIME邮件对象 + mp = new MimeMultipart(); + return true; + } catch (Exception e) { + log.error("创建MIME邮件对象失败!" + e.toString()); + return false; + } + } + + /** + * 设置邮件主题 + * + * @param mailSubject + * @return + */ + public boolean setSubject(String mailSubject) { + try { + mimeMsg.setSubject(mailSubject); + return true; + } catch (Exception e) { + log.error("设置邮件主题失败" + e.toString()); + return false; + } + } + + /** + * 设置邮件正文 + * + * @param mailBody String + */ + public boolean setBody(String mailBody) { + try { + BodyPart bp = new MimeBodyPart(); + bp.setContent(mailBody, "text/html;charset=GBK"); + mp.addBodyPart(bp); + return true; + } catch (Exception e) { + log.error("设置邮件正文失败" + e.toString()); + return false; + } + } + + /** + * 设置发信人 + * + * @param from String + */ + public boolean setFrom(String from) { + try { + mimeMsg.setFrom(new InternetAddress(from)); //设置发信人 + return true; + } catch (Exception e) { + log.error("设置发信人失败" + e.toString()); + return false; + } + } + + /** + * 设置收信人 + * + * @param to String + */ + public boolean setTo(String to) { + try { + mimeMsg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to)); + return true; + } catch (Exception e) { + log.error("设置收信人失败" + e.toString()); + return false; + } + } + + /** + * 发送邮件 + */ + public boolean sendOut() { + try { + mimeMsg.setContent(mp); + mimeMsg.saveChanges(); + Session mailSession = Session.getInstance(props, null); + mailSession.setDebug(isDebug); + Transport transport = mailSession.getTransport("smtp"); + transport.connect((String) props.get("mail.smtp.host"), username, password); + transport.sendMessage(mimeMsg, mimeMsg.getRecipients(Message.RecipientType.TO)); + //transport.send(mimeMsg); + transport.close(); + return true; + } catch (Exception e) { + log.error("发送邮件失败" + e.toString()); + return false; + } + } + + /** + * 调用sendOut方法完成邮件发送 + * + * @param smtp + * @param from + * @param to + * @param subject + * @param content + * @param username + * @param password + * @return boolean + */ + public static boolean send(String subject, String content) { + Mail theMail = new Mail(smtp); + + if (!theMail.setSubject(subject)) { + return false; + } + if (!theMail.setFrom(from)) { + return false; + } + if (!theMail.setTo(to)) { + return false; + } + if (!theMail.setBody(content)) { + return false; + } + if (!theMail.sendOut()) { + return false; + } + return true; + } + +} diff --git a/src/main/java/com/ifish/mapper/Tbl_Ad_Info_Mapper.java b/src/main/java/com/ifish/mapper/Tbl_Ad_Info_Mapper.java new file mode 100644 index 0000000..603e7d4 --- /dev/null +++ b/src/main/java/com/ifish/mapper/Tbl_Ad_Info_Mapper.java @@ -0,0 +1,23 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ifish.mapper; + +import org.apache.ibatis.annotations.Select; + +/** + * + * @author Administrator + */ +public interface Tbl_Ad_Info_Mapper { + + /** + * 获取广告信息表最大ID + * @return + */ + @Select("SELECT MAX(ad_id) FROM TBL_AD_INFO") + Integer getMaxInfo(); + +} diff --git a/src/main/java/com/ifish/mapper/Tbl_Camera_Mapper.java b/src/main/java/com/ifish/mapper/Tbl_Camera_Mapper.java new file mode 100644 index 0000000..540b28e --- /dev/null +++ b/src/main/java/com/ifish/mapper/Tbl_Camera_Mapper.java @@ -0,0 +1,28 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ifish.mapper; + +import com.ifish.entity.Camera; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +/** + * 摄像头激活信息 + * + * @author Administrator + */ +public interface Tbl_Camera_Mapper { + + /** + * 根据摄像头ID获取绑定信息 + * + * @param cameraId + * @return + */ + @Select("select camera_id,active_code,active_time,create_time,update_time from tbl_camera where camera_id=#{id}") + Camera getCameraById(@Param("id") String cameraId); + +} diff --git a/src/main/java/com/ifish/mapper/Tbl_Camera_User_Mapper.java b/src/main/java/com/ifish/mapper/Tbl_Camera_User_Mapper.java new file mode 100644 index 0000000..3da9a8a --- /dev/null +++ b/src/main/java/com/ifish/mapper/Tbl_Camera_User_Mapper.java @@ -0,0 +1,28 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ifish.mapper; + +import com.ifish.entity.CameraUser; +import java.util.List; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +/** + * + * @author Administrator + */ +public interface Tbl_Camera_User_Mapper { + + /** + * 根据用户信息获取绑定的摄像头列表 + * + * @param userid + * @return + */ + @Select("select user_id,camera_id,is_master,show_name,is_look,is_live,create_time,update_time from tbl_camera_user where user_id=#{userid}") + List getCameraUserListByUserId(@Param("userid") Integer userid); + +} diff --git a/src/main/java/com/ifish/mapper/Tbl_Commodity_Info_Mapper.java b/src/main/java/com/ifish/mapper/Tbl_Commodity_Info_Mapper.java new file mode 100644 index 0000000..da009a6 --- /dev/null +++ b/src/main/java/com/ifish/mapper/Tbl_Commodity_Info_Mapper.java @@ -0,0 +1,84 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ifish.mapper; + +import com.ifish.bean.CommodityInfoBean; +import java.util.List; +import java.util.Map; +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.InsertProvider; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.SelectKey; +import org.apache.ibatis.annotations.SelectProvider; +import org.apache.ibatis.annotations.UpdateProvider; + +/** + * + * @author Administrator + */ +public interface Tbl_Commodity_Info_Mapper { + + /** + * 创建商品详情 + * + * @param commodityInfoBean + * @return + */ + @InsertProvider(type = Tbl_Commodity_Info_MapperSql.class, method = "createCommodityInfo") + @SelectKey(statement = "select @@IDENTITY as commodity_id", keyProperty = "commodity.commodityId", keyColumn = "commodity_id", before = false, resultType = int.class) + Integer createCommodityInfo(@Param("commodity") CommodityInfoBean commodityInfoBean); + + /** + * 修改商品详情 + * + * @param commodityInfoBean + * @return + */ + @UpdateProvider(type = Tbl_Commodity_Info_MapperSql.class, method = "updateCommodityInfo") + Integer updateCommodityInfo(@Param("commodity") CommodityInfoBean commodityInfoBean); + + /** + * 根据商品ID查询单个商品信息 + * + * @param id + * @return + */ + @Select("SELECT commodity_id,shop_id,user_id,commodity_name,commodity_detail,commodity_img,commodity_video,commodity_status,create_time,click,backstage_status FROM tbl_commodity_info WHERE commodity_id = #{id}") + CommodityInfoBean getCommodityInfoByID(@Param("id") Integer id); + + /** + * 分页获取店铺所属商品列表 + * + * @param shopId + * @param firstResult + * @param pageSize + * @return + */ + @Select("SELECT commodity_id,shop_id,user_id,commodity_name,commodity_detail,commodity_img,commodity_video,commodity_status,create_time,click,backstage_status FROM tbl_commodity_info " + + "WHERE shop_id = #{id} and backstage_status = 0 and commodity_status = #{status} order by ${orderBy} desc LIMIT ${firsltResult},${pageSize}") + List getCommodityInfoByPage(@Param("id") Integer shopId, @Param("firsltResult") Integer firstResult, @Param("pageSize") Integer pageSize, @Param("status") Integer commodityState, @Param("orderBy") String orderBy); + + /** + * 分页获取店铺所属商品列表总数 + * + * @param shopId + * @param firstResult + * @param pageSize + * @return + */ + @Select("SELECT count(1) FROM tbl_commodity_info WHERE shop_id = #{id} and backstage_status = 0 and commodity_status = #{status}") + int getCommodityInfoCountByPage(@Param("id") Integer shopId, @Param("status") Integer commodityState); + + /** + * 根据ID删除商品 + * + * @param commodityId + * @return + */ + @Delete("DELETE FROM tbl_commodity_info WHERE commodity_id = #{id}") + int deleteCommodityInfoById(@Param("id") Integer commodityId); +} diff --git a/src/main/java/com/ifish/mapper/Tbl_Commodity_Info_MapperSql.java b/src/main/java/com/ifish/mapper/Tbl_Commodity_Info_MapperSql.java new file mode 100644 index 0000000..176679f --- /dev/null +++ b/src/main/java/com/ifish/mapper/Tbl_Commodity_Info_MapperSql.java @@ -0,0 +1,82 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ifish.mapper; + +import com.ifish.bean.CommodityInfoBean; +import org.apache.commons.lang3.StringUtils; +import org.apache.ibatis.annotations.Param; + +/** + * + * @author Administrator + */ +public class Tbl_Commodity_Info_MapperSql { + + public String createCommodityInfo(@Param("commodity") CommodityInfoBean commodityInfoBean) { + StringBuilder sb = new StringBuilder(); + + sb.append("INSERT INTO tbl_commodity_info (shop_id,user_id,commodity_name,"); + if (StringUtils.isNotBlank(commodityInfoBean.getCommodityDetail())) { + sb.append("commodity_detail,"); + } + if (StringUtils.isNotBlank(commodityInfoBean.getCommodityImg())) { + sb.append("commodity_img,"); + } + if (StringUtils.isNotBlank(commodityInfoBean.getCommodityVideo())) { + sb.append("commodity_video,"); + } + sb.append("commodity_status,create_time,click,backstage_status) VALUES (#{commodity.shopId},#{commodity.userId},#{commodity.commodityName},"); + if (StringUtils.isNotBlank(commodityInfoBean.getCommodityDetail())) { + sb.append("#{commodity.commodityDetail},"); + } + if (StringUtils.isNotBlank(commodityInfoBean.getCommodityImg())) { + sb.append("#{commodity.commodityImg},"); + } + if (StringUtils.isNotBlank(commodityInfoBean.getCommodityVideo())) { + sb.append("#{commodity.commodityVideo},"); + } + sb.append("0,NOW(),0,0)"); + return sb.toString(); + } + + public String updateCommodityInfo(@Param("commodity") CommodityInfoBean commodityInfoBean) { + StringBuilder sb = new StringBuilder(); + + sb.append("UPDATE tbl_commodity_info SET "); + if (commodityInfoBean.getShopId() != null && commodityInfoBean.getShopId() >= 0) { + sb.append("shop_id = #{commodity.shopId},"); + } + if (commodityInfoBean.getUserId() != null && commodityInfoBean.getUserId() >= 0) { + sb.append("user_id = #{commodity.userId},"); + } + if (commodityInfoBean.getClick() != null && commodityInfoBean.getClick() > 0) { + sb.append("click = click+1 ,"); + } + if (commodityInfoBean.getBackstageStatus() != null && commodityInfoBean.getBackstageStatus() >= 0) { + sb.append("backstage_status = #{commodity.backstageStatus},"); + } + if (commodityInfoBean.getCommodityStatus() != null && commodityInfoBean.getCommodityStatus() >= 0) { + sb.append("commodity_status = #{commodity.commodityStatus},"); + } + if (StringUtils.isNotBlank(commodityInfoBean.getCommodityName())) { + sb.append("commodity_name = #{commodity.commodityName},"); + } + if (StringUtils.isNotBlank(commodityInfoBean.getCommodityImg())) { + sb.append("commodity_img = #{commodity.commodityImg},"); + } + if (StringUtils.isNotBlank(commodityInfoBean.getCommodityDetail())) { + sb.append("commodity_detail = #{commodity.commodityDetail},"); + } + if (StringUtils.isNotBlank(commodityInfoBean.getCommodityVideo())) { + sb.append("commodity_video = #{commodity.commodityVideo},"); + } + if (sb.lastIndexOf(",") == sb.length() - 1) { + sb.deleteCharAt(sb.length() - 1); + } + sb.append(" WHERE commodity_id = #{commodity.commodityId}"); + return sb.toString(); + } +} diff --git a/src/main/java/com/ifish/mapper/Tbl_Device_Mapper.java b/src/main/java/com/ifish/mapper/Tbl_Device_Mapper.java new file mode 100644 index 0000000..11899dc --- /dev/null +++ b/src/main/java/com/ifish/mapper/Tbl_Device_Mapper.java @@ -0,0 +1,28 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ifish.mapper; + +import com.ifish.entity.Device; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +/** + * + * @author Administrator + */ +public interface Tbl_Device_Mapper { + + /** + * 根据设备ID获取设备详情 + * + * @param deviceid + * @return + */ + @Select("select device_id,server_ip,device_ip,mac_address,login_count,login_time,hardware_type,software_version,brand_code,is_blacklist,water_remind,remind_date,remind_cycle," + + "today_remind,first_activate,create_time,create_date from tbl_device where device_id= #{deviceid}") + Device getDeviceById(@Param("deviceid") Integer deviceid); + +} diff --git a/src/main/java/com/ifish/mapper/Tbl_Device_User_Mapper.java b/src/main/java/com/ifish/mapper/Tbl_Device_User_Mapper.java new file mode 100644 index 0000000..c170ff6 --- /dev/null +++ b/src/main/java/com/ifish/mapper/Tbl_Device_User_Mapper.java @@ -0,0 +1,38 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ifish.mapper; + +import com.ifish.bean.DeviceUserBean; +import com.ifish.entity.DeviceCamera; +import com.ifish.entity.DeviceUser; +import java.util.List; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +/** + * + * @author Administrator + */ +public interface Tbl_Device_User_Mapper { + + /** + * 根据用户ID获取设备列表 + * + * @param userid + * @return + */ + @Select("select user_id,device_id,is_master,show_name,create_time,update_time,custom_icon_name,custom_show_name from tbl_device_user where user_id = #{userid}") + List getDeviceUsersByUserId(@Param("userid") Integer userid); + + /** + * 根据设备ID获取设备绑定摄像头集合 + * + * @param deviceId + * @return + */ + @Select("select camera_id,device_id from tbl_device_camera where device_id=#{deviceId}") + List getDeviceCameraListByDeviceId(@Param("deviceId") Integer deviceId); +} diff --git a/src/main/java/com/ifish/mapper/Tbl_Hardware_Type_Mapper.java b/src/main/java/com/ifish/mapper/Tbl_Hardware_Type_Mapper.java new file mode 100644 index 0000000..eb3463e --- /dev/null +++ b/src/main/java/com/ifish/mapper/Tbl_Hardware_Type_Mapper.java @@ -0,0 +1,28 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ifish.mapper; + +import com.ifish.entity.HardwareType; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +/** + * + * @author Administrator + */ +public interface Tbl_Hardware_Type_Mapper { + + /** + * 根据设备类型Code获取厂家设备类型详情 + * + * @param type + * @return + */ + @Select("select hardware_type,hardware_name,control_amount,timer_amount,is_work_model,is_custom_icon,all_icon_name,all_show_name,default_icon_name,default_show_name," + + "icon_link,is_lightness,is_sark_lamp,hardware_desc,update_time,create_time from tbl_hardware_type where hardware_type=#{type}") + HardwareType getHardwareTypeByTypeCode(@Param("type") String type); + +} diff --git a/src/main/java/com/ifish/mapper/Tbl_Shops_Info_Mapper.java b/src/main/java/com/ifish/mapper/Tbl_Shops_Info_Mapper.java new file mode 100644 index 0000000..0e11632 --- /dev/null +++ b/src/main/java/com/ifish/mapper/Tbl_Shops_Info_Mapper.java @@ -0,0 +1,22 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ifish.mapper; + +import com.ifish.entity.ShopsInfo; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +/** + * + * @author Administrator + */ +public interface Tbl_Shops_Info_Mapper { + + @Select("select shops_id,user_id,user_name,shops_name,shops_phone,shops_province,shops_city,shops_area,shops_address,picture1,picture2,picture3,picture4,`status`,reason," + + "update_time,create_time,review_time,type_key,remark,app_show,weixin_code,shop_link,is_ping_bi from tbl_shops_info WHERE user_id = #{userid}") + ShopsInfo getShopsInfoByUserId(@Param("userid") Integer userid); + +} diff --git a/src/main/java/com/ifish/mapper/Tbl_User_Activity_Mapper.java b/src/main/java/com/ifish/mapper/Tbl_User_Activity_Mapper.java new file mode 100644 index 0000000..05aa4e7 --- /dev/null +++ b/src/main/java/com/ifish/mapper/Tbl_User_Activity_Mapper.java @@ -0,0 +1,37 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ifish.mapper; + +import java.util.List; +import java.util.Map; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +/** + * + * @author Administrator + */ +public interface Tbl_User_Activity_Mapper { + + /** + * 分页获取所有用户动态 + * + * @param pageNum + * @param pageSize + * @return + */ + @Select("select a.activity_id as activityId ,a.user_id as userId,tu.user_img as userImg,tu.nick_name as nickName,u.grade_value,a.activity_type as activityType,a.create_time from tbl_user_activity a LEFT JOIN tbl_user_asset u ON a.user_id=u.user_id LEFT JOIN tbl_user tu ON a.user_id=tu.user_id ORDER BY activity_id DESC LIMIT ${pageNum},${pageSize}") + List getUserActivityByPage(@Param("pageNum") Integer pageNum, @Param("pageSize") Integer pageSize); + + /** + * 获取用户动态最大ID + * + * @return + */ + @Select("select max(activity_id) from tbl_user_activity ") + Integer getUserActivityCount(); + +} diff --git a/src/main/java/com/ifish/mapper/Tbl_User_Mapper.java b/src/main/java/com/ifish/mapper/Tbl_User_Mapper.java new file mode 100644 index 0000000..015a469 --- /dev/null +++ b/src/main/java/com/ifish/mapper/Tbl_User_Mapper.java @@ -0,0 +1,57 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ifish.mapper; + +import com.ifish.entity.User; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; +import org.apache.ibatis.annotations.UpdateProvider; + +/** + * + * @author Administrator + */ +public interface Tbl_User_Mapper { + + /** + * 根据手机号获取用户对象 + * + * @return + */ + @Select("SELECT user_id,nick_name,user_password,phone_number,user_img,user_sex,signature,login_count,phone_type,update_time,login_time,create_time,login_type,remarks," + + "address,P2PVerify_code1,P2PVerify_code2,gwell_userID,is_register_gwell,user_type,shops_user_id,netease_token,is_register_netease,latitude,longitude from tbl_user where phone_number=#{phoneNumber}") + User getUserByPhoneNumber(@Param("phoneNumber") String phoneNumber); + + /** + * 根据用户ID获取用户对象 + * + * @param userid + * @return + */ + @Select("SELECT user_id,nick_name,user_password,phone_number,user_img,user_sex,signature,login_count,phone_type,update_time,login_time,create_time,login_type,remarks," + + "address,P2PVerify_code1,P2PVerify_code2,gwell_userID,is_register_gwell,user_type,shops_user_id,netease_token,is_register_netease,latitude,longitude from tbl_user where user_id=#{userid}") + User getUserByUserId(@Param("userid") String userid); + + /** + * 每次登陆后修改登陆时间、次数和手机类型 + * + * @param userId + * @param loginType + * @return + */ + @Update("update tbl_user set login_count=if(login_count is null,1,login_count+1),login_type=#{logintype},login_time=current_timestamp() where user_id=#{userid}") + Integer executeLoginUpdate(@Param("userid") Integer userId, @Param("logintype") String loginType); + + /** + * 修改用户账号信息 + * + * @param user + * @return + */ + @UpdateProvider(type = Tbl_User_MapperSql.class, method = "updateUser") + Integer updateUser(@Param("user") User user); +} diff --git a/src/main/java/com/ifish/mapper/Tbl_User_MapperSql.java b/src/main/java/com/ifish/mapper/Tbl_User_MapperSql.java new file mode 100644 index 0000000..5855d31 --- /dev/null +++ b/src/main/java/com/ifish/mapper/Tbl_User_MapperSql.java @@ -0,0 +1,92 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ifish.mapper; + +import com.ifish.entity.User; +import org.apache.commons.lang3.StringUtils; +import org.apache.ibatis.annotations.Param; + +/** + * + * @author Administrator + */ +public class Tbl_User_MapperSql { + + public String updateUser(@Param("user") User user) { + StringBuilder sb = new StringBuilder(); + + sb.append("Update tbl_User SET "); + if (user.getNickName() != null && StringUtils.isNotBlank(user.getNickName())) { + sb.append("nick_name = #{user.nickName}, "); + } + if (user.getUserPassword() != null && StringUtils.isNotBlank(user.getUserPassword())) { + sb.append("user_password = #{user.userPassword}, "); + } + if (user.getPhoneNumber() != null && StringUtils.isNotBlank(user.getPhoneNumber())) { + sb.append("phone_number = #{user.phoneNumber}, "); + } + if (user.getUserImg() != null && StringUtils.isNotBlank(user.getUserImg())) { + sb.append("user_img = #{user.userImg}, "); + } + if (user.getUserSex() != null && StringUtils.isNotBlank(user.getUserSex())) { + sb.append("user_sex = #{user.userSex}, "); + } + if (user.getSignature() != null && StringUtils.isNotBlank(user.getSignature())) { + sb.append("signature = #{user.signature}, "); + } + if (user.getPhoneType() != null && StringUtils.isNotBlank(user.getPhoneType())) { + sb.append("phone_type = #{user.phoneType}, "); + } + if (user.getUpdateTime() != null) { + sb.append("update_time = #{user.updateTime}, "); + } + if (user.getLoginTime() != null) { + sb.append("login_time = #{user.loginTime}, "); + } + if (user.getLoginType() != null && StringUtils.isNotBlank(user.getLoginType())) { + sb.append("login_type = #{user.loginType}, "); + } + if (user.getAddress() != null && StringUtils.isNotBlank(user.getAddress())) { + sb.append("address = #{user.address}, "); + } + if (user.getP2PVerifyCode1() != null && StringUtils.isNotBlank(user.getP2PVerifyCode1())) { + sb.append("P2PVerify_code1 = #{user.p2PVerifyCode1}, "); + } + if (user.getP2PVerifyCode2() != null && StringUtils.isNotBlank(user.getP2PVerifyCode2())) { + sb.append("P2PVerify_code2 = #{user.p2PVerifyCode2}, "); + } + if (user.getGwellUserID() != null && StringUtils.isNotBlank(user.getGwellUserID())) { + sb.append("gwell_userID = #{user.gwellUserID}, "); + } + if (user.getIsRegisterGwell() != null && StringUtils.isNotBlank(user.getIsRegisterGwell())) { + sb.append("is_register_gwell = #{user.isRegisterNetease}, "); + } + if (user.getUserType() != null && StringUtils.isNotBlank(user.getUserType())) { + sb.append("user_type = #{user.userType}, "); + } + if (user.getShopsUserId() != null && user.getShopsUserId() > 0) { + sb.append("shops_user_id = #{user.shopsUserId}, "); + } + if (user.getNeteaseToken() != null && StringUtils.isNotBlank(user.getNeteaseToken())) { + sb.append("netease_token = #{user.neteaseToken}, "); + } + if (user.getIsRegisterNetease() != null && StringUtils.isNotBlank(user.getIsRegisterNetease())) { + sb.append("is_register_netease = #{user.isRegisterNetease}, "); + } + if (user.getLatitude() != null && user.getLatitude() > 0) { + sb.append("latitude = #{user.latitude}, "); + } + if (user.getLongitude() != null && user.getLongitude() > 0) { + sb.append("latitude = #{iser.latitude}, "); + } + if (sb.lastIndexOf(",") == sb.length() - 1) { + sb.deleteCharAt(sb.length() - 1); + } + sb.append(" WHERE user_id = #{user.userId}"); + return sb.toString(); + } + +} diff --git a/src/main/java/com/ifish/mapper/Tbl_Vender_list_Mapper.java b/src/main/java/com/ifish/mapper/Tbl_Vender_list_Mapper.java new file mode 100644 index 0000000..9a58ab2 --- /dev/null +++ b/src/main/java/com/ifish/mapper/Tbl_Vender_list_Mapper.java @@ -0,0 +1,27 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ifish.mapper; + +import com.ifish.bean.VenderListBean; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +/** + * + * @author Administrator + */ +public interface Tbl_Vender_list_Mapper { + + /** + * 根据code获取厂家信息 + * + * @param code + * @return + */ + @Select("select brand_code,brand_name,brand_introduce,brand_logo from tbl_vender_list where brand_code=#{code}") + VenderListBean getVenderListByBrandCode(@Param("code") String code); + +} diff --git a/src/main/java/com/ifish/netease/CheckSumBuilder.java b/src/main/java/com/ifish/netease/CheckSumBuilder.java new file mode 100644 index 0000000..3f3f12e --- /dev/null +++ b/src/main/java/com/ifish/netease/CheckSumBuilder.java @@ -0,0 +1,48 @@ +package com.ifish.netease; + +import java.security.MessageDigest; + +/** + * SHA1(AppSecret + Nonce + CurTime),三个参数拼接的字符串,进行SHA1哈希计算,转化成16进制字符(String,小写) + * @author Administrator + * + */ +public class CheckSumBuilder { + + // 计算并获取CheckSum + public static String getCheckSum(String appSecret, String nonce, String curTime) { + return encode("sha1", appSecret + nonce + curTime); + } + + // 计算并获取md5值 + public static String getMD5(String requestBody) { + return encode("md5", requestBody); + } + + private static String encode(String algorithm, String value) { + if (value == null) { + return null; + } + try { + MessageDigest messageDigest + = MessageDigest.getInstance(algorithm); + messageDigest.update(value.getBytes()); + return getFormattedText(messageDigest.digest()); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static String getFormattedText(byte[] bytes) { + int len = bytes.length; + StringBuilder buf = new StringBuilder(len * 2); + for (int j = 0; j < len; j++) { + buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]); + buf.append(HEX_DIGITS[bytes[j] & 0x0f]); + } + return buf.toString(); + } + + private static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + +} \ No newline at end of file diff --git a/src/main/java/com/ifish/netease/NeteaseIM.java b/src/main/java/com/ifish/netease/NeteaseIM.java new file mode 100644 index 0000000..fe35d11 --- /dev/null +++ b/src/main/java/com/ifish/netease/NeteaseIM.java @@ -0,0 +1,343 @@ +package com.ifish.netease; + +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.http.HttpResponse; +import org.apache.http.NameValuePair; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.ifish.enums.NeteaseEnum; +import com.ifish.util.IfishUtil; + +@SuppressWarnings("deprecation") +public class NeteaseIM { + + String appKey = "87b0e3315dfc2df08060bcb54246da68"; + String appSecret = "e62f6c247b46"; + + private static Logger log = LoggerFactory.getLogger(NeteaseIM.class); + + /** + * 创建云信ID + * @param accid 云信ID,最大长度32字符,必须保证一个APP内唯一 + * @param name 云信ID昵称,最大长度64字符,用来PUSH推送 时显示的昵称 + * @param icon 云信ID头像URL,第三方可选填,最大长度1024 + * @param props json属性,第三方可选填,最大长度1024字符 + * @return + * @throws Exception + */ + @SuppressWarnings({"resource"}) + public Map createAccid(String accid,String name,String icon,String props){ + try { + + DefaultHttpClient httpClient = new DefaultHttpClient(); + String url = "https://api.netease.im/nimserver/user/create.action"; + HttpPost httpPost = new HttpPost(url); + String nonce = IfishUtil.getCharAndNumr(10); + String curTime = String.valueOf((new Date()).getTime() / 1000L); + //计算CheckSum + String checkSum = CheckSumBuilder.getCheckSum(appSecret, nonce ,curTime); + //设置请求的header + httpPost.addHeader("AppKey", appKey); + httpPost.addHeader("Nonce", nonce); + httpPost.addHeader("CurTime", curTime); + httpPost.addHeader("CheckSum", checkSum); + httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8"); + //设置请求的参数 + List nvps = new ArrayList(); + nvps.add(new BasicNameValuePair("accid", accid)); + nvps.add(new BasicNameValuePair("name", name)); + nvps.add(new BasicNameValuePair("icon", icon)); + nvps.add(new BasicNameValuePair("props", props)); + httpPost.setEntity(new UrlEncodedFormEntity(nvps, "utf-8")); + //执行请求 + HttpResponse response = httpClient.execute(httpPost); + //执行结果 + String responseStr = EntityUtils.toString(response.getEntity(), "utf-8"); + JSONObject json = JSON.parseObject(responseStr); + String code = json.getString("code"); + Map map = new HashMap(); + map.put("code", code); + //200 + if(code.equals(NeteaseEnum.status200.getKey())){ + JSONObject infoJson = json.getJSONObject("info"); + String token = infoJson.getString("token"); + map.put("token", token); + } + else if(code.equals(NeteaseEnum.status414.getKey())){ + //String desc = json.getString("desc"); + } + return map; + } catch (Exception e) { + log.error("CreateAccid error message:{},{}",accid,e.toString()); + } + return null; + } + + /** + * 更新并获取新token + * @param accid + * @return + * @throws Exception + */ + @SuppressWarnings({"resource"}) + public Map refreshToken(String accid){ + try { + DefaultHttpClient httpClient = new DefaultHttpClient(); + String url = "https://api.netease.im/nimserver/user/refreshToken.action"; + HttpPost httpPost = new HttpPost(url); + String nonce = IfishUtil.getCharAndNumr(10); + String curTime = String.valueOf((new Date()).getTime() / 1000L); + //计算CheckSum + String checkSum = CheckSumBuilder.getCheckSum(appSecret, nonce ,curTime); + //设置请求的header + httpPost.addHeader("AppKey", appKey); + httpPost.addHeader("Nonce", nonce); + httpPost.addHeader("CurTime", curTime); + httpPost.addHeader("CheckSum", checkSum); + httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8"); + //设置请求的参数 + List nvps = new ArrayList(); + nvps.add(new BasicNameValuePair("accid", accid)); + httpPost.setEntity(new UrlEncodedFormEntity(nvps, "utf-8")); + //执行请求 + HttpResponse response = httpClient.execute(httpPost); + //执行结果 + String responseStr = EntityUtils.toString(response.getEntity(), "utf-8"); + JSONObject json = JSON.parseObject(responseStr); + String code = json.getString("code"); + Map map = new HashMap(); + map.put("code", code); + //200 + if(code.equals(NeteaseEnum.status200.getKey())){ + JSONObject infoJson = json.getJSONObject("info"); + String token = infoJson.getString("token"); + map.put("token", token); + } + else if(code.equals(NeteaseEnum.status414.getKey())){ + //String desc = json.getString("desc"); + } + return map; + } catch (Exception e) { + log.error("refreshToken error message:{},{}",accid,e.toString()); + } + return null; + } + + /** + * 更新用户信息 + * @param accid + * @return + * @throws Exception + */ + @SuppressWarnings({"resource"}) + public Map updateUinfo(String accid,String name,String icon,String ex){ + try { + DefaultHttpClient httpClient = new DefaultHttpClient(); + String url = "https://api.netease.im/nimserver/user/updateUinfo.action"; + HttpPost httpPost = new HttpPost(url); + String nonce = IfishUtil.getCharAndNumr(10); + String curTime = String.valueOf((new Date()).getTime() / 1000L); + //计算CheckSum + String checkSum = CheckSumBuilder.getCheckSum(appSecret, nonce ,curTime); + //设置请求的header + httpPost.addHeader("AppKey", appKey); + httpPost.addHeader("Nonce", nonce); + httpPost.addHeader("CurTime", curTime); + httpPost.addHeader("CheckSum", checkSum); + httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8"); + //设置请求的参数 + List nvps = new ArrayList(); + nvps.add(new BasicNameValuePair("accid", accid)); + nvps.add(new BasicNameValuePair("name", name)); + nvps.add(new BasicNameValuePair("icon", icon)); + nvps.add(new BasicNameValuePair("ex", ex)); + httpPost.setEntity(new UrlEncodedFormEntity(nvps, "utf-8")); + //执行请求 + HttpResponse response = httpClient.execute(httpPost); + //执行结果 + String responseStr = EntityUtils.toString(response.getEntity(), "utf-8"); + JSONObject json = JSON.parseObject(responseStr); + String code = json.getString("code"); + Map map = new HashMap(); + map.put("code", code); + //200 + if(code.equals(NeteaseEnum.status200.getKey())){ + + } + else if(code.equals(NeteaseEnum.status414.getKey())){ + //String desc = json.getString("desc"); + } + return map; + } catch (Exception e) { + log.error("updateUinfo error message:{},{}",accid,e.toString()); + } + return null; + } + + /** + * 获取用户信息 + * @param accid + * @return + * @throws Exception + */ + @SuppressWarnings({"resource"}) + public Map getUinfos(String accids){ + try { + DefaultHttpClient httpClient = new DefaultHttpClient(); + String url = "https://api.netease.im/nimserver/user/getUinfos.action"; + HttpPost httpPost = new HttpPost(url); + String nonce = IfishUtil.getCharAndNumr(10); + String curTime = String.valueOf((new Date()).getTime() / 1000L); + //计算CheckSum + String checkSum = CheckSumBuilder.getCheckSum(appSecret, nonce ,curTime); + //设置请求的header + httpPost.addHeader("AppKey", appKey); + httpPost.addHeader("Nonce", nonce); + httpPost.addHeader("CurTime", curTime); + httpPost.addHeader("CheckSum", checkSum); + httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8"); + //设置请求的参数 + List nvps = new ArrayList(); + nvps.add(new BasicNameValuePair("accids", accids)); + httpPost.setEntity(new UrlEncodedFormEntity(nvps, "utf-8")); + //执行请求 + HttpResponse response = httpClient.execute(httpPost); + //执行结果 + String responseStr = EntityUtils.toString(response.getEntity(), "utf-8"); + JSONObject json = JSON.parseObject(responseStr); + String code = json.getString("code"); + Map map = new HashMap(); + map.put("code", code); + //200 + if(code.equals(NeteaseEnum.status200.getKey())){ + + } + else if(code.equals(NeteaseEnum.status414.getKey())){ + //String desc = json.getString("desc"); + } + return map; + } catch (Exception e) { + log.error("getUinfos error message:{},{}",accids,e.toString()); + } + return null; + } + + /** + * 发送普通消息 + * @param from + * @param to + * @param msg + * @return + */ + @SuppressWarnings({"resource"}) + public Map sendMsg(String from,String to,String msg,String ext){ + try { + DefaultHttpClient httpClient = new DefaultHttpClient(); + String url = "https://api.netease.im/nimserver/msg/sendMsg.action"; + HttpPost httpPost = new HttpPost(url); + String nonce = IfishUtil.getCharAndNumr(10); + String curTime = String.valueOf((new Date()).getTime() / 1000L); + //计算CheckSum + String checkSum = CheckSumBuilder.getCheckSum(appSecret, nonce ,curTime); + //设置请求的header + httpPost.addHeader("AppKey", appKey); + httpPost.addHeader("Nonce", nonce); + httpPost.addHeader("CurTime", curTime); + httpPost.addHeader("CheckSum", checkSum); + httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8"); + //设置请求的参数 + List nvps = new ArrayList(); + nvps.add(new BasicNameValuePair("from", from)); + nvps.add(new BasicNameValuePair("to", to)); + nvps.add(new BasicNameValuePair("ope", "0")); + nvps.add(new BasicNameValuePair("type", "0")); + nvps.add(new BasicNameValuePair("body", "{\"msg\":\""+msg+"\"}")); + nvps.add(new BasicNameValuePair("ext", ext)); + httpPost.setEntity(new UrlEncodedFormEntity(nvps, "utf-8")); + //执行请求 + HttpResponse response = httpClient.execute(httpPost); + //执行结果 + String responseStr = EntityUtils.toString(response.getEntity(), "utf-8"); + JSONObject json = JSON.parseObject(responseStr); + String code = json.getString("code"); + Map map = new HashMap(); + map.put("code", code); + //200 + if(code.equals(NeteaseEnum.status200.getKey())){ + + } + else if(code.equals(NeteaseEnum.status414.getKey())){ + //String desc = json.getString("desc"); + } + return map; + } catch (Exception e) { + log.error("refreshToken error message:{}",e.toString()); + } + return null; + } + /** + * 批量发送点对点普通消息 + * @param fromAccid + * @param toAccids + * @param msg + * @return + */ + @SuppressWarnings({"resource"}) + public Map sendBatchMsg(String fromAccid,String toAccids,String msg){ + try { + DefaultHttpClient httpClient = new DefaultHttpClient(); + String url = "https://api.netease.im/nimserver/msg/sendBatchMsg.action"; + HttpPost httpPost = new HttpPost(url); + String nonce = IfishUtil.getCharAndNumr(10); + String curTime = String.valueOf((new Date()).getTime() / 1000L); + //计算CheckSum + String checkSum = CheckSumBuilder.getCheckSum(appSecret, nonce ,curTime); + //设置请求的header + httpPost.addHeader("AppKey", appKey); + httpPost.addHeader("Nonce", nonce); + httpPost.addHeader("CurTime", curTime); + httpPost.addHeader("CheckSum", checkSum); + httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8"); + //设置请求的参数 + List nvps = new ArrayList(); + nvps.add(new BasicNameValuePair("fromAccid", fromAccid)); + nvps.add(new BasicNameValuePair("toAccids", toAccids)); + nvps.add(new BasicNameValuePair("type", "0")); + nvps.add(new BasicNameValuePair("body", "{\"msg\":\""+msg+"\"}")); + httpPost.setEntity(new UrlEncodedFormEntity(nvps, "utf-8")); + //执行请求 + HttpResponse response = httpClient.execute(httpPost); + //执行结果 + String responseStr = EntityUtils.toString(response.getEntity(), "utf-8"); + JSONObject json = JSON.parseObject(responseStr); + String code = json.getString("code"); + Map map = new HashMap(); + map.put("code", code); + //200 + if(code.equals(NeteaseEnum.status200.getKey())){ + + } + else if(code.equals(NeteaseEnum.status414.getKey())){ + //String desc = json.getString("desc"); + } + return map; + } catch (Exception e) { + log.error("refreshToken error message:{}",e.toString()); + } + return null; + } + +} diff --git a/src/main/java/com/ifish/serializer/CustomDateSerializer.java b/src/main/java/com/ifish/serializer/CustomDateSerializer.java new file mode 100644 index 0000000..2b7d576 --- /dev/null +++ b/src/main/java/com/ifish/serializer/CustomDateSerializer.java @@ -0,0 +1,21 @@ +package com.ifish.serializer; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; + + +public class CustomDateSerializer extends JsonSerializer { + + @Override + public void serialize(Date value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + String formattedDate = formatter.format(value); + jgen.writeString(formattedDate); + } +} diff --git a/src/main/java/com/ifish/serializer/DateSerializer.java b/src/main/java/com/ifish/serializer/DateSerializer.java new file mode 100644 index 0000000..5270e5e --- /dev/null +++ b/src/main/java/com/ifish/serializer/DateSerializer.java @@ -0,0 +1,21 @@ +package com.ifish.serializer; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; + + +public class DateSerializer extends JsonSerializer { + + @Override + public void serialize(Date value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + String formattedDate = formatter.format(value); + jgen.writeString(formattedDate); + } +} diff --git a/src/main/java/com/ifish/service/AdInfoService.java b/src/main/java/com/ifish/service/AdInfoService.java new file mode 100644 index 0000000..b663b46 --- /dev/null +++ b/src/main/java/com/ifish/service/AdInfoService.java @@ -0,0 +1,21 @@ +package com.ifish.service; + +import com.ifish.dto.JsonResult; +import com.ifish.enums.AdTypeEnum; + +public interface AdInfoService { + + /** + * 更具类型获取广告位信息 + * @param adTypeEnum + * @return + */ + public JsonResult getAdInfosByType(AdTypeEnum adTypeEnum); + + /** + * 获取广告信息表最大ID + * @return + */ + public JsonResult getMaxInfo(); + +} diff --git a/src/main/java/com/ifish/service/AsyncTaskService.java b/src/main/java/com/ifish/service/AsyncTaskService.java new file mode 100644 index 0000000..1d823e3 --- /dev/null +++ b/src/main/java/com/ifish/service/AsyncTaskService.java @@ -0,0 +1,29 @@ +package com.ifish.service; + +/** + * 异步执行任务service + * @author Administrator + * + */ +public interface AsyncTaskService { + + /** + * 给所有用户发送云信消息 + * @param userId + */ + public void sendMsgToAll(Integer userId); + + /** + * 给商家和用户发送消息 + * @param userId 用户ID + * @param shopsUserId 商家用户ID + * @param nickName 用户昵称 + */ + public void sendMsgToShopsUser(Integer userId,Integer shopsUserId,String nickName); + /** + * 新增用户动态 + * @param userId + * @param activityType + */ + public void saveUserActivity(Integer userId,String activityType); +} diff --git a/src/main/java/com/ifish/service/BaseService.java b/src/main/java/com/ifish/service/BaseService.java new file mode 100644 index 0000000..4a390e9 --- /dev/null +++ b/src/main/java/com/ifish/service/BaseService.java @@ -0,0 +1,138 @@ +package com.ifish.service; + +import org.springframework.web.multipart.MultipartFile; + +import com.ifish.entity.CameraUserId; +import com.ifish.entity.Device; +import com.ifish.entity.DeviceUser; +import com.ifish.entity.QuestionsFeedback; +import com.ifish.entity.ShopsInfo; +import com.ifish.entity.User; + +/** + * @ClassName: BaseService + * @Description: TODO + * @author ggw + * + */ +public interface BaseService { + + //获取手机验证码 + @Deprecated + public Object getSecurityCode(String phoneNumber,String sendType); + + //发送手机验证码 + @Deprecated + public Object sendSecurityCode(String phoneNumber,String smsSign,String smsTemplate); + + //更新用户信息 + @Deprecated + public Object updateInfo(User user); + + //原密码验证后更新用户密码 + public Object updatePwd(User user,String oldPassword); + + //短信验证后重置密码 + public Object resetPassword(User user); + + //登录验证 + @Deprecated + public Object login(User user); + + //保存用户 + @Deprecated + public Object save(User user); + + //根据ID查用户 + public User findById(Integer userId); + + //绑定设备 + @Deprecated + public Object bindDevice(User user,String madAddress); + + //绑定摄像头 + public Object bindCamera(Integer userId,String cameraId); + + //激活摄像头 + public Object activeCamera(String activeCode,String cameraId); + + //设备和摄像头关联 + public Object deviceBindCamera1(Integer userId,Integer deviceId,String cameraId); + + //设备和摄像头关联 + public Object deviceBindCamera(Integer deviceId,String cameraId); + + //获取单个设备信息 + public Object getSingleDeviceInf(DeviceUser deviceUser); + + //修改设备信息 + public Object update(DeviceUser deviceUser); + + //修改摄像头信息 + public Object update(CameraUserId id,String showName); + + //修改设备信息 + public Object updateCustomIcon(DeviceUser deviceUser); + + //删除绑定的设备 + public Object deleteDeviceUser(DeviceUser deviceUser); + + //删除绑定的摄像头 + public Object deleteCameraUser(Integer userId,String cameraId); + + //删除设备和摄像头关联 + public Object deleteDeviceCamera(Integer deviceId,String cameraId); + + //扫一扫分享设备 + @Deprecated + public Object shareDeviceByQrCode(Integer userId,Integer deviceId); + + //获取最新版本信息 + public Object getNewestVersionInf(String phoneType); + + //上传头像 + @Deprecated + public Object uploadFile(User user,MultipartFile fileUpload); + + //新增问题反馈 + @Deprecated + public Object saveQuestionsFeedback(QuestionsFeedback feedback); + + //获取换水提醒信息 + public Object getRemindWaterInf(Integer deviceId); + + //设置换水提醒 + public Object setRemindWaterInf(Device device); + + //保存商家信息 + public Object saveShopsInfo(ShopsInfo shopsInfo,MultipartFile file1,MultipartFile file2,MultipartFile file3); + + //审核失败后修改商家信息 + public Object updateShopsInfo(ShopsInfo shopsInfo,MultipartFile file1,MultipartFile file2,MultipartFile file3); + + //审核成功后修改商家信息 + public Object updateBaseShopsInfo(ShopsInfo shopsInfo,MultipartFile file4); + + //获取审核状态 + public Object getShopsStatus(Integer shopsId); + + //选择商家 + public Object choiceShops(String phoneNumber,Integer userId); + + //关闭看护摄像头 + public Object onoffLook(String cameraId,Integer userId,String status); + + //生成看护报告 + public Object lookReport(Integer userId,String index1,String index2,String index3,String suggestion,MultipartFile fileUpload); + + //发送看护报告给用户 + @Deprecated + public Object sendReport(Integer userId,String fileName); + + //发送看护报告给用户 + public Object sendReport(Integer userId,String fileName,Integer reportId); + + //发送看护报告给用户 + public Object getLookReportById(Integer reportId); + +} diff --git a/src/main/java/com/ifish/service/CacheService.java b/src/main/java/com/ifish/service/CacheService.java new file mode 100644 index 0000000..626ad0a --- /dev/null +++ b/src/main/java/com/ifish/service/CacheService.java @@ -0,0 +1,85 @@ +package com.ifish.service; + +import java.util.List; + +import com.alibaba.fastjson.JSONObject; +import com.ifish.entity.AdInfo; +import com.ifish.entity.GoldTask; +import com.ifish.entity.Grade; +import com.ifish.entity.GradeTask; +import com.ifish.entity.HardwareType; +import com.ifish.entity.IfishGoods; +import com.ifish.entity.VenderList; + +/** + * @ClassName: CacheService + * @Description: TODO + * @author ggw + * + */ +public interface CacheService { + + /** + * 获取资讯信息 + * @return + */ + public List getInformation(); + + /** + * 获取等级信息 + * @return + */ + public List getGradeList(); + + /** + * 获取等级规则 + * @return + */ + public GradeTask getGradeRule(String id); + + /** + * 获取金币规则 + * @return + */ + public GoldTask getGoldRule(String id); + + /** + * 获取等级规则list + * @return + */ + public List getGradeRuleList(); + + /** + * 获取金币规则list + * @return + */ + public List getGoldRuleList(); + + /** + * 根据ID查询电子厂 + * @param key + * @return + */ + public VenderList findVenderListById(String id); + + /** + * 根据ID获取硬件类型 + * @param key + * @return + */ + public HardwareType findHardwareTypeById(String id); + + /** + * 广告位信息 + * @param adType + * @return + */ + public List getAdInfoList(int adType); + + /** + * 商品信息 + * @param goodsPlace + * @return + */ + public List getIfishGoodsList(int goodsPlace); +} diff --git a/src/main/java/com/ifish/service/CameraService.java b/src/main/java/com/ifish/service/CameraService.java new file mode 100644 index 0000000..99ccee3 --- /dev/null +++ b/src/main/java/com/ifish/service/CameraService.java @@ -0,0 +1,10 @@ +package com.ifish.service; + + +/** + * @author guogw + * + */ +public interface CameraService { + +} diff --git a/src/main/java/com/ifish/service/CouponService.java b/src/main/java/com/ifish/service/CouponService.java new file mode 100644 index 0000000..a4e84e2 --- /dev/null +++ b/src/main/java/com/ifish/service/CouponService.java @@ -0,0 +1,33 @@ +package com.ifish.service; + +import com.ifish.dto.JsonResult; +import com.ifish.dto.PageingDto; +import com.ifish.validator.PageParam; + +/** + * 优惠券 + * @author Administrator + * + */ +public interface CouponService { + + /** + * 获取所有可兑换优惠券 + * @return + */ + JsonResult getAllValidCoupon(); + /** + * 兑换优惠券 + * @param userId + * @param couponId + * @return + */ + JsonResult exchangeCoupon(Integer userId,Integer couponId); + /** + * 分页获取兑换记录 + * @param param + * @return + */ + PageingDto getCouponRecordByPage(PageParam param); + +} diff --git a/src/main/java/com/ifish/service/GoldService.java b/src/main/java/com/ifish/service/GoldService.java new file mode 100644 index 0000000..5bb5040 --- /dev/null +++ b/src/main/java/com/ifish/service/GoldService.java @@ -0,0 +1,63 @@ +package com.ifish.service; + +import java.math.BigDecimal; + +import com.ifish.dto.JsonResult; +import com.ifish.dto.PageingDto; +import com.ifish.dto.UserAssetDto; +import com.ifish.entity.UserAsset; +import com.ifish.validator.AddValueParam; +import com.ifish.validator.PageParam; + +public interface GoldService { + + /** + * 返回信息封装 + * @param userAsset + * @param addValue + * @param today + * @param yesterday + * @return + */ + public UserAssetDto getUserAssetInfo(UserAsset userAsset,BigDecimal addValue,String today,String yesterday); + /** + * 增加金币 + * @param addValueParam + * @return + */ + public JsonResult addGoldValue(AddValueParam addValueParam); + /** + * 签到 + * @return + */ + public JsonResult signin(Integer userId); + + /** + * 砸金蛋 + * @param userId + * @return + */ + public JsonResult hitGoldenEgg(Integer userId); + + /** + * 金币获取记录 + * @param pageParam + * @return + */ + public PageingDto getGoldGetRecordByPage(PageParam pageParam); + + /** + * 今天消耗记录 + * @param pageParam + * @return + */ + public PageingDto getGoldExpendRecordByPage(PageParam pageParam); + /** + * 爱鱼看看打赏 + * @param userId 打赏人用户ID + * @param userId2 被打赏人用户ID + * @return + */ + public JsonResult liveRoomReward(Integer userId,Integer userId2); + +} diff --git a/src/main/java/com/ifish/service/GradeService.java b/src/main/java/com/ifish/service/GradeService.java new file mode 100644 index 0000000..6d99cde --- /dev/null +++ b/src/main/java/com/ifish/service/GradeService.java @@ -0,0 +1,46 @@ +package com.ifish.service; + +import com.ifish.dto.JsonResult; +import com.ifish.dto.PageingDto; +import com.ifish.dto.UserAssetDto; +import com.ifish.entity.GradeTask; +import com.ifish.entity.UserAsset; +import com.ifish.validator.AddValueParam; +import com.ifish.validator.PageParam; + + +/** + * 等级 + * @author Administrator + * + */ +public interface GradeService { + + /** + * 是否加过经验 + * @param userAsset + * @param gradeRule + * @return + */ + public UserAssetDto getGradeControl(UserAsset userAsset, GradeTask gradeRule, boolean isLogin); + /** + * 增加经验值 + * @param addValueParam + * @return + */ + public JsonResult addGradeValue(AddValueParam addValueParam); + + /** + * @param userId + * @return + */ + public JsonResult getGradeRuleInfo(Integer userId); + + /** + * 获取经验记录 + * @param pageParam + * @return + */ + public PageingDto getGradeRecordByPage(PageParam pageParam); + +} diff --git a/src/main/java/com/ifish/service/IfishDoctorService.java b/src/main/java/com/ifish/service/IfishDoctorService.java new file mode 100644 index 0000000..ddb6bf6 --- /dev/null +++ b/src/main/java/com/ifish/service/IfishDoctorService.java @@ -0,0 +1,25 @@ +package com.ifish.service; + +import com.ifish.dto.JsonResult; +import com.ifish.entity.IfishDoctor; + + +/** + * @author guogw + * + */ +public interface IfishDoctorService { + + /** + * 提交问题 + * @param ifishDoctor + * @return + */ + public Object saveIfishDoctor(IfishDoctor ifishDoctor); + + /** + * 金币打赏提交问题 + */ + public JsonResult payTourSubmitQuestion(IfishDoctor ifishDoctor,String payTour); + +} diff --git a/src/main/java/com/ifish/service/IfishGoodsService.java b/src/main/java/com/ifish/service/IfishGoodsService.java new file mode 100644 index 0000000..232f708 --- /dev/null +++ b/src/main/java/com/ifish/service/IfishGoodsService.java @@ -0,0 +1,26 @@ +package com.ifish.service; + +import com.ifish.dto.JsonResult; +import com.ifish.enums.IfishShopPlaceEnum; + +/** + * 商铺管理service + * @author Administrator + * + */ +public interface IfishGoodsService { + + /** + * 根据展示位置获取商品 + * @param shopPlaceEnum + * @return + */ + public JsonResult getIfishGoodsByGoodsPlace(IfishShopPlaceEnum shopPlaceEnum); + + /** + * 增加点击数 + * @param goodsId + */ + public JsonResult addClickNum(Integer goodsId); + +} diff --git a/src/main/java/com/ifish/service/InformationService.java b/src/main/java/com/ifish/service/InformationService.java new file mode 100644 index 0000000..fb8c930 --- /dev/null +++ b/src/main/java/com/ifish/service/InformationService.java @@ -0,0 +1,55 @@ +package com.ifish.service; + +import java.util.Map; + +import com.ifish.dto.JsonResult; +import com.ifish.dto.PageingDto; +import com.ifish.entity.Comment; +import com.ifish.entity.Ueditor; +import com.ifish.validator.PageParam; + + +/** + * @author guogw + * + */ +public interface InformationService { + + /** + * 保存评论 + * @param comment + * @return + */ + public Object saveComment(Comment comment); + + /** + * 查询资讯信息 + * @param ueditorId + * @return + */ + public Ueditor findUeditorById(Integer ueditorId); + + /** + * 分页获取评论 + * @param ueditorId + * @param firstResult + * @param pageSize + * @return + */ + public Map findCommentsByUeditorId(Integer ueditorId,Integer firstResult,Integer pageSize); + + /** + * 分页获取资讯 + * @param pageParam + * @return + */ + public PageingDto getInformationsByPage(PageParam pageParam); + + + /** + * 加点击数 + * @param infoId + * @return + */ + public JsonResult addClickNum(Integer infoId); +} diff --git a/src/main/java/com/ifish/service/LiveRoomService.java b/src/main/java/com/ifish/service/LiveRoomService.java new file mode 100644 index 0000000..5583c3f --- /dev/null +++ b/src/main/java/com/ifish/service/LiveRoomService.java @@ -0,0 +1,74 @@ +package com.ifish.service; + +import java.util.List; + +import com.alibaba.fastjson.JSONObject; +import com.ifish.dto.JsonResult; +import com.ifish.dto.PageingDto; +import com.ifish.entity.LiveBanner; +import com.ifish.entity.LiveMessage; +import com.ifish.validator.LiveRoomParam; +import com.ifish.validator.PageParam; + +/** + * @author guogw + * + */ +public interface LiveRoomService { + + /** + * 新增直播间 + * @param liveRoomParam + * @return + */ + public JSONObject addLiveRoom(LiveRoomParam liveRoomParam); + + //修改直播信息 + public JsonResult updateLiveRoom(Integer roomId,LiveRoomParam liveRoomParam); + + //人气值 + public Object popularityValue(Integer roomId,Integer userId); + + //获取直播间信息 + public Object getLiveRoomInfo(Integer userId); + + //直播间列表 + public Object getLiveRoomsByPage(Integer firstResult,Integer pageSize,Integer userId,String orders); + + //banner图信息 + public List getLiveBanners(); + + //提交留言 + public Object leaveMessage(LiveMessage liveMessage); + + //直播间留言列表 + public Object getLiveMessageByPage(Integer firstResult,Integer pageSize,Integer roomId); + + /** + * 按时间倒序分页获取直播间信息 + * @param pageParam + * @return + */ + public PageingDto getLiveRoomsByTime(PageParam pageParam); + /** + * 按人气值倒序分页获取直播间信息 + * @param pageParam + * @return + */ + public PageingDto getLiveRoomsByPopularityValue(PageParam pageParam); + /** + * 按推荐顺序分页获取直播间信息 + * @param pageParam + * @return + */ + public PageingDto getLiveRoomsByTuijian(PageParam pageParam); + + /** + * 直播间点赞 + * @param roomId + * @param userId + * @return + */ + public JsonResult liveRoomsZan(Integer roomId,Integer userId); + +} diff --git a/src/main/java/com/ifish/service/PageListService.java b/src/main/java/com/ifish/service/PageListService.java new file mode 100644 index 0000000..9c09644 --- /dev/null +++ b/src/main/java/com/ifish/service/PageListService.java @@ -0,0 +1,22 @@ +package com.ifish.service; + +import com.ifish.dto.ShopsLookUserDto; +import com.ifish.entity.PushList; +import com.ifish.hibernate.Pagination; + + +/** + * @ClassName: PageListService + * @Description: TODO + * @author ggw + * + */ +public interface PageListService { + + //推送分页数据 + public Pagination getPushListByPage(Integer pushId,Integer userId,Integer firstResult,Integer pageSize); + + //看护列表 + public Pagination getLookListByPage(Integer shopsUserId,Integer firstResult,Integer pageSize); + +} diff --git a/src/main/java/com/ifish/service/ShopsService.java b/src/main/java/com/ifish/service/ShopsService.java new file mode 100644 index 0000000..59a50a2 --- /dev/null +++ b/src/main/java/com/ifish/service/ShopsService.java @@ -0,0 +1,71 @@ +package com.ifish.service; + +import org.springframework.web.multipart.MultipartFile; + +import com.ifish.dto.JsonResult; +import com.ifish.dto.PageingDto; +import com.ifish.entity.ShopsInfo; +import com.ifish.validator.PageParam; +import com.ifish.validator.ShopsUserInfoParam; + + +/** + * @author guogw + * + */ +public interface ShopsService { + + //保存商家信息 + public Object saveShopsInfo(ShopsInfo shopsInfo,MultipartFile file1,MultipartFile file2,MultipartFile file3); + + //审核失败后修改商家信息 + public Object updateShopsInfo(ShopsInfo shopsInfo,MultipartFile file1,MultipartFile file2,MultipartFile file3); + + //审核成功后修改商家信息 + public Object updateBaseShopsInfo(ShopsInfo shopsInfo,MultipartFile file4); + + //获取审核状态 + public Object getShopsStatus(Integer shopsId); + + //看护商家列表 + public Object getShopsInfoByPage(Integer userId,Integer firstResult,Integer pageSize); + + //选择看护商家 + public Object choiceShops(Integer shopsUserId,Integer userId); + + //解除看护关系 + public Object removeLook(Integer userId); + + /** + * 获取商家会员信息 + * @param userId + * @param shopsId + * @return + */ + public JsonResult getShopsUserInfoById(Integer userId,Integer shopsId); + + /** + * 更新商家会员信息 + * @param userId + * @param shopsId + * @param param + * @return + */ + public JsonResult updateShopsUserInfo(Integer userId,Integer shopsId,ShopsUserInfoParam param); + + /** + * 分页获取商家会员信息 + * @param shopsId + * @param pageParam + * @return + */ + public PageingDto getShopsUserInfoByPage(Integer shopsId,PageParam pageParam); + + /** + * 成为商家用户 + * @param userId + * @param shopsId + * @return + */ + public JsonResult becomeShopsUser(Integer userId,Integer shopsId); +} diff --git a/src/main/java/com/ifish/service/UserActivityService.java b/src/main/java/com/ifish/service/UserActivityService.java new file mode 100644 index 0000000..9093fe2 --- /dev/null +++ b/src/main/java/com/ifish/service/UserActivityService.java @@ -0,0 +1,22 @@ +package com.ifish.service; + +import com.ifish.dto.PageingDto; +import com.ifish.validator.PageParam; + +/** + * 用户动态 + * + * @author Administrator + * + */ +public interface UserActivityService { + + /** + * 分页获取动态 + * + * @param pageSize + * @param firstResult + * @return + */ + PageingDto getUserActivityByPage(Integer pageSize, Integer firstResult); +} diff --git a/src/main/java/com/ifish/service/UserService.java b/src/main/java/com/ifish/service/UserService.java new file mode 100644 index 0000000..8644488 --- /dev/null +++ b/src/main/java/com/ifish/service/UserService.java @@ -0,0 +1,83 @@ +package com.ifish.service; + +import org.springframework.web.multipart.MultipartFile; + +import com.ifish.dto.JsonResult; +import com.ifish.entity.User; +import com.ifish.validator.LoginParam; +import com.ifish.validator.RegisterParam; + +/** + * @ClassName: UserService + * @Description: TODO + * @author ggw + * + */ +public interface UserService { + + /** + * 获取手机验证码 + * @param phoneNumber + * @param sendType + * @return + */ + public JsonResult getVerificateCode(String phoneNumber,String sendType); + + /** + * 登录 + * @param loginParam + * @return + */ + @Deprecated + public JsonResult login(LoginParam loginParam); + + /** + * 优化后登录验证 + * @param loginParam + * @return + */ + public JsonResult loginValidate(LoginParam loginParam); + + /** + * 更多用户数据信息 + * @param userId + * @return + */ + public JsonResult moreUserData(Integer userId); + /** + * 绑定设备 + * @param userId + * @param macAddress + * @return + */ + public JsonResult bindDevice(Integer userId,String macAddress); + /** + * 扫一扫分享设备 + * @param userId + * @param deviceId + * @return + */ + public JsonResult shareDevice(Integer userId,Integer deviceId); + /** + * 注册 + * @param registerParam + * @return + */ + public JsonResult register(RegisterParam registerParam); + + /** + * 修改用户信息 + * @param user + * @return + */ + public JsonResult updateInfo(User user); + + /** + * 上传头像 + * @param userId + * @param fileUpload + * @return + */ + public JsonResult uploadUserImg(Integer userId,MultipartFile fileUpload); + +} diff --git a/src/main/java/com/ifish/serviceImpl/AdInfoServiceImpl.java b/src/main/java/com/ifish/serviceImpl/AdInfoServiceImpl.java new file mode 100644 index 0000000..e7c4ef0 --- /dev/null +++ b/src/main/java/com/ifish/serviceImpl/AdInfoServiceImpl.java @@ -0,0 +1,59 @@ +package com.ifish.serviceImpl; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.ifish.dto.AdInfoDto; +import com.ifish.dto.JsonResult; +import com.ifish.entity.AdInfo; +import com.ifish.enums.AdTypeEnum; +import com.ifish.enums.SubDirectoryEnum; +import com.ifish.mapper.Tbl_Ad_Info_Mapper; +import com.ifish.service.AdInfoService; +import com.ifish.service.CacheService; +import com.ifish.util.IfishFilePath; +import com.ifish.util.ResultUtil; + +/** + * 广告位信息 + * + * @author Administrator + * + */ +@Service +@Transactional +public class AdInfoServiceImpl implements AdInfoService { + + @Autowired + private CacheService cacheService; + + @Autowired + private Tbl_Ad_Info_Mapper tbl_Ad_Info_Mapper; + + /** + * 根据类型获取广告信息 + */ + @Override + public JsonResult getAdInfosByType(AdTypeEnum adTypeEnum) { + //根据类型查询广告 + List adInfos = cacheService.getAdInfoList(adTypeEnum.getKey()); + //封装广告信息并返回 + List dtoList = new ArrayList(); + for (AdInfo adInfo : adInfos) { + AdInfoDto dto = new AdInfoDto(adInfo.getAdId(), adInfo.getAdType(), IfishFilePath.getPath(SubDirectoryEnum.adInfo, adInfo.getAdImage()), adInfo.getAdLink(), adInfo.getOrderNum()); + dtoList.add(dto); + } + return ResultUtil.success(dtoList); + } + + @Override + public JsonResult getMaxInfo() { + Integer ad_id = tbl_Ad_Info_Mapper.getMaxInfo(); + return ResultUtil.success(ad_id); + } + +} diff --git a/src/main/java/com/ifish/serviceImpl/AsyncTaskServiceImpl.java b/src/main/java/com/ifish/serviceImpl/AsyncTaskServiceImpl.java new file mode 100644 index 0000000..d86852c --- /dev/null +++ b/src/main/java/com/ifish/serviceImpl/AsyncTaskServiceImpl.java @@ -0,0 +1,100 @@ +package com.ifish.serviceImpl; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.alibaba.fastjson.JSONArray; +import com.ifish.dao.UserActivityDao; +import com.ifish.dao.UserDao; +import com.ifish.entity.User; +import com.ifish.entity.UserActivity; +import com.ifish.enums.ActivityTypeEnum; +import com.ifish.netease.NeteaseIM; +import com.ifish.service.AsyncTaskService; +import com.ifish.util.IfishFilePath; +import java.util.Date; + +/** + * 异步执行任务service + * + * @author Administrator + * + */ +@Service +@Async +@Transactional +public class AsyncTaskServiceImpl implements AsyncTaskService { + + @Autowired + private UserDao userDao; + @Autowired + private NeteaseIM neteaseIM; + @Autowired + private UserActivityDao userActivityDao; + + /** + * 分享爱鱼看看后给所有用户发送云信消息 + */ + @Override + public void sendMsgToAll(Integer userId) { + Integer firstResult = 0; + Integer maxResults = 500; + User user = userDao.get(userId); + if (user != null) { + String content = user.getNickName() + "刚在爱鱼看看分享了TA的爱鱼,快去瞅瞅~"; + while (true) { + List list = userDao.getUserIds(userId, firstResult, maxResults); + Integer size = list.size(); + if (size <= 0) { + break; + } else { + firstResult += size; + //批量发送 + neteaseIM.sendBatchMsg(IfishFilePath.ifish_account, JSONArray.toJSONString(list), content); + //云信接口有访问限制,延迟600毫秒发送 + try { + Thread.sleep(600); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + } + } + + /** + * 给商家和用户发送消息 + */ + @Override + public void sendMsgToShopsUser(Integer userId, Integer shopsUserId, String nickName) { + //爱鱼奇消息主手给商家发送消息 + String msg1 = "恭喜你," + nickName + "已成为你的会员,快去会员管理中看看吧~"; + neteaseIM.sendMsg(IfishFilePath.ifish_account, shopsUserId.toString(), msg1, null); + //商家发送消息给用户 + String msg2 = "恭喜你成为本店会员,有什么疑问,都可以随时联系我。"; + neteaseIM.sendMsg(shopsUserId.toString(), userId.toString(), msg2, null); + } + + /** + * 新增用户动态 + * + * @param userId + * @param activityType + */ + @Override + public void saveUserActivity(Integer userId, String activityType) { + //是否有这个动态类型 + if (ActivityTypeEnum.getValueByKey(activityType)) { + UserActivity activity = new UserActivity(); + activity.setUserId(userId); + activity.setActivityType(activityType); + activity.setCreateTime(new Date()); + userActivityDao.save(activity); + } + } + +} diff --git a/src/main/java/com/ifish/serviceImpl/BaseServiceImpl.java b/src/main/java/com/ifish/serviceImpl/BaseServiceImpl.java new file mode 100644 index 0000000..cefec68 --- /dev/null +++ b/src/main/java/com/ifish/serviceImpl/BaseServiceImpl.java @@ -0,0 +1,1544 @@ +package com.ifish.serviceImpl; + +import java.io.File; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; + +import org.hibernate.criterion.Restrictions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import com.alibaba.fastjson.JSON; +import com.ifish.dao.CameraActiveDao; +import com.ifish.dao.CameraDao; +import com.ifish.dao.CameraUserDao; +import com.ifish.dao.DeviceCameraDao; +import com.ifish.dao.DeviceDao; +import com.ifish.dao.DeviceUserDao; +import com.ifish.dao.HardwareTypeDao; +import com.ifish.dao.LookReportDao; +import com.ifish.dao.PushListDao; +import com.ifish.dao.QuestionsFeedbackDao; +import com.ifish.dao.ShopsInfoDao; +import com.ifish.dao.UserDao; +import com.ifish.dao.VenderListDao; +import com.ifish.dao.VersionDao; +import com.ifish.entity.Camera; +import com.ifish.entity.CameraActive; +import com.ifish.entity.CameraUser; +import com.ifish.entity.CameraUserId; +import com.ifish.entity.Device; +import com.ifish.entity.DeviceCamera; +import com.ifish.entity.DeviceCameraId; +import com.ifish.entity.DeviceUser; +import com.ifish.entity.HardwareType; +import com.ifish.entity.LookReport; +import com.ifish.entity.DeviceUserId; +import com.ifish.entity.PushList; +import com.ifish.entity.QuestionsFeedback; +import com.ifish.entity.ShopsInfo; +import com.ifish.entity.User; +import com.ifish.entity.VenderList; +import com.ifish.entity.Version; +import com.ifish.enums.BooleanEnum; +import com.ifish.enums.GwellEnum; +import com.ifish.enums.Index1Enum; +import com.ifish.enums.Index2Enum; +import com.ifish.enums.Index3Enum; +import com.ifish.enums.NeteaseEnum; +import com.ifish.enums.PushTypeEnum; +import com.ifish.enums.ResultEnum; +import com.ifish.enums.SendTypeEnum; +import com.ifish.enums.ShopsStatusEnum; +import com.ifish.enums.SmsSignEnum; +import com.ifish.enums.SmsTemplateEnum; +import com.ifish.enums.SubDirectoryEnum; +import com.ifish.enums.UserTypeEnum; +import com.ifish.gwell.GwellApi; +import com.ifish.jpush.SmsNumSend; +import com.ifish.mail.Mail; +import com.ifish.netease.NeteaseIM; +import com.ifish.service.BaseService; +import com.ifish.util.IfishFilePath; +import com.ifish.util.IfishUtil; + +/** + * @ClassName: BaseServiceImpl + * @Description: TODO + * @author ggw + * + */ +@Service +@Transactional +public class BaseServiceImpl implements BaseService { + + @Autowired + private NeteaseIM neteaseIM; + @Autowired + private SmsNumSend smsNumSend; + @Autowired + private UserDao userDao; + @Autowired + private CameraDao cameraDao; + @Autowired + private DeviceDao deviceDao; + @Autowired + private VersionDao versionDao; + @Autowired + private PushListDao pushListDao; + @Autowired + private LookReportDao lookReportDao; + @Autowired + private ShopsInfoDao shopsInfoDao; + @Autowired + private DeviceUserDao deviceUserDao; + @Autowired + private CameraActiveDao cameraActiveDao; + @Autowired + private VenderListDao venderListDao; + @Autowired + private CameraUserDao cameraUserDao; + @Autowired + private DeviceCameraDao deviceCameraDao; + @Autowired + private HardwareTypeDao hardwareTypeDao; + @Autowired + private QuestionsFeedbackDao questionsFeedbackDao; + + /** + * 获取验证码 + */ + @Override + public Object getSecurityCode(String phoneNumber, String sendType) { + User user = this.userDao.findUniqueByProperty(Restrictions.eq("phoneNumber", phoneNumber)); + //注册 + if (sendType.equals(SendTypeEnum.register.getKey())) { + if (user != null) { + //手机号注册过,发送错误码 + return IfishUtil.returnJson(ResultEnum.warn201.getKey(), ""); + } else { + //手机未被注册,获取验证码 + return sendSecurityCode(phoneNumber, SmsSignEnum.sign4.getValue(), SmsTemplateEnum.SMS_720018.getKey()); + } + } //找回密码 + else if (sendType.equals(SendTypeEnum.findpwd.getKey())) { + if (user != null) { + //手机号存在,获取验证码 + return sendSecurityCode(phoneNumber, SmsSignEnum.sign5.getValue(), SmsTemplateEnum.SMS_720021.getKey()); + } else { + //手机号不存在,发送错误码 + return IfishUtil.returnJson(ResultEnum.warn202.getKey(), ""); + } + } else { + //未知操作,返回错误码 + return IfishUtil.returnJson(ResultEnum.warn203.getKey(), ""); + } + } + + /** + * 发送验证码 + */ + @Override + public Object sendSecurityCode(String phoneNumber, String smsSign, String smsTemplate) { + Integer code = (int) (Math.random() * 9000 + 1000); + boolean bln = smsNumSend.sendSmsNum(phoneNumber, code.toString(), smsSign, smsTemplate); + //发送验证码 + if (bln) { + return IfishUtil.returnJson(ResultEnum.success.getKey(), code.toString()); + } else { + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + } + + /** + * 登录 + */ + @Override + public Object login(User user) { + //验证用户是否存在,不存在返回错误信息 + User tmpUser = this.userDao.findUniqueByProperty(Restrictions.eq("phoneNumber", user.getPhoneNumber())); + if (tmpUser == null) { + //用户不存在 + return IfishUtil.returnJson(ResultEnum.warn202.getKey(), ""); + } else if (tmpUser.getUserPassword().equals(user.getUserPassword())) { + //是否更新 + boolean isUpdate = false; + //未注册技威,则注册获取code1,code2 + if (tmpUser.getIsRegisterGwell().equals(BooleanEnum.NO.getKey())) { + //注册技威 + Map map = GwellApi.Register(user.getPhoneNumber()); + String result = map.get("result"); + if (result != null) { + //注册成功 + if (result.equals(GwellEnum.success.getKey())) { + String P2PVerifyCode1 = map.get("P2PVerifyCode1"); + String P2PVerifyCode2 = map.get("P2PVerifyCode2"); + String gwellUserID = map.get("UserID"); + tmpUser.setIsRegisterGwell(BooleanEnum.YES.getKey()); + tmpUser.setP2PVerifyCode1(P2PVerifyCode1); + tmpUser.setP2PVerifyCode2(P2PVerifyCode2); + tmpUser.setGwellUserID(gwellUserID); + isUpdate = true; + } //已经注册过 + else if (GwellEnum.repeat.getKey().equals(result)) { + tmpUser.setIsRegisterGwell(BooleanEnum.YES.getKey()); + isUpdate = true; + } + } + } //已经注册过技威 + else if (tmpUser.getIsRegisterGwell().equals(BooleanEnum.YES.getKey())) { + //code1和code2为空则重新登陆获取 + String P2PVerifyCode1 = tmpUser.getP2PVerifyCode1(); + String P2PVerifyCode2 = tmpUser.getP2PVerifyCode2(); + String gwellUserID = tmpUser.getGwellUserID(); + if (P2PVerifyCode1.equals("") || P2PVerifyCode2.equals("") || gwellUserID.equals("")) { + Map map = GwellApi.Login(user.getPhoneNumber()); + String result = map.get("result"); + //登陆成功 + if (result != null && result.equals(GwellEnum.success.getKey())) { + P2PVerifyCode1 = map.get("P2PVerifyCode1"); + P2PVerifyCode2 = map.get("P2PVerifyCode2"); + gwellUserID = map.get("UserID"); + tmpUser.setP2PVerifyCode1(P2PVerifyCode1); + tmpUser.setP2PVerifyCode2(P2PVerifyCode2); + tmpUser.setGwellUserID(gwellUserID); + isUpdate = true; + } + } + } + //未注册云信 + if (tmpUser.getIsRegisterNetease().equals(BooleanEnum.NO.getKey())) { + //注册云信 + Map map = neteaseIM.createAccid(tmpUser.getUserId().toString(), tmpUser.getNickName(), IfishFilePath.getPath(SubDirectoryEnum.headImage, tmpUser.getUserImg()), ""); + if (map != null) { + String code = map.get("code"); + if (code.equals(NeteaseEnum.status200.getKey())) { + tmpUser.setIsRegisterNetease(BooleanEnum.YES.getKey()); + tmpUser.setNeteaseToken(map.get("token")); + isUpdate = true; + //发送云信消息 + User imUser = this.userDao.findUniqueByProperty(Restrictions.eq("phoneNumber", IfishFilePath.netease_phone)); + if (imUser != null) { + neteaseIM.sendMsg(imUser.getUserId().toString(), tmpUser.getUserId().toString(), "感谢您使用爱鱼奇,连接智能设备请查看下方说明书,内含操作视频:http://u.eqxiu.com/s/KmmVl87l \n摄像头售后:021-54131006\n睿芯插排售后:15757401229\n绚多插排售后:18857689069\n松诺插排售后:13392205468", ""); + } + } else if (code.equals(NeteaseEnum.status414.getKey())) { + tmpUser.setIsRegisterNetease(BooleanEnum.YES.getKey()); + isUpdate = true; + } + } + } //已注册云信 + else if (tmpUser.getIsRegisterNetease().equals(BooleanEnum.YES.getKey())) { + //token为空 + if (tmpUser.getNeteaseToken().equals("")) { + //获取云信token + Map map = neteaseIM.refreshToken(tmpUser.getUserId().toString()); + if (map != null) { + String code = map.get("code"); + if (code.equals(NeteaseEnum.status200.getKey())) { + tmpUser.setNeteaseToken(map.get("token")); + isUpdate = true; + } + } + } + } + //更新登陆参数 + userDao.executeLoginUpdate(tmpUser.getUserId(), tmpUser.getLoginType()); + if (isUpdate) { + this.userDao.update(tmpUser); + } + //登录成功,返回给App数据 + Map userMap = new HashMap(); + userMap.put("userId", tmpUser.getUserId().toString()); + userMap.put("phoneNumber", tmpUser.getPhoneNumber()); + userMap.put("nickName", tmpUser.getNickName()); + userMap.put("userSex", tmpUser.getUserSex()); + userMap.put("signature", tmpUser.getSignature()); + userMap.put("userImg", tmpUser.getUserImg()); + userMap.put("P2PVerifyCode1", tmpUser.getP2PVerifyCode1()); + userMap.put("P2PVerifyCode2", tmpUser.getP2PVerifyCode2()); + userMap.put("gwellUserID", tmpUser.getGwellUserID()); + userMap.put("neteaseToken", tmpUser.getNeteaseToken()); + userMap.put("userType", tmpUser.getUserType()); + userMap.put("shopsUserId", tmpUser.getShopsUserId()); + if (tmpUser.getUpdateTime() != null) { + userMap.put("updateTime", IfishUtil.format(tmpUser.getUpdateTime())); + } + //自己的商家对象 + Map shopsInfoMap = new HashMap(); + if (tmpUser.getUserId() != null) { + ShopsInfo shopsInfo = this.shopsInfoDao.findUniqueByProperty(Restrictions.eq("userId", tmpUser.getUserId())); + if (shopsInfo != null) { + shopsInfoMap.put("shopsId", shopsInfo.getShopsId()); + shopsInfoMap.put("userId", shopsInfo.getUserId()); + shopsInfoMap.put("userImg", tmpUser.getUserImg()); + shopsInfoMap.put("userName", shopsInfo.getUserName()); + shopsInfoMap.put("shopsName", shopsInfo.getShopsName()); + shopsInfoMap.put("shopsPhone", shopsInfo.getShopsPhone()); + shopsInfoMap.put("shopsProvince", shopsInfo.getShopsProvince()); + shopsInfoMap.put("shopsCity", shopsInfo.getShopsCity()); + shopsInfoMap.put("shopsArea", shopsInfo.getShopsArea()); + shopsInfoMap.put("shopsAddress", shopsInfo.getShopsAddress()); + shopsInfoMap.put("picture1", shopsInfo.getPicture1()); + shopsInfoMap.put("picture2", shopsInfo.getPicture2()); + shopsInfoMap.put("picture3", shopsInfo.getPicture3()); + shopsInfoMap.put("picture4", shopsInfo.getPicture4()); + shopsInfoMap.put("status", shopsInfo.getStatus()); + shopsInfoMap.put("reason", shopsInfo.getReason()); + } + } + //选择的的商家对象 + Map shopsInfo2Map = new HashMap(); + if (tmpUser.getShopsUserId() != null) { + ShopsInfo shopsInfo = this.shopsInfoDao.findUniqueByProperty(Restrictions.eq("userId", tmpUser.getShopsUserId())); + if (shopsInfo != null) { + User tmp2User = this.userDao.get(tmpUser.getShopsUserId()); + shopsInfo2Map.put("shopsId", shopsInfo.getShopsId()); + shopsInfo2Map.put("userId", shopsInfo.getUserId()); + shopsInfo2Map.put("userImg", tmp2User.getUserImg()); + shopsInfo2Map.put("userName", shopsInfo.getUserName()); + shopsInfo2Map.put("shopsName", shopsInfo.getShopsName()); + shopsInfo2Map.put("shopsPhone", shopsInfo.getShopsPhone()); + shopsInfo2Map.put("shopsProvince", shopsInfo.getShopsProvince()); + shopsInfo2Map.put("shopsCity", shopsInfo.getShopsCity()); + shopsInfo2Map.put("shopsArea", shopsInfo.getShopsArea()); + shopsInfo2Map.put("shopsAddress", shopsInfo.getShopsAddress()); + shopsInfo2Map.put("picture1", shopsInfo.getPicture1()); + shopsInfo2Map.put("picture2", shopsInfo.getPicture2()); + shopsInfo2Map.put("picture3", shopsInfo.getPicture3()); + shopsInfo2Map.put("picture4", shopsInfo.getPicture4()); + shopsInfo2Map.put("status", shopsInfo.getStatus()); + shopsInfo2Map.put("reason", shopsInfo.getReason()); + } + } + //设备信息 + List list = new ArrayList(); + //获取用户拥有设备 + List deviceUserList = this.deviceUserDao.findByProperty(Restrictions.eq("priId.userId", tmpUser.getUserId())); + List deviceIds = new ArrayList(); + for (DeviceUser deviceUser : deviceUserList) { + Device device = this.deviceDao.get(deviceUser.getPriId().getDeviceId()); + deviceIds.add(device.getDeviceId()); + //封装设备返回信息 + list.add(getDeviceInfo(device, deviceUser)); + } + //摄像头信息 + List list2 = new ArrayList(); + //获取用户拥有摄像头 + List cameraUserList = this.cameraUserDao.findByProperty(Restrictions.eq("cameraUserId.userId", tmpUser.getUserId())); + for (CameraUser cameraUser : cameraUserList) { + Camera camera = this.cameraDao.get(cameraUser.getCameraUserId().getCameraId()); + //封装摄像头返回信息 + list2.add(getCameraInfo(camera, cameraUser)); + } + //设备-摄像头 + List list3 = new ArrayList(); + //设备已关联摄像头 + if (deviceIds.size() > 0) { + List deviceCameraList = this.deviceCameraDao.findByProperty(Restrictions.in("deviceCameraId.deviceId", deviceIds)); + for (DeviceCamera deviceCamera : deviceCameraList) { + Map deviceCameraMap = new HashMap(); + deviceCameraMap.put("cameraId", deviceCamera.getDeviceCameraId().getCameraId()); + deviceCameraMap.put("deviceId", deviceCamera.getDeviceCameraId().getDeviceId()); + list3.add(deviceCameraMap); + } + } + Map dataMap = new HashMap(); + dataMap.put("user", userMap); + dataMap.put("shopsInfo", shopsInfoMap); + dataMap.put("shopsInfo2", shopsInfo2Map); + dataMap.put("device", list); + dataMap.put("camera", list2); + dataMap.put("deviceCamera", list3); + return IfishUtil.returnJson(ResultEnum.success.getKey(), dataMap); + } else { + //密码不正确 + return IfishUtil.returnJson(ResultEnum.warn204.getKey(), ""); + } + } + + /** + * 新增保存用户信息 + */ + @Override + public Object save(User user) { + //随机生成6位用户名 + user.setNickName("鱼友" + IfishUtil.getCharAndNumr(5)); + user.setIsRegisterGwell(BooleanEnum.NO.getKey()); + user.setIsRegisterNetease(BooleanEnum.NO.getKey()); + user.setNeteaseToken(""); + user.setUserType(UserTypeEnum.userType0.getKey()); + Date date = new Date(); + user.setCreateTime(date); + user.setUserImg("default/" + (new Random().nextInt(7) + 1) + ".png"); + user.setUpdateTime(date); + this.userDao.save(user); + //注册技威 + Map map = GwellApi.Register(user.getPhoneNumber()); + String result = map.get("result"); + //注册成功 + if (result != null) { + //成功 + if (result.equals(GwellEnum.success.getKey())) { + String P2PVerifyCode1 = map.get("P2PVerifyCode1"); + String P2PVerifyCode2 = map.get("P2PVerifyCode2"); + String gwellUserID = map.get("UserID"); + user.setIsRegisterGwell(BooleanEnum.YES.getKey()); + user.setP2PVerifyCode1(P2PVerifyCode1); + user.setP2PVerifyCode2(P2PVerifyCode2); + user.setGwellUserID(gwellUserID); + } //已经注册过 + else if (result.equals(GwellEnum.repeat.getKey())) { + user.setIsRegisterGwell(BooleanEnum.YES.getKey()); + } + } + //注册云信 + Map neteaseMap = neteaseIM.createAccid(user.getUserId().toString(), user.getNickName(), IfishFilePath.getPath(SubDirectoryEnum.headImage, user.getUserImg()), ""); + if (neteaseMap != null) { + String code = neteaseMap.get("code"); + if (code.equals(NeteaseEnum.status200.getKey())) { + user.setIsRegisterNetease(BooleanEnum.YES.getKey()); + user.setNeteaseToken(neteaseMap.get("token")); + } else if (code.equals(NeteaseEnum.status414.getKey())) { + user.setIsRegisterNetease(BooleanEnum.YES.getKey()); + } + this.userDao.update(user); + } + //发送云信消息 + User imUser = this.userDao.findUniqueByProperty(Restrictions.eq("phoneNumber", IfishFilePath.netease_phone)); + if (imUser != null) { + neteaseIM.sendMsg(imUser.getUserId().toString(), user.getUserId().toString(), "感谢您使用爱鱼奇,连接智能设备请查看下方说明书,内含操作视频:http://u.eqxiu.com/s/KmmVl87l \n摄像头售后:021-54131006\n睿芯插排售后:18658232626\n绚多插排售后:18857689069\n松诺插排售后:13392205468", ""); + } + //返回给App的数据 + Map dataMap = new HashMap(); + dataMap.put("userId", user.getUserId().toString()); + dataMap.put("nickName", user.getNickName()); + dataMap.put("updateTime", IfishUtil.format(user.getUpdateTime())); + return IfishUtil.returnJson(ResultEnum.success.getKey(), dataMap); + } + + /** + * 更新用户信息 + */ + @Override + public Object updateInfo(User user) { + user.setUpdateTime(new Date()); + userDao.update(user); + //更新云信 + neteaseIM.updateUinfo(user.getUserId().toString(), user.getNickName(), IfishFilePath.getPath(SubDirectoryEnum.headImage, user.getUserImg()), ""); + return IfishUtil.returnJson(ResultEnum.success.getKey(), ""); + } + + /** + * 验证原密码后更新用户密码 + */ + @Override + public Object updatePwd(User user, String oldPassword) { + User tmpUser = this.findById(user.getUserId()); + //判断原密码是否正确 + if (tmpUser.getUserPassword().equals(oldPassword)) { + //密码正确,更新用户信息 + tmpUser.setUserPassword(user.getUserPassword()); + return this.updateInfo(tmpUser); + } + //原密码不正确,返回错误码 + return IfishUtil.returnJson(ResultEnum.warn204.getKey(), ""); + } + + /** + * 忘记密码短信验证后修改密码 + */ + @Override + public Object resetPassword(User user) { + //验证手机号是否存在 + User tmpUser = this.userDao.findUniqueByProperty(Restrictions.eq("phoneNumber", user.getPhoneNumber())); + if (tmpUser != null) { + //手机号存在,修改密码 + tmpUser.setUserPassword(user.getUserPassword()); + return this.updateInfo(tmpUser); + } + //手机号不存在,返回错误码 + return IfishUtil.returnJson(ResultEnum.warn202.getKey(), ""); + } + + /** + * 根据ID查找 + */ + @Override + public User findById(Integer userId) { + return this.userDao.get(userId); + } + + /** + * 绑定设备 + */ + @Override + public Object bindDevice(User user, String madAddress) { + User tmpUser = userDao.get(user.getUserId()); + //用户存在 + if (tmpUser != null) { + //新增用户拥有设备 + DeviceUser deviceUser = new DeviceUser(); + Device device = this.deviceDao.findUniqueByProperty(Restrictions.eq("macAddress", madAddress)); + boolean bln = false; + //设备存在 + if (device != null) { + //关联用户-设备 + deviceUser.getPriId().setUserId(tmpUser.getUserId()); + deviceUser.getPriId().setDeviceId(device.getDeviceId()); + //已关联设备的其他用户 + List deviceUserList = this.deviceUserDao.findByProperty(Restrictions.eq("priId.deviceId", device.getDeviceId()), Restrictions.ne("priId.userId", tmpUser.getUserId())); + //是否已关联 + DeviceUser tmpDdeviceUser = this.deviceUserDao.get(deviceUser.getPriId()); + //已关联 + if (tmpDdeviceUser != null) { + //原先不是主控制,则删除其他用户关联关系 + if (!tmpDdeviceUser.getIsMaster().equals(BooleanEnum.YES.getKey())) { + for (DeviceUser du : deviceUserList) { + Integer userId = du.getPriId().getUserId(); + Integer deviceId = du.getPriId().getDeviceId(); + User tu = this.userDao.get(userId); + if (tu != null) { + String timestamp = IfishUtil.format(new Date()); + //基本参数 + Map baseMap = new HashMap(); + baseMap.put("title", PushTypeEnum.remove_device.getValue()); + baseMap.put("content", "你已于" + timestamp + "失去对“" + du.getShowName() + "”设备的控制权"); + baseMap.put("user_id", userId.toString()); + baseMap.put("loginType", tu.getLoginType()); + //推送参数 + Map pushMap = new HashMap(); + pushMap.put("device_id", deviceId.toString()); + pushMap.put("device_name", du.getShowName()); + pushMap.put("timestamp", timestamp); + pushMap.put("msg_type", PushTypeEnum.remove_device.getKey()); + //推送消息 + jPushNotifcation(baseMap, pushMap); + } + this.deviceUserDao.delete(du); + //删除设备和摄像头关系 + DeviceCamera deviceCamera = this.deviceCameraDao.findUniqueByProperty(Restrictions.eq("deviceCameraId.deviceId", du.getPriId().getDeviceId())); + if (deviceCamera != null) { + this.deviceCameraDao.delete(deviceCamera); + } + } + } + //变更为主控 + tmpDdeviceUser.setIsMaster(BooleanEnum.YES.getKey()); + Date date = new Date(); + tmpDdeviceUser.setUpdateTime(date); + tmpDdeviceUser.setCreateTime(date); + this.deviceUserDao.update(tmpDdeviceUser); + //返回数据 + deviceUser.setShowName(tmpDdeviceUser.getShowName()); + deviceUser.setIsMaster(tmpDdeviceUser.getIsMaster()); + } //未绑定过 + else { + //删除其他用户控制权 + for (DeviceUser du : deviceUserList) { + Integer userId = du.getPriId().getUserId(); + Integer deviceId = du.getPriId().getDeviceId(); + User tu = this.userDao.get(userId); + if (tu != null) { + String timestamp = IfishUtil.format(new Date()); + //基本参数 + Map baseMap = new HashMap(); + baseMap.put("title", PushTypeEnum.remove_device.getValue()); + baseMap.put("content", "你已于" + timestamp + "失去对“" + du.getShowName() + "”设备的控制权"); + baseMap.put("user_id", userId.toString()); + baseMap.put("loginType", tu.getLoginType()); + //推送参数 + Map pushMap = new HashMap(); + pushMap.put("device_id", deviceId.toString()); + pushMap.put("device_name", du.getShowName()); + pushMap.put("timestamp", timestamp); + pushMap.put("msg_type", PushTypeEnum.remove_device.getKey()); + //推送消息 + jPushNotifcation(baseMap, pushMap); + } + this.deviceUserDao.delete(du); + //删除设备和摄像头关系 + DeviceCamera deviceCamera = this.deviceCameraDao.findUniqueByProperty(Restrictions.eq("deviceCameraId.deviceId", du.getPriId().getDeviceId())); + if (deviceCamera != null) { + this.deviceCameraDao.delete(deviceCamera); + } + } + //需要新增 + bln = true; + //新增设备激活时间 + if (device.getFirstActivate() == null) { + device.setFirstActivate(new Date()); + device = this.deviceDao.save(device); + } + } + } //设备不存在 + else { + //新增设备信息 + device = new Device(); + device.setLoginCount(0); + device.setIsBlacklist(BooleanEnum.YES.getKey()); + device.setMacAddress(madAddress); + Date date = new Date(); + device.setFirstActivate(date); + device.setCreateDate(date); + device.setCreateTime(date); + device = this.deviceDao.save(device); + //需要新增 + bln = true; + deviceUser.getPriId().setUserId(tmpUser.getUserId()); + deviceUser.getPriId().setDeviceId(device.getDeviceId()); + } + //需要新增 + if (bln) { + //新增关联关系 + deviceUser.setShowName("鱼缸" + (int) (Math.random() * 9000 + 1000)); + deviceUser.setIsMaster(BooleanEnum.YES.getKey()); + Date date = new Date(); + deviceUser.setUpdateTime(date); + deviceUser.setCreateTime(date); + this.deviceUserDao.save(deviceUser); + } + //封装设备返回信息 + return IfishUtil.returnJson(ResultEnum.success.getKey(), getDeviceInfo(device, deviceUser)); + } else { + return IfishUtil.returnJson(ResultEnum.warn202.getKey(), ""); + } + } + + /** + * 绑定摄像头 + */ + @Override + public Object bindCamera(Integer userId, String cameraId) { + User user = userDao.get(userId); + Camera camera = this.cameraDao.get(cameraId); + //返回数据 + Map dataMap = new HashMap(); + //用户存在 + if (user != null) { + //摄像头存在 + if (camera != null) { + //已关联摄像头的用户 + List CameraUserList = this.cameraUserDao.findByProperty(Restrictions.eq("cameraUserId.cameraId", cameraId)); + //删除摄像头与用户关系 + for (CameraUser cu : CameraUserList) { + this.cameraUserDao.delete(cu); + //删除设备和摄像头关系 + DeviceCamera deviceCamera = this.deviceCameraDao.findUniqueByProperty(Restrictions.eq("deviceCameraId.cameraId", cu.getCameraUserId().getCameraId())); + if (deviceCamera != null) { + this.deviceCameraDao.delete(deviceCamera); + } + } + } else { + //摄像头不存在 + camera = new Camera(); + camera.setCameraId(cameraId); + camera.setCreateTime(new Date()); + this.cameraDao.save(camera); + } + //建立关系 + CameraUser cameraUser = new CameraUser(); + CameraUserId cameraUserId = new CameraUserId(userId, cameraId); + cameraUser.setCameraUserId(cameraUserId); + cameraUser.setIsMaster(BooleanEnum.YES.getKey()); + cameraUser.setIsLook(BooleanEnum.NO.getKey()); + cameraUser.setIsLive(BooleanEnum.NO.getKey()); + cameraUser.setShowName("摄像头" + (int) (Math.random() * 900 + 100)); + cameraUser.setCreateTime(new Date()); + this.cameraUserDao.save(cameraUser); + //返回数据 + dataMap.put("cameraId", cameraId); + dataMap.put("showName", cameraUser.getShowName()); + dataMap.put("isMaster", cameraUser.getIsMaster()); + dataMap.put("isLook", cameraUser.getIsLook()); + dataMap.put("isLive", cameraUser.getIsLive()); + dataMap.put("isActive", camera.getActiveCode() != null && !camera.getActiveCode().equals("") ? "1" : "0"); + return IfishUtil.returnJson(ResultEnum.success.getKey(), dataMap); + } else { + return IfishUtil.returnJson(ResultEnum.warn202.getKey(), ""); + } + } + + /** + * 激活摄像头 + */ + @Override + public Object activeCamera(String activeCode, String cameraId) { + CameraActive cameraActive = this.cameraActiveDao.get(activeCode); + //激活码有效 + if (cameraActive != null) { + //激活码被使用 + if (cameraActive.getIsUsed().equals(BooleanEnum.YES.getKey())) { + return IfishUtil.returnJson(ResultEnum.warn208.getKey(), ""); + } else { + Camera camera = this.cameraDao.get(cameraId); + if (camera != null) { + if (camera.getActiveCode() != null && !camera.getActiveCode().equals("")) { + return IfishUtil.returnJson(ResultEnum.success.getKey(), ""); + } else { + //激活成功 + camera.setActiveCode(activeCode); + camera.setActiveTime(new Date()); + camera.setUpdateTime(new Date()); + this.cameraDao.update(camera); + //激活码改成被使用 + cameraActive.setIsUsed(BooleanEnum.YES.getKey()); + this.cameraActiveDao.update(cameraActive); + return IfishUtil.returnJson(ResultEnum.success.getKey(), ""); + } + } else { + return IfishUtil.returnJson(ResultEnum.warn210.getKey(), ""); + } + } + } else { + return IfishUtil.returnJson(ResultEnum.warn209.getKey(), ""); + } + } + + /** + * 封装摄像头返回信息 + * + * @param device + * @param deviceUser + * @return + */ + public Map getCameraInfo(Camera camera, CameraUser cameraUser) { + Map cameraMap = new HashMap(); + cameraMap.put("cameraId", camera.getCameraId()); + cameraMap.put("isMaster", cameraUser.getIsMaster()); + cameraMap.put("isLook", cameraUser.getIsLook()); + cameraMap.put("isActive", camera.getActiveCode() != null && !camera.getActiveCode().equals("") ? "1" : "0"); + cameraMap.put("showName", cameraUser.getShowName()); + return cameraMap; + } + + /** + * 封装设备返回信息 + * + * @param device + * @param deviceUser + * @return + */ + public Map getDeviceInfo(Device device, DeviceUser deviceUser) { + Map deviceMap = new HashMap(); + deviceMap.put("userId", deviceUser.getPriId().getUserId()); + deviceMap.put("deviceId", deviceUser.getPriId().getDeviceId()); + deviceMap.put("isMaster", deviceUser.getIsMaster()); + deviceMap.put("showName", deviceUser.getShowName()); + deviceMap.put("macAddress", device.getMacAddress()); + deviceMap.put("isBlacklist", device.getIsBlacklist()); + deviceMap.put("customIconName", deviceUser.getCustomIconName()); + deviceMap.put("customShowName", deviceUser.getCustomShowName()); + deviceMap.put("deviceIp", device.getDeviceIP()); + deviceMap.put("loginTime", device.getLoginTime()); + if (device.getBrandCode() != null && device.getBrandCode().equals("YUEM") && device.getCreateTime().before(IfishUtil.StrToDate("2016-04-26"))) { + //是否显示预警推送 + deviceMap.put("isPushWendu", BooleanEnum.NO.getKey()); + } else { + //是否显示预警推送 + deviceMap.put("isPushWendu", BooleanEnum.YES.getKey()); + } + //控制方案 + String type = device.getHardwareType(); + if (type != null) { + HardwareType hardwareType = this.hardwareTypeDao.get(type); + if (hardwareType != null) { + //设备类型 + deviceMap.put("type", type); + //有无工作模式 + deviceMap.put("isWorkModel", hardwareType.getIsWorkModel()); + //控制信息 + deviceMap.put("controlAmount", hardwareType.getControlAmount()); + deviceMap.put("timerAmount", hardwareType.getTimerAmount()); + //背光/柜灯 + deviceMap.put("isLightness", hardwareType.getIsLightness()); + deviceMap.put("isSarkLamp", hardwareType.getIsSarkLamp()); + //自定义图标 + deviceMap.put("isCustomIcon", hardwareType.getIsCustomIcon()); + deviceMap.put("iconLink", hardwareType.getIconLink()); + deviceMap.put("allIconName", hardwareType.getAllIconName()); + deviceMap.put("allShowName", hardwareType.getAllShowName()); + deviceMap.put("defaultIconName", hardwareType.getDefaultIconName()); + deviceMap.put("defaultShowName", hardwareType.getDefaultShowName()); + deviceMap.put("updateTime", hardwareType.getUpdateTime()); + //换水提醒 + deviceMap.put("todayRemind", device.getTodayRemind()); + deviceMap.put("waterRemind", device.getWaterRemind()); + deviceMap.put("remindDate", device.getRemindDate() != null ? IfishUtil.format1(device.getRemindDate()) : ""); + deviceMap.put("remindCycle", device.getRemindCycle() != null ? device.getRemindCycle() : ""); + } + } + //厂家 + if (device.getBrandCode() != null) { + //厂家 + VenderList venderList = venderListDao.get(device.getBrandCode()); + deviceMap.put("venderList", venderList); + } else { + //默认爱鱼奇 + VenderList defaultVenderList = venderListDao.getDefaultVenderList(); + deviceMap.put("venderList", defaultVenderList); + } + return deviceMap; + } + + /** + * 更新设备信息 + */ + @Override + public Object update(DeviceUser deviceUser) { + DeviceUser tmpDeviceUser = this.deviceUserDao.get(deviceUser.getPriId()); + if (tmpDeviceUser != null) { + tmpDeviceUser.setUpdateTime(new Date()); + tmpDeviceUser.setShowName(deviceUser.getShowName()); + this.deviceUserDao.update(tmpDeviceUser); + return IfishUtil.returnJson(ResultEnum.success.getKey(), ""); + } + return IfishUtil.returnJson(ResultEnum.warn207.getKey(), ""); + } + + /** + * 更新摄像头信息 + */ + @Override + public Object update(CameraUserId id, String showName) { + CameraUser cameraUser = this.cameraUserDao.get(id); + if (cameraUser != null) { + cameraUser.setUpdateTime(new Date()); + cameraUser.setShowName(showName); + this.cameraUserDao.update(cameraUser); + return IfishUtil.returnJson(ResultEnum.success.getKey(), ""); + } else { + return IfishUtil.returnJson(ResultEnum.warn207.getKey(), ""); + } + } + + /** + * 修改自定义图标 + */ + @Override + public Object updateCustomIcon(DeviceUser deviceUser) { + DeviceUser tmpDeviceUser = this.deviceUserDao.get(deviceUser.getPriId()); + if (tmpDeviceUser != null) { + tmpDeviceUser.setCustomIconName(deviceUser.getCustomIconName()); + tmpDeviceUser.setCustomShowName(deviceUser.getCustomShowName()); + tmpDeviceUser.setUpdateTime(new Date()); + this.deviceUserDao.update(tmpDeviceUser); + return IfishUtil.returnJson(ResultEnum.success.getKey(), ""); + } else { + return IfishUtil.returnJson(ResultEnum.warn207.getKey(), ""); + } + } + + /** + * 删除绑定的设备 + */ + @Override + public Object deleteDeviceUser(DeviceUser deviceUser) { + deviceUser = deviceUserDao.get(deviceUser.getPriId()); + if (deviceUser != null) { + //是主控则解除全部关系 + if (deviceUser.getIsMaster().equals(BooleanEnum.YES.getKey())) { + //已关联设备的所有用户 + List deviceUserList = this.deviceUserDao.findByProperty(Restrictions.eq("priId.deviceId", deviceUser.getPriId().getDeviceId()), Restrictions.ne("priId.userId", deviceUser.getPriId().getUserId())); + //删除所有用户控制权 + for (DeviceUser du : deviceUserList) { + Integer userId = du.getPriId().getUserId(); + Integer deviceId = du.getPriId().getDeviceId(); + User tu = this.userDao.get(userId); + if (tu != null) { + String timestamp = IfishUtil.format(new Date()); + //基本参数 + Map baseMap = new HashMap(); + baseMap.put("title", PushTypeEnum.remove_device.getValue()); + baseMap.put("content", "你已于" + timestamp + "失去对“" + du.getShowName() + "”设备的控制权"); + baseMap.put("user_id", userId.toString()); + baseMap.put("loginType", tu.getLoginType()); + //推送参数 + Map pushMap = new HashMap(); + pushMap.put("device_id", deviceId.toString()); + pushMap.put("device_name", du.getShowName()); + pushMap.put("timestamp", timestamp); + pushMap.put("msg_type", PushTypeEnum.remove_device.getKey()); + //推送消息 + jPushNotifcation(baseMap, pushMap); + } + //删除设备和用户关系 + this.deviceUserDao.delete(du); + } + //删除设备和摄像头关系 + DeviceCamera deviceCamera = this.deviceCameraDao.findUniqueByProperty(Restrictions.eq("deviceCameraId.deviceId", deviceUser.getPriId().getDeviceId())); + if (deviceCamera != null) { + this.deviceCameraDao.delete(deviceCamera); + } + } + //删除设备和用户关系 + this.deviceUserDao.delete(deviceUser); + } + return IfishUtil.returnJson(ResultEnum.success.getKey(), ""); + } + + /** + * 删除绑定的摄像头 + */ + @Override + public Object deleteCameraUser(Integer userId, String cameraId) { + CameraUserId cameraUserId = new CameraUserId(userId, cameraId); + CameraUser cameraUser = this.cameraUserDao.get(cameraUserId); + if (cameraUser != null) { + //删除用户摄像头关系 + this.cameraUserDao.delete(cameraUser); + //删除设备和摄像头关系 + DeviceCamera deviceCamera = this.deviceCameraDao.findUniqueByProperty(Restrictions.eq("deviceCameraId.cameraId", cameraId)); + if (deviceCamera != null) { + this.deviceCameraDao.delete(deviceCamera); + } + return IfishUtil.returnJson(ResultEnum.success.getKey(), ""); + } else { + return IfishUtil.returnJson(ResultEnum.warn207.getKey(), ""); + } + } + + /** + * 最新版本信息 + */ + @Override + public Object getNewestVersionInf(String phoneType) { + Map map = new HashMap(); + //最新版本信息 + Version version = this.versionDao.getNewestVersion(phoneType); + if (version != null) { + map.put("versionCode", version.getVersionCode()); + map.put("phoneType", version.getPhoneType()); + map.put("isMustUpdate", version.getIsMustUpdate()); + map.put("uploadContent", version.getUploadContent()); + map.put("appAddress", version.getAppAddress()); + } + //返回版本信息 + return IfishUtil.returnJson(ResultEnum.success.getKey(), map); + } + + /** + * 上传头像 + */ + @Override + public Object uploadFile(User user, MultipartFile fileUpload) { + //上传文件名称 + String fileName = fileUpload.getOriginalFilename(); + //验证图片格式 + String extEndName = IfishFilePath.checkImgName(fileName); + //图片名称 + String picName = user.getUserId() + "_icon.png"; + //验证图片格式 + if (!fileUpload.isEmpty() && extEndName != null) { + try { + if (!fileUpload.getOriginalFilename().equals("")) { + File picFile = new File(IfishFilePath.path_img, picName); + //不存在则创建 + if (!picFile.exists()) { + picFile.mkdirs(); + } + //保存 + fileUpload.transferTo(picFile); + } + //更新数据库 + user.setUserImg(picName + "?timestamp=" + System.currentTimeMillis()); + user.setUpdateTime(new Date()); + user = this.userDao.update(user); + //更新云信 + neteaseIM.updateUinfo(user.getUserId().toString(), user.getNickName(), IfishFilePath.getPath(SubDirectoryEnum.headImage, user.getUserImg()), ""); + } catch (Exception e) { + throw new RuntimeException(e); + } + Map map = new HashMap(); + map.put("userImg", user.getUserImg()); + map.put("updateTime", user.getUpdateTime()); + //上传成功 + return IfishUtil.returnJson(ResultEnum.success.getKey(), map); + } + return IfishUtil.returnJson(ResultEnum.warn205.getKey(), ""); + } + + @Override + public Object saveQuestionsFeedback(QuestionsFeedback feedback) { + Date date = new Date(); + feedback.setCreateTime(date); + feedback.setQuestionReply(""); + this.questionsFeedbackDao.save(feedback); +// User user = this.userDao.findById(feedback.getUserId()); +// if(user!=null){ +// Mail.send(user.getNickName()+"("+user.getPhoneNumber()+")的问题反馈", feedback.getQuestionContent()); +// } + //发送云信消息 + User imUser = this.userDao.findUniqueByProperty(Restrictions.eq("phoneNumber", IfishFilePath.netease_phone)); + if (imUser != null) { + neteaseIM.sendMsg(feedback.getUserId().toString(), imUser.getUserId().toString(), feedback.getQuestionContent(), ""); + } + return IfishUtil.returnJson(ResultEnum.success.getKey(), ""); + } + + @Override + public Object shareDeviceByQrCode(Integer userId, Integer deviceId) { + User user = userDao.get(userId); + Device device = deviceDao.get(deviceId); + if (user != null && device != null) { + DeviceUser deviceUser = new DeviceUser(); + deviceUser.getPriId().setUserId(user.getUserId()); + deviceUser.getPriId().setDeviceId(device.getDeviceId()); + DeviceUser tmpDeviceUser = deviceUserDao.get(deviceUser.getPriId()); + if (tmpDeviceUser != null) { + //封装设备返回信息 + return IfishUtil.returnJson(ResultEnum.success.getKey(), getDeviceInfo(device, tmpDeviceUser)); + } else { + deviceUser.setIsMaster(BooleanEnum.NO.getKey()); + deviceUser.setShowName("鱼缸" + (int) (Math.random() * 9000 + 1000)); + Date date = new Date(); + deviceUser.setUpdateTime(date); + deviceUser.setCreateTime(date); + this.deviceUserDao.save(deviceUser); + //封装设备返回信息 + return IfishUtil.returnJson(ResultEnum.success.getKey(), getDeviceInfo(device, deviceUser)); + } + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + /** + * 极光推送 + * + * @param userId + */ + public boolean jPushNotifcation(Map baseMap, Map pushMap) { + try { + //登录类型 + String loginType = baseMap.get("loginType"); + if (loginType != null) { + //推送消息类型 + String msgType = pushMap.get("msg_type"); + String userId = baseMap.get("user_id"); + String title = baseMap.get("title"); + String content = baseMap.get("content"); + //云信推送 + Map neteaseMap = neteaseIM.sendMsg(IfishFilePath.ifish_account, userId, "【" + title + "】" + content, JSON.toJSONString(pushMap)); + boolean neteaseBln = neteaseMap.get("code").equals(NeteaseEnum.status200.getKey()); + //推送记录 + PushList pushList = new PushList(); + if (msgType.equals(PushTypeEnum.remove_device.getKey())) { + pushList.setUserId(Integer.valueOf(userId)); + pushList.setDeviceId(Integer.valueOf(pushMap.get("device_id"))); + pushList.setPhoneType(loginType); + pushList.setShowName(pushMap.get("showName")); + pushList.setPushType(msgType); + pushList.setPushTitle(title); + pushList.setPushContext(content); + pushList.setNeteaseStatus(neteaseBln ? BooleanEnum.YES.getKey() : BooleanEnum.NO.getKey()); + pushList.setCreateTime(new Date()); + pushListDao.save(pushList); + return true; + } //发送看护报告推送 + else if (msgType.equals(PushTypeEnum.send_report.getKey())) { + String reportId = baseMap.get("reportId"); + if (reportId != null) { + pushList.setReportId(Integer.valueOf(reportId)); + } + pushList.setUserId(Integer.valueOf(userId)); + pushList.setPhoneType(loginType); + pushList.setPushType(msgType); + pushList.setPushTitle(title); + pushList.setPushContext(content); + pushList.setPushLink(pushMap.get("push_link")); + pushList.setNeteaseStatus(neteaseBln ? BooleanEnum.YES.getKey() : BooleanEnum.NO.getKey()); + pushList.setCreateTime(new Date()); + pushListDao.save(pushList); + return true; + } + } + } catch (Exception e) { + throw new RuntimeException(); + } + return false; + } + + @Override + public Object getSingleDeviceInf(DeviceUser deviceUser) { + Integer deviceId = deviceUser.getPriId().getDeviceId(); + Integer userId = deviceUser.getPriId().getUserId(); + if (deviceId != null && userId != null) { + Device tmpDevice = this.deviceDao.get(deviceId); + DeviceUser tmpDeviceUser = this.deviceUserDao.get(deviceUser.getPriId()); + if (tmpDevice != null && tmpDeviceUser != null) { + //封装设备返回信息 + return IfishUtil.returnJson(ResultEnum.success.getKey(), getDeviceInfo(tmpDevice, tmpDeviceUser)); + } + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + @Override + public Object getRemindWaterInf(Integer deviceId) { + Device device = deviceDao.get(deviceId); + if (device != null) { + Map map = new HashMap(); + //换水提醒 + map.put("todayRemind", device.getTodayRemind()); + map.put("waterRemind", device.getWaterRemind()); + map.put("remindDate", device.getRemindDate() != null ? IfishUtil.format1(device.getRemindDate()) : ""); + map.put("remindCycle", device.getRemindCycle() != null ? device.getRemindCycle() : ""); + return IfishUtil.returnJson(ResultEnum.success.getKey(), map); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + @Override + public Object setRemindWaterInf(Device device) { + Device tmpDevice = this.deviceDao.get(device.getDeviceId()); + if (tmpDevice != null) { + //设置换水提醒 + tmpDevice.setRemindCycle(device.getRemindCycle()); + tmpDevice.setWaterRemind(device.getWaterRemind()); + //默认今天不需要提醒 + tmpDevice.setTodayRemind(BooleanEnum.NO.getKey()); + //下一次提醒日期 + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.DATE, device.getRemindCycle()); + tmpDevice.setRemindDate(calendar.getTime()); + this.deviceDao.update(tmpDevice); + Map map = new HashMap(); + map.put("todayRemind", tmpDevice.getTodayRemind()); + map.put("waterRemind", tmpDevice.getWaterRemind()); + map.put("remindDate", IfishUtil.format1(tmpDevice.getRemindDate())); + map.put("remindCycle", tmpDevice.getRemindCycle()); + return IfishUtil.returnJson(ResultEnum.success.getKey(), map); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + @Override + public Object deviceBindCamera(Integer deviceId, String cameraId) { + DeviceCameraId id = new DeviceCameraId(deviceId, cameraId); + DeviceCamera deviceCamera = this.deviceCameraDao.get(id); + if (deviceCamera == null) { + deviceCamera = new DeviceCamera(); + deviceCamera.setDeviceCameraId(id); + this.deviceCameraDao.save(deviceCamera); + } + return IfishUtil.returnJson(ResultEnum.success.getKey(), ""); + } + + @Override + public Object deviceBindCamera1(Integer userId, Integer deviceId, String cameraId) { + //设备和用户关系 + DeviceUserId priId = new DeviceUserId(); + priId.setDeviceId(deviceId); + priId.setUserId(userId); + DeviceUser deviceUser = this.deviceUserDao.get(priId); + if (deviceUser == null) { + return IfishUtil.returnJson(ResultEnum.warn207.getKey(), ""); + } + //摄像头和用户关系 + CameraUserId cuId = new CameraUserId(userId, cameraId); + CameraUser cameraUser = this.cameraUserDao.get(cuId); + if (cameraUser == null) { + return IfishUtil.returnJson(ResultEnum.warn210.getKey(), ""); + } + //设备和摄像头关系 + DeviceCameraId id = new DeviceCameraId(deviceId, cameraId); + DeviceCamera deviceCamera = this.deviceCameraDao.get(id); + if (deviceCamera == null) { + deviceCamera = new DeviceCamera(); + deviceCamera.setDeviceCameraId(id); + this.deviceCameraDao.save(deviceCamera); + } + return IfishUtil.returnJson(ResultEnum.success.getKey(), ""); + } + + @Override + public Object deleteDeviceCamera(Integer deviceId, String cameraId) { + DeviceCameraId id = new DeviceCameraId(deviceId, cameraId); + DeviceCamera deviceCamera = this.deviceCameraDao.get(id); + if (deviceCamera != null) { + this.deviceCameraDao.delete(deviceCamera); + } + return IfishUtil.returnJson(ResultEnum.success.getKey(), ""); + } + + @Override + public Object saveShopsInfo(ShopsInfo shopsInfo, MultipartFile file1, MultipartFile file2, MultipartFile file3) { + //用户ID + Integer userId = shopsInfo.getUserId(); + User user = this.userDao.get(userId); + if (user == null) { + return IfishUtil.returnJson(ResultEnum.warn211.getKey(), ""); + } + //验证图片格式 + if (!file1.isEmpty() && !file2.isEmpty() && !file3.isEmpty()) { + try { + if (!file1.getOriginalFilename().equals("")) { + File picFile = new File(IfishFilePath.path_shops + "/" + userId, "1.png"); + //不存在则创建 + if (!picFile.exists()) { + picFile.mkdirs(); + } + //保存 + file1.transferTo(picFile); + } + if (!file2.getOriginalFilename().equals("")) { + File picFile = new File(IfishFilePath.path_shops + "/" + userId, "2.png"); + //不存在则创建 + if (!picFile.exists()) { + picFile.mkdirs(); + } + //保存 + file2.transferTo(picFile); + } + if (!file3.getOriginalFilename().equals("")) { + File picFile = new File(IfishFilePath.path_shops + "/" + userId, "3.png"); + //不存在则创建 + if (!picFile.exists()) { + picFile.mkdirs(); + } + //保存 + file3.transferTo(picFile); + } + //保存商家信息 + shopsInfo.setPicture1("1.png"); + shopsInfo.setPicture2("2.png"); + shopsInfo.setPicture3("3.png"); + shopsInfo.setStatus(ShopsStatusEnum.status2.getKey()); + shopsInfo.setUpdateTime(new Date()); + shopsInfo.setCreateTime(new Date()); + this.shopsInfoDao.save(shopsInfo); + //发送邮件 + Mail.send(user.getNickName() + "(" + user.getPhoneNumber() + ")提交审核了", "有提交新的审核!"); + Map shopsInfoMap = new HashMap(); + shopsInfoMap.put("shopsId", shopsInfo.getShopsId()); + shopsInfoMap.put("userId", shopsInfo.getUserId()); + shopsInfoMap.put("userImg", user.getUserImg()); + shopsInfoMap.put("userName", shopsInfo.getUserName()); + shopsInfoMap.put("shopsName", shopsInfo.getShopsName()); + shopsInfoMap.put("shopsPhone", shopsInfo.getShopsPhone()); + shopsInfoMap.put("shopsProvince", shopsInfo.getShopsProvince()); + shopsInfoMap.put("shopsCity", shopsInfo.getShopsCity()); + shopsInfoMap.put("shopsArea", shopsInfo.getShopsArea()); + shopsInfoMap.put("shopsAddress", shopsInfo.getShopsAddress()); + shopsInfoMap.put("picture1", shopsInfo.getPicture1()); + shopsInfoMap.put("picture2", shopsInfo.getPicture2()); + shopsInfoMap.put("picture3", shopsInfo.getPicture3()); + shopsInfoMap.put("picture4", shopsInfo.getPicture4()); + shopsInfoMap.put("status", shopsInfo.getStatus()); + shopsInfoMap.put("reason", shopsInfo.getReason()); + return IfishUtil.returnJson(ResultEnum.success.getKey(), shopsInfoMap); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + @Override + public Object updateShopsInfo(ShopsInfo shopsInfo, MultipartFile file1, MultipartFile file2, MultipartFile file3) { + ShopsInfo tmpShopsInfo = this.shopsInfoDao.get(shopsInfo.getShopsId()); + if (tmpShopsInfo != null) { + Integer userId = tmpShopsInfo.getUserId(); + try { + if (file1 != null && !file1.isEmpty() && !file1.getOriginalFilename().equals("")) { + File picFile = new File(IfishFilePath.path_shops + "/" + userId, "1.png"); + //不存在则创建 + if (!picFile.exists()) { + picFile.mkdirs(); + } + //保存 + file1.transferTo(picFile); + } + if (file2 != null && !file2.isEmpty() && !file2.getOriginalFilename().equals("")) { + File picFile = new File(IfishFilePath.path_shops + "/" + userId, "2.png"); + //不存在则创建 + if (!picFile.exists()) { + picFile.mkdirs(); + } + //保存 + file2.transferTo(picFile); + } + if (file3 != null && !file3.isEmpty() && !file3.getOriginalFilename().equals("")) { + File picFile = new File(IfishFilePath.path_shops + "/" + userId, "3.png"); + //不存在则创建 + if (!picFile.exists()) { + picFile.mkdirs(); + } + //保存 + file3.transferTo(picFile); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + //保存商家信息 + tmpShopsInfo.setShopsName(shopsInfo.getShopsName()); + tmpShopsInfo.setUserName(shopsInfo.getUserName()); + tmpShopsInfo.setShopsPhone(shopsInfo.getShopsPhone()); + tmpShopsInfo.setShopsProvince(shopsInfo.getShopsProvince()); + tmpShopsInfo.setShopsCity(shopsInfo.getShopsCity()); + tmpShopsInfo.setShopsArea(shopsInfo.getShopsArea()); + tmpShopsInfo.setShopsAddress(shopsInfo.getShopsAddress()); + tmpShopsInfo.setStatus(ShopsStatusEnum.status2.getKey()); + tmpShopsInfo.setUpdateTime(new Date()); + this.shopsInfoDao.update(tmpShopsInfo); + User user = this.userDao.get(tmpShopsInfo.getUserId()); + //发送邮件 + Mail.send(user.getNickName() + "(" + user.getPhoneNumber() + ")重新提交审核了", "重新提交了新的审核!"); + Map shopsInfoMap = new HashMap(); + shopsInfoMap.put("shopsId", tmpShopsInfo.getShopsId()); + shopsInfoMap.put("userId", tmpShopsInfo.getUserId()); + shopsInfoMap.put("userImg", user.getUserImg()); + shopsInfoMap.put("userName", tmpShopsInfo.getUserName()); + shopsInfoMap.put("shopsName", tmpShopsInfo.getShopsName()); + shopsInfoMap.put("shopsPhone", tmpShopsInfo.getShopsPhone()); + shopsInfoMap.put("shopsProvince", tmpShopsInfo.getShopsProvince()); + shopsInfoMap.put("shopsCity", tmpShopsInfo.getShopsCity()); + shopsInfoMap.put("shopsArea", tmpShopsInfo.getShopsArea()); + shopsInfoMap.put("shopsAddress", tmpShopsInfo.getShopsAddress()); + shopsInfoMap.put("picture1", tmpShopsInfo.getPicture1()); + shopsInfoMap.put("picture2", tmpShopsInfo.getPicture2()); + shopsInfoMap.put("picture3", tmpShopsInfo.getPicture3()); + shopsInfoMap.put("picture4", tmpShopsInfo.getPicture4()); + shopsInfoMap.put("status", tmpShopsInfo.getStatus()); + shopsInfoMap.put("reason", tmpShopsInfo.getReason()); + return IfishUtil.returnJson(ResultEnum.success.getKey(), shopsInfoMap); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + @Override + public Object updateBaseShopsInfo(ShopsInfo shopsInfo, MultipartFile file4) { + ShopsInfo tmpShopsInfo = this.shopsInfoDao.get(shopsInfo.getShopsId()); + if (tmpShopsInfo != null) { + try { + if (file4 != null && !file4.isEmpty() && !file4.getOriginalFilename().equals("")) { + File picFile = new File(IfishFilePath.path_shops + "/" + tmpShopsInfo.getUserId(), "4.png"); + //不存在则创建 + if (!picFile.exists()) { + picFile.mkdirs(); + } + //保存 + file4.transferTo(picFile); + tmpShopsInfo.setPicture4("4.png"); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + tmpShopsInfo.setShopsPhone(shopsInfo.getShopsPhone()); + tmpShopsInfo.setShopsProvince(shopsInfo.getShopsProvince()); + tmpShopsInfo.setShopsCity(shopsInfo.getShopsCity()); + tmpShopsInfo.setShopsArea(shopsInfo.getShopsArea()); + tmpShopsInfo.setShopsAddress(shopsInfo.getShopsAddress()); + tmpShopsInfo.setUpdateTime(new Date()); + this.shopsInfoDao.update(tmpShopsInfo); + Map shopsInfoMap = new HashMap(); + User user = this.userDao.get(tmpShopsInfo.getUserId()); + shopsInfoMap.put("shopsId", tmpShopsInfo.getShopsId()); + shopsInfoMap.put("userId", tmpShopsInfo.getUserId()); + shopsInfoMap.put("userImg", user.getUserImg()); + shopsInfoMap.put("userName", tmpShopsInfo.getUserName()); + shopsInfoMap.put("shopsName", tmpShopsInfo.getShopsName()); + shopsInfoMap.put("shopsPhone", tmpShopsInfo.getShopsPhone()); + shopsInfoMap.put("shopsProvince", tmpShopsInfo.getShopsProvince()); + shopsInfoMap.put("shopsCity", tmpShopsInfo.getShopsCity()); + shopsInfoMap.put("shopsArea", tmpShopsInfo.getShopsArea()); + shopsInfoMap.put("shopsAddress", tmpShopsInfo.getShopsAddress()); + shopsInfoMap.put("picture1", tmpShopsInfo.getPicture1()); + shopsInfoMap.put("picture2", tmpShopsInfo.getPicture2()); + shopsInfoMap.put("picture3", tmpShopsInfo.getPicture3()); + shopsInfoMap.put("picture4", tmpShopsInfo.getPicture4()); + shopsInfoMap.put("status", tmpShopsInfo.getStatus()); + shopsInfoMap.put("reason", tmpShopsInfo.getReason()); + return IfishUtil.returnJson(ResultEnum.success.getKey(), shopsInfoMap); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + @Override + public Object getShopsStatus(Integer shopsId) { + ShopsInfo shopsInfo = this.shopsInfoDao.get(shopsId); + if (shopsInfo != null) { + User user = this.userDao.get(shopsInfo.getUserId()); + Map shopsInfoMap = new HashMap(); + shopsInfoMap.put("shopsId", shopsInfo.getShopsId()); + shopsInfoMap.put("userId", shopsInfo.getUserId()); + shopsInfoMap.put("userImg", user.getUserImg()); + shopsInfoMap.put("userName", shopsInfo.getUserName()); + shopsInfoMap.put("shopsName", shopsInfo.getShopsName()); + shopsInfoMap.put("shopsPhone", shopsInfo.getShopsPhone()); + shopsInfoMap.put("shopsProvince", shopsInfo.getShopsProvince()); + shopsInfoMap.put("shopsCity", shopsInfo.getShopsCity()); + shopsInfoMap.put("shopsArea", shopsInfo.getShopsArea()); + shopsInfoMap.put("shopsAddress", shopsInfo.getShopsAddress()); + shopsInfoMap.put("picture1", shopsInfo.getPicture1()); + shopsInfoMap.put("picture2", shopsInfo.getPicture2()); + shopsInfoMap.put("picture3", shopsInfo.getPicture3()); + shopsInfoMap.put("picture4", shopsInfo.getPicture4()); + shopsInfoMap.put("status", shopsInfo.getStatus()); + shopsInfoMap.put("reason", shopsInfo.getReason()); + return IfishUtil.returnJson(ResultEnum.success.getKey(), shopsInfoMap); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + @Override + public Object choiceShops(String phoneNumber, Integer userId) { + //商家用户 + User user = this.userDao.findUniqueByProperty(Restrictions.eq("phoneNumber", phoneNumber)); + //商家和用户不能是同一个帐号 + if (user != null && userId != null && !userId.equals(user.getUserId())) { + //用户类型是商家 + if (user != null && user.getUserType().equals(UserTypeEnum.userType1.getKey())) { + //商家信息 + ShopsInfo shopsInfo = this.shopsInfoDao.findUniqueByProperty(Restrictions.eq("userId", user.getUserId())); + //当前用户 + User tmpUser = this.userDao.get(userId); + if (shopsInfo != null && tmpUser != null) { + tmpUser.setShopsUserId(user.getUserId()); + tmpUser.setUpdateTime(new Date()); + this.userDao.update(tmpUser); + Map shopsInfoMap = new HashMap(); + shopsInfoMap.put("shopsId", shopsInfo.getShopsId()); + shopsInfoMap.put("userId", shopsInfo.getUserId()); + shopsInfoMap.put("userImg", user.getUserImg()); + shopsInfoMap.put("userName", user.getNickName()); + shopsInfoMap.put("shopsName", shopsInfo.getShopsName()); + shopsInfoMap.put("shopsPhone", shopsInfo.getShopsPhone()); + shopsInfoMap.put("shopsProvince", shopsInfo.getShopsProvince()); + shopsInfoMap.put("shopsCity", shopsInfo.getShopsCity()); + shopsInfoMap.put("shopsArea", shopsInfo.getShopsArea()); + shopsInfoMap.put("shopsAddress", shopsInfo.getShopsAddress()); + shopsInfoMap.put("picture1", shopsInfo.getPicture1()); + shopsInfoMap.put("picture2", shopsInfo.getPicture2()); + shopsInfoMap.put("picture3", shopsInfo.getPicture3()); + shopsInfoMap.put("picture4", shopsInfo.getPicture4()); + shopsInfoMap.put("status", shopsInfo.getStatus()); + shopsInfoMap.put("reason", shopsInfo.getReason()); + //发送云信消息 + neteaseIM.sendMsg(IfishFilePath.ifish_account, shopsInfo.getUserId().toString(), "【" + PushTypeEnum.shops_push.getValue() + "】恭喜,[" + tmpUser.getNickName() + "]已经将你锁定为他的看护商家,快去看看吧", ""); + return IfishUtil.returnJson(ResultEnum.success.getKey(), shopsInfoMap); + } + } + } + return IfishUtil.returnJson(ResultEnum.warn212.getKey(), ""); + } + + @Override + public Object onoffLook(String cameraId, Integer userId, String status) { + CameraUserId id = new CameraUserId(userId, cameraId); + CameraUser cameraUser = this.cameraUserDao.get(id); + if (cameraUser != null) { + cameraUser.setIsLook(status); + this.cameraUserDao.update(cameraUser); + return IfishUtil.returnJson(ResultEnum.success.getKey(), ""); + } + return IfishUtil.returnJson(ResultEnum.warn210.getKey(), ""); + } + + @Override + public Object lookReport(Integer userId, String index1, String index2, String index3, String suggestion, MultipartFile fileUpload) { + try { + ShopsInfo shopsInfo = this.shopsInfoDao.findUniqueByProperty(Restrictions.eq("userId", userId)); + User user = this.userDao.get(userId); + if (shopsInfo != null && user != null) { + String pngName = IfishUtil.uploadFile(fileUpload, IfishFilePath.path_look_img); + if (pngName != null && !pngName.equals("")) { + LookReport lookReport = IfishUtil.getLookFile(shopsInfo, user, index1, index2, index3, suggestion, pngName, IfishFilePath.html_name, IfishFilePath.path_look_html); + if (lookReport != null) { + this.lookReportDao.save(lookReport); + Map map = new HashMap(); + map.put("timestamp", IfishUtil.format2(lookReport.getTimestamp())); + map.put("totalIndex", lookReport.getTotalIndex()); + map.put("baifenbi", lookReport.getBaifenbi()); + map.put("shareImg", pngName); + map.put("fileName", lookReport.getHtmlName()); + map.put("reportId", lookReport.getReportId().toString()); + return IfishUtil.returnJson(ResultEnum.success.getKey(), map); + } + } + } + } catch (Exception e) { + throw new RuntimeException(); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + @Override + public Object sendReport(Integer userId, String fileName) { + User user = this.userDao.get(userId); + if (user != null) { + String timestamp = IfishUtil.format(new Date()); + //基本参数 + Map baseMap = new HashMap(); + baseMap.put("title", PushTypeEnum.send_report.getValue()); + baseMap.put("content", "[点击查看]您的看护报告已生成,记得抽空看下哟。"); + baseMap.put("user_id", userId.toString()); + baseMap.put("loginType", user.getLoginType()); + //推送参数 + Map pushMap = new HashMap(); + pushMap.put("push_link", IfishFilePath.getPath(SubDirectoryEnum.look, fileName)); + pushMap.put("timestamp", timestamp); + pushMap.put("msg_type", PushTypeEnum.send_report.getKey()); + jPushNotifcation(baseMap, pushMap); + return IfishUtil.returnJson(ResultEnum.success.getKey(), ""); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + @Override + public Object sendReport(Integer userId, String fileName, Integer reportId) { + User user = this.userDao.get(userId); + if (user != null) { + String timestamp = IfishUtil.format(new Date()); + //基本参数 + Map baseMap = new HashMap(); + baseMap.put("title", PushTypeEnum.send_report.getValue()); + baseMap.put("content", "您的看护报告已生成,记得抽空看下哟,点击查看。"); + baseMap.put("user_id", userId.toString()); + baseMap.put("reportId", reportId.toString()); + baseMap.put("loginType", user.getLoginType()); + //推送参数 + Map pushMap = new HashMap(); + pushMap.put("push_link", IfishFilePath.getPath(SubDirectoryEnum.look, fileName)); + pushMap.put("title", PushTypeEnum.send_report.getValue()); + pushMap.put("timestamp", timestamp); + pushMap.put("reportId", reportId.toString()); + pushMap.put("msg_type", PushTypeEnum.send_report.getKey()); + jPushNotifcation(baseMap, pushMap); + return IfishUtil.returnJson(ResultEnum.success.getKey(), ""); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + @Override + public Object getLookReportById(Integer reportId) { + LookReport lookReport = lookReportDao.get(reportId); + if (lookReport != null) { + Map map = new HashMap(); + map.put("reportId", lookReport.getReportId()); + map.put("shareImg", lookReport.getShareImg()); + map.put("timestamp", IfishUtil.format2(lookReport.getTimestamp())); + map.put("index1", lookReport.getIndex1()); + map.put("index2", lookReport.getIndex2()); + map.put("index3", lookReport.getIndex3()); + map.put("suggestion", lookReport.getSuggestion()); + map.put("totalIndex", lookReport.getTotalIndex()); + map.put("baifenbi", lookReport.getBaifenbi()); + map.put("userImg", lookReport.getUserImg()); + map.put("shopsName", lookReport.getShopsName()); + map.put("signature", lookReport.getSignature()); + map.put("index1Text", Index1Enum.getValue(lookReport.getIndex1())); + map.put("index2Text", Index2Enum.getValue(lookReport.getIndex2())); + map.put("index3Text", Index3Enum.getValue(lookReport.getIndex3())); + return IfishUtil.returnJson(ResultEnum.success.getKey(), map); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + +} diff --git a/src/main/java/com/ifish/serviceImpl/CacheServiceImpl.java b/src/main/java/com/ifish/serviceImpl/CacheServiceImpl.java new file mode 100644 index 0000000..c7fcebe --- /dev/null +++ b/src/main/java/com/ifish/serviceImpl/CacheServiceImpl.java @@ -0,0 +1,190 @@ +package com.ifish.serviceImpl; + +import java.util.ArrayList; +import java.util.List; + +import org.hibernate.criterion.Order; +import org.hibernate.criterion.Restrictions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.alibaba.fastjson.JSONObject; +import com.ifish.dao.AdInfoDao; +import com.ifish.dao.GoldRuleDao; +import com.ifish.dao.GradeDao; +import com.ifish.dao.GradeRuleDao; +import com.ifish.dao.HardwareTypeDao; +import com.ifish.dao.IfishGoodsDao; +import com.ifish.dao.IfishShopDao; +import com.ifish.dao.InformationDao; +import com.ifish.dao.UeditorDao; +import com.ifish.dao.VenderListDao; +import com.ifish.entity.AdInfo; +import com.ifish.entity.GoldTask; +import com.ifish.entity.Grade; +import com.ifish.entity.GradeTask; +import com.ifish.entity.HardwareType; +import com.ifish.entity.IfishGoods; +import com.ifish.entity.IfishShop; +import com.ifish.entity.Information; +import com.ifish.entity.VenderList; +import com.ifish.enums.BooleanEnum; +import com.ifish.enums.SubDirectoryEnum; +import com.ifish.service.CacheService; +import com.ifish.util.IfishFilePath; + +/** + * 缓存数据service + * @author Administrator + * + */ +@Service +@Transactional +public class CacheServiceImpl implements CacheService { + + @Autowired + private GradeDao gradeDao; + @Autowired + private AdInfoDao adInfoDao; + @Autowired + private UeditorDao ueditorDao; + @Autowired + private GoldRuleDao goldRuleDao; + @Autowired + private IfishShopDao ifishShopDao; + @Autowired + private GradeRuleDao gradeRuleDao; + @Autowired + private IfishGoodsDao ifishGoodsDao; + @Autowired + private VenderListDao venderListDao; + @Autowired + private InformationDao informationDao; + @Autowired + private HardwareTypeDao hardwareTypeDao; + + /** + * 根据ID获取硬件类型 + */ + @Cacheable(value="singleCache",key="#id + #root.methodName") + @Override + public HardwareType findHardwareTypeById(String id){ + return hardwareTypeDao.get(id); + } + + /** + * 根据ID查找鱼缸厂 + */ + @Cacheable(value="singleCache",key="#id + #root.methodName") + @Override + public VenderList findVenderListById(String id){ + return venderListDao.get(id); + } + + /** + * 获取等级规则 + * @return + */ + @Cacheable(value="singleCache",key="#id + #root.methodName") + @Override + public GradeTask getGradeRule(String id){ + return gradeRuleDao.get(id); + } + + /** + * 获取金币规则 + * @return + */ + @Cacheable(value="singleCache",key="#id + #root.methodName") + @Override + public GoldTask getGoldRule(String id){ + return goldRuleDao.get(id); + } + /** + * 获取等级信息 + * @return + */ + @Cacheable(value="listCache",key="#root.methodName") + @Override + public List getGradeList(){ + //等级信息 + return gradeDao.findByProperty(Order.asc("gradeNum")); + } + /** + * 获取金币规则信息 + * @return + */ + @Cacheable(value="listCache",key="#root.methodName") + @Override + public List getGoldRuleList(){ + //金币入账规则 + return goldRuleDao.findByProperty(Order.asc("orderNum"),Restrictions.eq("state", BooleanEnum.YES.getKey())); + } + + /** + * 等级规则信息 + */ + @Cacheable(value="listCache",key="#root.methodName") + @Override + public List getGradeRuleList() { + //等级规则信息 + return gradeRuleDao.findByProperty(Order.asc("orderNum"),Restrictions.eq("state", BooleanEnum.YES.getKey())); + } + + /** + * 获取资讯信息 + * @return + */ + @Cacheable(value="informationCache",key="#root.methodName") + @Override + public List getInformation(){ + List informationList = informationDao.findByCriteria(0,1,Order.desc("infoId"),Restrictions.eq("appShow", BooleanEnum.YES.getKey())).getList(); + List jsonList = new ArrayList(); + for (Information information : informationList) { + JSONObject json = new JSONObject(); + jsonList.add(json); + json.put("infoId", information.getInfoId()); + json.put("appShow", information.getAppShow()); + if(information.getUeditorId()!=null){ + json.put("link", IfishFilePath.getPath(SubDirectoryEnum.ueditorHtml,information.getLink())); + } + else{ + json.put("link", information.getLink()); + } + json.put("title", information.getTitle()); + json.put("isAddUserId", information.getUeditorType()); + json.put("createTime", information.getCreateTime()); + + } + return jsonList; + } + + /** + * 广告位信息 + */ + @Cacheable(value="listCache",key="#adType + #root.methodName") + @Override + public List getAdInfoList(int adType) { + return adInfoDao.findByProperty(Order.asc("orderNum"),Restrictions.eq("adType", adType),Restrictions.eq("isShow", BooleanEnum.YES.getKey())); + } + + /** + * 商品信息 + */ + @Cacheable(value="listCache",key="#goodsPlace + #root.methodName") + @Override + public List getIfishGoodsList(int goodsPlace) { + List ifishGoodsList = ifishGoodsDao.findByProperty(Order.desc("goodsId"),Restrictions.eq("goodsPlace", goodsPlace),Restrictions.eq("isShow", Integer.valueOf(BooleanEnum.YES.getKey()))); + for (IfishGoods ifishGoods : ifishGoodsList) { + Integer shopId = ifishGoods.getShopId(); + IfishShop ifishShop = ifishShopDao.get(shopId); + //店铺名称 + if(ifishShop!=null){ + ifishGoods.setShopName(ifishShop.getShopName()); + } + } + return ifishGoodsList; + } +} diff --git a/src/main/java/com/ifish/serviceImpl/CameraServiceImpl.java b/src/main/java/com/ifish/serviceImpl/CameraServiceImpl.java new file mode 100644 index 0000000..bd538b0 --- /dev/null +++ b/src/main/java/com/ifish/serviceImpl/CameraServiceImpl.java @@ -0,0 +1,13 @@ +package com.ifish.serviceImpl; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.ifish.service.CameraService; + +@Service +@Transactional +public class CameraServiceImpl implements CameraService{ + + +} diff --git a/src/main/java/com/ifish/serviceImpl/CouponServiceImpl.java b/src/main/java/com/ifish/serviceImpl/CouponServiceImpl.java new file mode 100644 index 0000000..a1ca9b7 --- /dev/null +++ b/src/main/java/com/ifish/serviceImpl/CouponServiceImpl.java @@ -0,0 +1,181 @@ +package com.ifish.serviceImpl; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +import org.hibernate.criterion.Order; +import org.hibernate.criterion.Restrictions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.alibaba.fastjson.JSONObject; +import com.ifish.dao.CouponDao; +import com.ifish.dao.CouponRecordDao; +import com.ifish.dao.GoldExpendRecordDao; +import com.ifish.dao.UserAssetDao; +import com.ifish.dto.JsonResult; +import com.ifish.dto.PageingDto; +import com.ifish.entity.Coupon; +import com.ifish.entity.CouponRecord; +import com.ifish.entity.GoldExpendRecord; +import com.ifish.entity.UserAsset; +import com.ifish.enums.BooleanEnum; +import com.ifish.enums.GoldExpendTypeEnum; +import com.ifish.enums.ResultEnum; +import com.ifish.exception.IfishException; +import com.ifish.hibernate.Pagination; +import com.ifish.service.CouponService; +import com.ifish.util.IfishUtil; +import com.ifish.util.ResultUtil; +import com.ifish.validator.PageParam; + +/** + * 优惠券 + * @author Administrator + * + */ +@Service +@Transactional +public class CouponServiceImpl implements CouponService { + + @Autowired + private CouponDao couponDao; + @Autowired + private UserAssetDao userAssetDao; + @Autowired + private CouponRecordDao couponRecordDao; + @Autowired + private GoldExpendRecordDao goldExpendRecordDao; + + /** + * 获取所有可兑换优惠券 + */ + @Override + public JsonResult getAllValidCoupon() { + Date curDate = IfishUtil.getCurDate(); + //可兑换优惠券 + List couponList = couponDao.findByProperty( + Order.desc("updateTime"), + Restrictions.or( + //在结束日期前可兑换 + Restrictions.ge("validEndDate", curDate), + //都为null表示无使用期限 + Restrictions.and( + Restrictions.isNull("validStartDate"), + Restrictions.isNull("validEndDate") + ) + ) + ); + //查询兑换数量 + for (Coupon coupon : couponList) { + //查询该兑换券的兑换数量 + int exchangeCount = couponRecordDao.getCouponRecordCountByCouponId(coupon.getCouponId()); + coupon.setExchangeCount(exchangeCount); + } + return ResultUtil.success(couponList); + } + + /** + * 兑换优惠券 + */ + @Override + public JsonResult exchangeCoupon(Integer userId, Integer couponId) { + UserAsset userAsset = userAssetDao.get(userId); + if(userAsset==null){ + throw new IfishException(ResultEnum.error402); + } + Coupon coupon = couponDao.get(couponId); + if(coupon==null){ + throw new IfishException(ResultEnum.error402); + } + //有效期内可兑换 + Date validStartDate = coupon.getValidStartDate(); + Date validEndDate = coupon.getValidEndDate(); + Date curDate = IfishUtil.getCurDate(); + //不在有效期内 + if(validStartDate!=null && validEndDate!=null && curDate.compareTo(validEndDate)>0){ + throw new IfishException(ResultEnum.warn219); + } + //优惠券数量 + Integer couponNumber = coupon.getCouponNumber(); + if(couponNumber!=null && couponNumber<=0){ + throw new IfishException(ResultEnum.warn221); + } + //金币不足 + BigDecimal needGold = coupon.getNeedGold(); + BigDecimal goldValue = userAsset.getGoldValue(); + if(goldValue.compareTo(needGold)<0){ + JSONObject json = new JSONObject(); + json.put("goldValue", goldValue); + return ResultUtil.warn(ResultEnum.warn215.getKey(),json); + } + //兑换上限 + Integer upperLimit = coupon.getUpperLimit(); + if(upperLimit!=null){ + int couponCount = couponRecordDao.getCouponRecordCountByUser(userId, couponId); + //兑换达到上限 + if(couponCount>=upperLimit){ + throw new IfishException(ResultEnum.warn220); + } + } + //新增优惠券兑换记录 + CouponRecord couponRecord = new CouponRecord(); + couponRecord.setUserId(userId); + couponRecord.setCouponId(couponId); + couponRecord.setMoneyValue(coupon.getMoneyValue()); + couponRecord.setNeedGold(coupon.getNeedGold()); + couponRecord.setUseNeedMoney(coupon.getUseNeedMoney()); + couponRecord.setTagText(coupon.getTagText()); + couponRecord.setValidStartDate(coupon.getValidStartDate()); + couponRecord.setValidEndDate(coupon.getValidEndDate()); + couponRecord.setIsUsed(BooleanEnum.NO.getKey()); + couponRecord.setCreateTime(new Date()); + //生成8位激活码 + while(true){ + String activationCode = IfishUtil.getCharAndNumr(8).toUpperCase(); + //查询激活码是否存在 + CouponRecord tmpCouponRecord = couponRecordDao.findUniqueByProperty(Restrictions.eq("activationCode", activationCode)); + if(tmpCouponRecord==null){ + couponRecord.setActivationCode(activationCode); + couponRecordDao.save(couponRecord); + //优惠券数量减一 + if(couponNumber!=null){ + couponNumber--; + coupon.setCouponNumber(couponNumber); + } + break; + } + } + //扣除金币 + goldValue = goldValue.subtract(needGold); + userAsset.setGoldValue(goldValue); + //兑换消耗金币记录 + GoldExpendRecord goldRecord = new GoldExpendRecord(userId, needGold, GoldExpendTypeEnum.exchangeCoupon); + //兑换记录ID + goldRecord.setRelationId(couponRecord.getRecordId()); + goldExpendRecordDao.save(goldRecord); + //查询该兑换券的兑换数量 + int exchangeCount = couponRecordDao.getCouponRecordCountByCouponId(couponId); + JSONObject json = new JSONObject(); + json.put("exchangeCount", exchangeCount); + json.put("couponNumber", couponNumber); + json.put("goldValue", goldValue); + return ResultUtil.success(json); + } + + /** + * 优惠券兑换记录 + */ + @Override + public PageingDto getCouponRecordByPage(PageParam param) { + //分页获取数据 + Integer firstResult = param.getFirstResult(); + Pagination page = couponRecordDao.findByCriteria(firstResult, param.getPageSize(), Order.desc("recordId"),Restrictions.eq("userId", param.getUserId())); + List list = page.getList(); + firstResult+=list.size(); + //分页数据封装 + return ResultUtil.success(firstResult, page.getTotalCount(), list); + } +} diff --git a/src/main/java/com/ifish/serviceImpl/GoldServiceImpl.java b/src/main/java/com/ifish/serviceImpl/GoldServiceImpl.java new file mode 100644 index 0000000..11ae4d9 --- /dev/null +++ b/src/main/java/com/ifish/serviceImpl/GoldServiceImpl.java @@ -0,0 +1,430 @@ +package com.ifish.serviceImpl; + +import java.math.BigDecimal; +import java.math.MathContext; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; + +import org.hibernate.criterion.Order; +import org.hibernate.criterion.Restrictions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.alibaba.fastjson.JSONObject; +import com.ifish.dao.GoldControlDao; +import com.ifish.dao.GoldExpendRecordDao; +import com.ifish.dao.GoldGetRecordDao; +import com.ifish.dao.GoldRuleDao; +import com.ifish.dao.UserAssetDao; +import com.ifish.dto.JsonResult; +import com.ifish.dto.PageingDto; +import com.ifish.dto.RuleRecordDto; +import com.ifish.dto.UserAssetDto; +import com.ifish.entity.GoldControl; +import com.ifish.entity.GoldControlId; +import com.ifish.entity.GoldExpendRecord; +import com.ifish.entity.GoldGetRecord; +import com.ifish.entity.GoldTask; +import com.ifish.entity.Grade; +import com.ifish.entity.UserAsset; +import com.ifish.enums.AddTypeEnum; +import com.ifish.enums.BooleanEnum; +import com.ifish.enums.GoldExpendTypeEnum; +import com.ifish.enums.GoldGetTypeEnum; +import com.ifish.enums.ResultEnum; +import com.ifish.exception.IfishException; +import com.ifish.hibernate.Pagination; +import com.ifish.service.AsyncTaskService; +import com.ifish.service.CacheService; +import com.ifish.service.GoldService; +import com.ifish.util.IfishUtil; +import com.ifish.util.ResultUtil; +import com.ifish.validator.AddValueParam; +import com.ifish.validator.PageParam; + +/** + * 金币service + * @author Administrator + * + */ +@Service +@Transactional +public class GoldServiceImpl implements GoldService { + + @Autowired + private GoldRuleDao goldRuleDao; + @Autowired + private GoldGetRecordDao goldGetRecordDao; + @Autowired + private GoldExpendRecordDao goldExpendRecordDao; + @Autowired + private GoldControlDao goldControlDao; + @Autowired + private UserAssetDao userAssetDao; + @Autowired + private CacheService cacheService; + @Autowired + private AsyncTaskService asyncTaskService; + + /** + * 是否加过金币 + * @param userAsset + * @param goldRule + * @param isSignin + * @return + */ + public UserAssetDto getGoldControl(UserAsset userAsset, GoldTask goldRule,boolean isSignin){ + Integer userId = userAsset.getUserId(); + String ruleType = goldRule.getRuleType(); + //日期 + Calendar calendar = Calendar.getInstance(); + //今天 + Date date = calendar.getTime(); + String today = IfishUtil.format1(date); + //昨天 + calendar.add(Calendar.DAY_OF_MONTH, -1); + String yesterday = IfishUtil.format1(calendar.getTime()); + //控制信息 + GoldControlId id = new GoldControlId(userId, ruleType); + GoldControl control = goldControlDao.get(id); + //加成类型 + String addType = goldRule.getAddType(); + if(control==null){ + //加成一次或每天加成 + if(addType.equals(AddTypeEnum.once.getKey()) || addType.equals(AddTypeEnum.everyDay.getKey())){ + //新增控制今天加过金币 + control = new GoldControl(id, today, date); + goldControlDao.save(control); + //加金币 + return addGoldValue(userAsset, goldRule, today, yesterday, isSignin); + } + } + else{ + //每天加成并且今天未加过金币 + if(addType.equals(AddTypeEnum.everyDay.getKey()) && !control.getControlParam().equals(today)){ + //更新今天加过 + control.setControlParam(today); + control.setUpdateTime(date); + //加金币 + return addGoldValue(userAsset, goldRule, today, yesterday, isSignin); + } + } + return getUserAssetInfo(userAsset, new BigDecimal(0), today, yesterday); + } + + /** + * 加金币并保存记录 + * @param userAsset + * @param goldRule + * @param today + * @param yesterday + * @param isSignin + * @return + */ + public UserAssetDto addGoldValue(UserAsset userAsset,GoldTask goldRule,String today,String yesterday,boolean isSignin){ + //用户金币 + BigDecimal goldValue = userAsset.getGoldValue(); + //用户经验值 + Integer gradeValue = userAsset.getGradeValue(); + //应加金币 + BigDecimal addValue = goldRule.getAddValue(); + //签到 + if(isSignin){ + //连续签到 + Integer keepNum = userAsset.getKeepSigninNum(); + //昨天已经签到 + if(yesterday.equals(userAsset.getLastSigninDate())){ + keepNum++; + if(keepNum>7){ + keepNum = 1; + } + } + else{ + keepNum = 1; + } + //连续签到奖励每天加1 + addValue = addValue.add(new BigDecimal(keepNum-1)); + //签到信息 + userAsset.setKeepSigninNum(keepNum); + userAsset.setLastSigninDate(today); + } + //金币加成百分比 + BigDecimal goldAddtion = new BigDecimal(0); + //判定用户等级,根据等级百分比加成金币 + List gradeLsit = cacheService.getGradeList(); + for (Grade grade : gradeLsit) { + if(gradeValue>=grade.getMinValue() && gradeValue0){ + //额外加成金币 + MathContext mc = new MathContext(2, RoundingMode.HALF_DOWN); + BigDecimal extraAddValue = goldAddtion.divide(new BigDecimal(100),mc).multiply(addValue); + //加成后金币 + addValue = addValue.add(extraAddValue); + } + //加金币 + userAsset.setGoldValue(goldValue.add(addValue)); + //加金币记录 + Integer userId = userAsset.getUserId(); + String ruleType = goldRule.getRuleType(); + GoldGetRecord goldRecord = new GoldGetRecord(userId, ruleType, addValue, goldRule.getRuleRemark()); + goldGetRecordDao.save(goldRecord); + //用户动态 + asyncTaskService.saveUserActivity(userId, ruleType); + return getUserAssetInfo(userAsset, addValue, today, yesterday); + } + + /** + * 返回信息封装 + * @param userAsset + * @param addValue + * @return + */ + @Override + public UserAssetDto getUserAssetInfo(UserAsset userAsset,BigDecimal addValue,String today,String yesterday){ + //封装返回值 + UserAssetDto userAssetDto = new UserAssetDto(); + //经验值 + Integer gradeValue = userAsset.getGradeValue(); + //等级信息 + userAssetDto.setGradeValue(gradeValue); + userAssetDto.setGoldValue(userAsset.getGoldValue()); + userAssetDto.setLastLoginDate(userAsset.getLastLoginDate()); + //连续签到 + Integer keepNum = userAsset.getKeepSigninNum(); + //最后签到 + String lastDay = userAsset.getLastSigninDate(); + //今天是否签到 + if(lastDay.equals(today)){ + userAssetDto.setToDaySignin(BooleanEnum.YES.getKey()); + userAssetDto.setKeepSigninNum(keepNum); + } + //最后一次签到是否是昨天 + else if(lastDay.equals(yesterday) && keepNum<7){ + userAssetDto.setKeepSigninNum(keepNum); + } + //所加金币 + userAssetDto.setAddValue(addValue); + //是否砸过金蛋 + userAssetDto.setIsHitGoldenEgg(todayIsHitGoldenEgg(userAsset, today)); + //等级 + for(Grade grade : cacheService.getGradeList()) { + if(gradeValue>=grade.getMinValue() && gradeValue addGoldValue(AddValueParam addValueParam) { + //用户ID + Integer userId = addValueParam.getUserId(); + UserAsset userAsset = userAssetDao.get(userId); + if(userAsset==null){ + return new JsonResult(ResultEnum.error402.getKey()); + } + //规则类型 + String ruleType = addValueParam.getRuleType(); + //签到及砸金蛋接口(有单独的接口) + if(ruleType.equals(GoldGetTypeEnum.everyDaySignin.getKey()) || ruleType.equals(GoldGetTypeEnum.hitGoldenEgg.getKey())){ + throw new IfishException(ResultEnum.error402); + } + GoldTask goldRule = cacheService.getGoldRule(ruleType); + //不存在和未返回给app的 + if(goldRule==null || !goldRule.getState().equals(BooleanEnum.YES.getKey())){ + return new JsonResult(ResultEnum.error402.getKey()); + } + return new JsonResult(ResultEnum.success.getKey(), getGoldControl(userAsset, goldRule, false)); + } + + /** + * 签到 + */ + @Override + public JsonResult signin(Integer userId) { + UserAsset userAsset = userAssetDao.get(userId); + if(userAsset==null){ + return new JsonResult(ResultEnum.error402.getKey()); + } + //签到 + String ruleType = GoldGetTypeEnum.everyDaySignin.getKey(); + GoldTask goldRule = cacheService.getGoldRule(ruleType); + if(goldRule==null || !goldRule.getState().equals(BooleanEnum.YES.getKey())){ + return new JsonResult(ResultEnum.error402.getKey()); + } + return new JsonResult(ResultEnum.success.getKey(), getGoldControl(userAsset, goldRule, true)); + } + + /** + * 砸金蛋 + */ + @Override + public JsonResult hitGoldenEgg(Integer userId) { + UserAsset userAsset = userAssetDao.get(userId); + if(userAsset==null){ + return new JsonResult(ResultEnum.error402.getKey()); + } + //砸金蛋 + String ruleType = GoldGetTypeEnum.hitGoldenEgg.getKey(); + GoldTask goldRule = cacheService.getGoldRule(ruleType); + if(goldRule==null){ + return new JsonResult(ResultEnum.error402.getKey()); + } + //连续签到7天才能砸金蛋 + Integer keepNum = userAsset.getKeepSigninNum(); + String lastDate = userAsset.getLastSigninDate(); + if(keepNum==7 && lastDate.equals(IfishUtil.format1(new Date()))){ + return new JsonResult(ResultEnum.success.getKey(), getGoldControl(userAsset, goldRule, false)); + } + else{ + //日期 + Calendar calendar = Calendar.getInstance(); + //今天 + Date date = calendar.getTime(); + String today = IfishUtil.format1(date); + //昨天 + calendar.add(Calendar.DAY_OF_MONTH, -1); + String yesterday = IfishUtil.format1(calendar.getTime()); + //查询 + return new JsonResult(ResultEnum.success.getKey(), getUserAssetInfo(userAsset, new BigDecimal(0), today, yesterday)); + } + } + + /** + * 金币获取记录 + */ + @Override + public PageingDto getGoldGetRecordByPage(PageParam pageParam) { + Integer firstResult = pageParam.getFirstResult(); + //根据ID查询获取经验记录 + Pagination page = goldGetRecordDao.findByCriteria(firstResult, pageParam.getPageSize(), Order.desc("recordId"),Restrictions.eq("userId", pageParam.getUserId())); + List goldRecordList = page.getList(); + firstResult+=goldRecordList.size(); + //数据封装 + List recordList = new ArrayList(); + for (GoldGetRecord record : goldRecordList) { + RuleRecordDto recordDto = new RuleRecordDto(record.getRecordId(), record.getAddValue().toString(), record.getRecordRemark(), IfishUtil.format1(record.getCreateTime())); + recordList.add(recordDto); + } + //分页数据封装 + PageingDto pageingData = new PageingDto(ResultEnum.success.getKey(), firstResult, page.getTotalCount(), recordList); + return pageingData; + } + /** + * 金币消耗记录 + */ + @Override + public PageingDto getGoldExpendRecordByPage(PageParam pageParam) { + Integer firstResult = pageParam.getFirstResult(); + //根据ID查询获取经验记录 + Pagination page = goldExpendRecordDao.findByCriteria(firstResult, pageParam.getPageSize(), Order.desc("recordId"),Restrictions.eq("userId", pageParam.getUserId())); + List goldRecordList = page.getList(); + firstResult+=goldRecordList.size(); + //数据封装 + List recordList = new ArrayList(); + for (GoldExpendRecord record : goldRecordList) { + RuleRecordDto recordDto = new RuleRecordDto(record.getRecordId(), record.getExpendValue().toString(), record.getRecordRemark(), IfishUtil.format1(record.getCreateTime())); + recordList.add(recordDto); + } + //分页数据封装 + return new PageingDto(ResultEnum.success.getKey(), firstResult, page.getTotalCount(), recordList); + } + + /** + * 爱鱼看看打赏 + */ + @Override + public JsonResult liveRoomReward(Integer userId, Integer userId2) { + //自己给自己打赏 + if(userId.equals(userId2)){ + throw new IfishException(ResultEnum.error401); + } + //打赏人用户 + UserAsset userAsset = userAssetDao.get(userId); + if(userAsset==null){ + throw new IfishException(ResultEnum.error402); + } + //被打赏人用户 + UserAsset userAsset2 = userAssetDao.get(userId2); + if(userAsset2==null){ + //之前注册用户赠送20金币 + BigDecimal gold = new BigDecimal(20); + userAsset2 = new UserAsset(userId2,gold); + userAssetDao.save(userAsset2); + //获取记录 + GoldGetRecord getRecord = new GoldGetRecord(userId2, GoldGetTypeEnum.registerGive.getKey(), gold, GoldGetTypeEnum.registerGive.getValue()); + goldGetRecordDao.save(getRecord); + } + //爱鱼看看打赏金币 + GoldTask goldTask = goldRuleDao.get(GoldGetTypeEnum.liveRoomPayTour.getKey()); + if(goldTask==null){ + throw new IfishException(ResultEnum.error402); + } + //打赏人金币 + BigDecimal goldValue = userAsset.getGoldValue(); + //打赏金币 + BigDecimal addValue = goldTask.getAddValue(); + //打赏人金币不足 + if(goldValue.compareTo(addValue)<0){ + JSONObject json = new JSONObject(); + json.put("goldValue", goldValue); + return ResultUtil.warn(ResultEnum.warn215.getKey(),json); + } + //打赏人扣除金币 + goldValue = goldValue.subtract(addValue); + userAsset.setGoldValue(goldValue); + //打赏人金币消耗记录 + GoldExpendRecord goldRecord = new GoldExpendRecord(userId, addValue, GoldExpendTypeEnum.liveRoomPayTour); + goldExpendRecordDao.save(goldRecord); + //被打赏人增加金币 + BigDecimal goldValue2 = userAsset2.getGoldValue(); + goldValue2 = goldValue2.add(addValue); + userAsset2.setGoldValue(goldValue2); + //金币获取记录 + GoldGetRecord getRecord = new GoldGetRecord(userId2,addValue,GoldGetTypeEnum.liveRoomPayTour); + goldGetRecordDao.save(getRecord); + //打赏金币数量 + BigDecimal totalGoldValue = goldGetRecordDao.getQuestionPayTourGoldValue(userId2); + //返回金币剩余数量 + JSONObject json = new JSONObject(); + json.put("userGoldValue", goldValue); + json.put("rewardValue", addValue); + json.put("totalGoldValue", totalGoldValue); + return ResultUtil.success(json); + } + +} diff --git a/src/main/java/com/ifish/serviceImpl/GradeServicempl.java b/src/main/java/com/ifish/serviceImpl/GradeServicempl.java new file mode 100644 index 0000000..3f44405 --- /dev/null +++ b/src/main/java/com/ifish/serviceImpl/GradeServicempl.java @@ -0,0 +1,221 @@ +package com.ifish.serviceImpl; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.hibernate.criterion.Order; +import org.hibernate.criterion.Restrictions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.alibaba.fastjson.JSONObject; +import com.ifish.dao.GradeControlDao; +import com.ifish.dao.GradeDao; +import com.ifish.dao.GradeRecordDao; +import com.ifish.dao.GradeRuleDao; +import com.ifish.dao.UserAssetDao; +import com.ifish.dto.JsonResult; +import com.ifish.dto.PageingDto; +import com.ifish.dto.RuleInfoDto; +import com.ifish.dto.RuleRecordDto; +import com.ifish.dto.UserAssetDto; +import com.ifish.entity.GradeControl; +import com.ifish.entity.GradeControlId; +import com.ifish.entity.GradeRecord; +import com.ifish.entity.GradeTask; +import com.ifish.entity.UserAsset; +import com.ifish.enums.AddTypeEnum; +import com.ifish.enums.BooleanEnum; +import com.ifish.enums.GradeGetTypeEnum; +import com.ifish.enums.ResultEnum; +import com.ifish.exception.IfishException; +import com.ifish.hibernate.Pagination; +import com.ifish.service.AsyncTaskService; +import com.ifish.service.CacheService; +import com.ifish.service.GoldService; +import com.ifish.service.GradeService; +import com.ifish.util.IfishUtil; +import com.ifish.validator.AddValueParam; +import com.ifish.validator.PageParam; + +/** + * 等级service + * @author Administrator + * + */ +@Service +@Transactional +public class GradeServicempl implements GradeService{ + + @Autowired + private GradeDao gradeDao; + @Autowired + private GradeRuleDao gradeRuleDao; + @Autowired + private GradeRecordDao gradeRecordDao; + @Autowired + private GradeControlDao gradeControlDao; + @Autowired + private GradeControlDao GradeControlDao; + @Autowired + private UserAssetDao userAssetDao; + @Autowired + private CacheService cacheService; + @Autowired + private GoldService goldService; + @Autowired + private AsyncTaskService asyncTaskService; + + /** + * 是否加过经验 + */ + @Override + public UserAssetDto getGradeControl(UserAsset userAsset, GradeTask gradeRule,boolean isLogin){ + Integer userId = userAsset.getUserId(); + String ruleType = gradeRule.getRuleType(); + //日期 + Calendar calendar = Calendar.getInstance(); + //今天 + Date date = calendar.getTime(); + String today = IfishUtil.format1(date); + //昨天 + calendar.add(Calendar.DAY_OF_MONTH, -1); + String yesterday = IfishUtil.format1(calendar.getTime()); + //控制信息 + GradeControlId id = new GradeControlId(userId, ruleType); + GradeControl control = gradeControlDao.get(id); + //加成类型 + String addType = gradeRule.getAddType(); + if(control==null){ + //加成一次或每天加成 + if(addType.equals(AddTypeEnum.once.getKey()) || addType.equals(AddTypeEnum.everyDay.getKey())){ + //新增控制今天加过经验 + control = new GradeControl(id, today, date); + gradeControlDao.save(control); + //加经验 + return addGradeValue(userAsset, gradeRule, today, yesterday, isLogin); + } + } + else{ + //每天加成并且今天未加过经验 + if(addType.equals(AddTypeEnum.everyDay.getKey()) && !control.getControlParam().equals(today)){ + //更新今天加过 + control.setControlParam(today); + control.setUpdateTime(date); + //加经验 + return addGradeValue(userAsset, gradeRule, today, yesterday, isLogin); + } + } + return goldService.getUserAssetInfo(userAsset, new BigDecimal(0), today, yesterday); + } + /** + * 加经验并保存记录 + * @param userAsset + * @param GradeTask + * @param today + * @param yesterday + * @return + */ + public UserAssetDto addGradeValue(UserAsset userAsset,GradeTask gradeRule,String today,String yesterday,boolean isLogin){ + Integer userId = userAsset.getUserId(); + String ruleType = gradeRule.getRuleType(); + //用户经验 + Integer gradeValue = userAsset.getGradeValue(); + //加经验值 + Integer addValue = gradeRule.getAddValue(); + //加经验 + gradeValue += addValue; + userAsset.setGradeValue(gradeValue); + //登陆则保存登陆日期 + if(isLogin){ + userAsset.setLastLoginDate(today); + } + //加经验值记录 + GradeRecord gradeRecord = new GradeRecord(userId, ruleType, addValue, gradeRule.getRuleRemark()); + gradeRecordDao.save(gradeRecord); + //用户动态 + asyncTaskService.saveUserActivity(userId, ruleType); + return goldService.getUserAssetInfo(userAsset, new BigDecimal(addValue), today, yesterday); + } + + /** + * 根据类型加经验 + */ + @Override + public JsonResult addGradeValue(AddValueParam addValueParam) { + //用户ID + UserAsset userAsset = userAssetDao.get(addValueParam.getUserId()); + if(userAsset==null){ + throw new IfishException(ResultEnum.error402); + } + //规则类型 + GradeTask gradeRule = cacheService.getGradeRule(addValueParam.getRuleType()); + //不存在和未返回给app的以及登陆的(在登陆时处理) + if(gradeRule==null || !gradeRule.getState().equals(BooleanEnum.YES.getKey()) || gradeRule.getRuleType().equals(GradeGetTypeEnum.everyDayLogin.getKey())){ + throw new IfishException(ResultEnum.error402); + } + return new JsonResult(ResultEnum.success.getKey(), getGradeControl(userAsset, gradeRule, false)); + } + + @Override + public PageingDto getGradeRecordByPage(PageParam pageParam) { + Integer firstResult = pageParam.getFirstResult(); + //根据ID查询获取经验记录 + Pagination page = gradeRecordDao.findByCriteria(firstResult, pageParam.getPageSize(), Order.desc("recordId"),Restrictions.eq("userId", pageParam.getUserId())); + List gradeRecordList = page.getList(); + firstResult+=gradeRecordList.size(); + //数据封装 + List recordList = new ArrayList(); + for (GradeRecord record : gradeRecordList) { + RuleRecordDto recordDto = new RuleRecordDto(record.getRecordId(), record.getAddValue().toString(), record.getRecordRemark(), IfishUtil.format1(record.getCreateTime())); + recordList.add(recordDto); + } + //分页数据封装 + PageingDto pageingData = new PageingDto(ResultEnum.success.getKey(), firstResult, page.getTotalCount(), recordList); + return pageingData; + } + + @Override + public JsonResult getGradeRuleInfo(Integer userId) { + //今天日期 + String today = IfishUtil.format1(new Date()); + //已完成任务规则 + List gradeControls = gradeControlDao.findByProperty(Restrictions.eq("gradeControlId.userId", userId),Restrictions.eq("controlParam", today)); + Map finishTask = new HashMap(); + for (GradeControl gradeControl : gradeControls) { + finishTask.put(gradeControl.getGradeControlId().getRuleType(), gradeControl.getControlParam()); + } + //规则信息 + List ruleInfoList = new ArrayList(); + //所有任务规则 + for (GradeTask gradeRule : cacheService.getGradeRuleList()) { + //类型 + String ruleType = gradeRule.getRuleType(); + //加成类型 + String addType = gradeRule.getAddType(); + //规则信息DTO + RuleInfoDto ruleInfoDto = new RuleInfoDto(ruleType, gradeRule.getRuleName(), addType, gradeRule.getAddValue().toString(), gradeRule.getRuleRemark(), BooleanEnum.NO.getKey()); + ruleInfoList.add(ruleInfoDto); + //任务是否完成 + String controlDate = finishTask.get(ruleType); + if(controlDate!=null){ + if(addType.equals(AddTypeEnum.once.getKey()) || (addType.equals(AddTypeEnum.everyDay.getKey()) && controlDate.equals(today))){ + ruleInfoDto.setIsFinish(BooleanEnum.YES.getKey()); + } + } + } + JSONObject json = new JSONObject(); + //规则信息 + json.put("gradeRules", ruleInfoList); + //等级信息 + json.put("grades", cacheService.getGradeList()); + return new JsonResult(ResultEnum.success.getKey(), json); + } + +} diff --git a/src/main/java/com/ifish/serviceImpl/IfishDoctorServiceImpl.java b/src/main/java/com/ifish/serviceImpl/IfishDoctorServiceImpl.java new file mode 100644 index 0000000..22440c6 --- /dev/null +++ b/src/main/java/com/ifish/serviceImpl/IfishDoctorServiceImpl.java @@ -0,0 +1,139 @@ +package com.ifish.serviceImpl; + +import java.math.BigDecimal; +import java.math.MathContext; +import java.math.RoundingMode; +import java.util.Date; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.ifish.dao.GoldExpendRecordDao; +import com.ifish.dao.GoldGetRecordDao; +import com.ifish.dao.GoldRuleDao; +import com.ifish.dao.IfishDoctorDao; +import com.ifish.dao.ShopsInfoDao; +import com.ifish.dao.UserAssetDao; +import com.ifish.dto.JsonResult; +import com.ifish.entity.GoldExpendRecord; +import com.ifish.entity.GoldGetRecord; +import com.ifish.entity.IfishDoctor; +import com.ifish.entity.UserAsset; +import com.ifish.enums.BooleanEnum; +import com.ifish.enums.GoldExpendTypeEnum; +import com.ifish.enums.GoldGetTypeEnum; +import com.ifish.enums.PayTourTypeEnum; +import com.ifish.enums.ResultEnum; +import com.ifish.exception.IfishException; +import com.ifish.netease.NeteaseIM; +import com.ifish.service.IfishDoctorService; +import com.ifish.util.IfishUtil; +import com.ifish.util.ResultUtil; + +@Service +@Transactional +public class IfishDoctorServiceImpl implements IfishDoctorService{ + + @Autowired + private GoldRuleDao goldRuleDao; + @Autowired + private UserAssetDao userAssetDao; + @Autowired + private GoldGetRecordDao goldGetRecordDao; + @Autowired + private GoldExpendRecordDao goldExpendRecordDao; + @Autowired + private IfishDoctorDao ifishDoctorDao; + @Autowired + private ShopsInfoDao shopsInfoDao; + @Autowired + private NeteaseIM neteaseIM; + + @Override + public Object saveIfishDoctor(IfishDoctor ifishDoctor) { + Integer userId = ifishDoctor.getUserId(); + String questionContent = ifishDoctor.getQuestionContent(); + if(userId!=null && questionContent!=null && questionContent.length()>0){ + ifishDoctor.setIsPayTour(BooleanEnum.NO.getKey()); + ifishDoctor.setPayTourSum(new BigDecimal(0)); + ifishDoctor.setCreateTime(new Date()); + this.ifishDoctorDao.save(ifishDoctor); + return IfishUtil.toJson(ResultEnum.success.getKey(), ""); + } + return IfishUtil.toJson(ResultEnum.fail101.getKey(), ""); + } + + @Override + public JsonResult payTourSubmitQuestion(IfishDoctor ifishDoctor,String payTour) { + Integer userId = ifishDoctor.getUserId(); + //打赏金额 + BigDecimal payTourSum = PayTourTypeEnum.getValue(payTour); + // + if(payTourSum==null){ + throw new IfishException(ResultEnum.error401); + } + //用户资产 + UserAsset userAsset = userAssetDao.get(userId); + if(userAsset==null){ + throw new IfishException(ResultEnum.warn211); + } + BigDecimal goldValue = userAsset.getGoldValue(); + //金币不足 + if(goldValue.compareTo(payTourSum)<0){ + JSONObject json = new JSONObject(); + json.put("goldValue", goldValue); + return ResultUtil.warn(ResultEnum.warn215.getKey(),json); + } + //平分金币给10个商家 + List userIds = shopsInfoDao.getShopsUserIdByRand(userId); + Integer size = userIds.size(); + if(size<=0){ + throw new IfishException(ResultEnum.warn218); + } + //保存问题 + ifishDoctor.setIsPayTour(BooleanEnum.YES.getKey()); + ifishDoctor.setPayTourSum(payTourSum); + ifishDoctor.setCreateTime(new Date()); + ifishDoctorDao.save(ifishDoctor); + //扣除金币 + goldValue = goldValue.subtract(payTourSum); + userAsset.setGoldValue(goldValue); + //金币消耗记录 + GoldExpendRecord goldRecord = new GoldExpendRecord(userId, payTourSum, GoldExpendTypeEnum.questionPayTour); + goldRecord.setRelationId(ifishDoctor.getQuestionId()); + goldExpendRecordDao.save(goldRecord); + //平分金币 + MathContext mc = new MathContext(2, RoundingMode.HALF_DOWN); + BigDecimal avgGoldValue = payTourSum.divide(new BigDecimal(size),mc); + //已注册用户赠送20金币 + BigDecimal gold = new BigDecimal(20); + for (Integer shopsUserId : userIds) { + UserAsset shopsUserAsset = userAssetDao.get(shopsUserId); + if(shopsUserAsset==null){ + shopsUserAsset = new UserAsset(shopsUserId, gold); + userAssetDao.save(shopsUserAsset); + //金币获取记录 + GoldGetRecord getRecord = new GoldGetRecord(shopsUserId,gold,GoldGetTypeEnum.registerGive); + goldGetRecordDao.save(getRecord); + } + //加金币 + BigDecimal shopsGoldValue = shopsUserAsset.getGoldValue(); + shopsGoldValue = shopsGoldValue.add(avgGoldValue); + shopsUserAsset.setGoldValue(shopsGoldValue); + //金币获取记录 + GoldGetRecord getRecord = new GoldGetRecord(shopsUserId,avgGoldValue,GoldGetTypeEnum.questionPayTour); + getRecord.setRelationId(ifishDoctor.getQuestionId()); + goldGetRecordDao.save(getRecord); + } + //发送云信通知 + neteaseIM.sendBatchMsg(userId.toString(),JSONArray.toJSONString(userIds), "【"+avgGoldValue+"金币打赏】来自鱼医生的提问:"+ifishDoctor.getQuestionContent()); + //返回金币剩余数量 + JSONObject json = new JSONObject(); + json.put("goldValue", goldValue); + return ResultUtil.success(json); + } +} diff --git a/src/main/java/com/ifish/serviceImpl/IfishGoodsServiceImpl.java b/src/main/java/com/ifish/serviceImpl/IfishGoodsServiceImpl.java new file mode 100644 index 0000000..73936ca --- /dev/null +++ b/src/main/java/com/ifish/serviceImpl/IfishGoodsServiceImpl.java @@ -0,0 +1,71 @@ +package com.ifish.serviceImpl; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.ifish.dao.IfishGoodsDao; +import com.ifish.dto.IfishGoodsDto; +import com.ifish.dto.JsonResult; +import com.ifish.entity.IfishGoods; +import com.ifish.enums.IfishShopPlaceEnum; +import com.ifish.enums.SubDirectoryEnum; +import com.ifish.service.CacheService; +import com.ifish.service.IfishGoodsService; +import com.ifish.util.IfishFilePath; +import com.ifish.util.ResultUtil; + +/** + * 商品管理service + * @author Administrator + * + */ +@Service +@Transactional +public class IfishGoodsServiceImpl implements IfishGoodsService { + + @Autowired + private IfishGoodsDao ifishGoodsDao; + @Autowired + private CacheService cacheService; + + /** + * 根据展示位置获取商品 + */ + @Override + public JsonResult getIfishGoodsByGoodsPlace(IfishShopPlaceEnum shopPlaceEnum) { + //商品信息list + List ifishGoodsList = cacheService.getIfishGoodsList(shopPlaceEnum.getKey()); + //封装返回 + List dtoList = new ArrayList(); + for (IfishGoods ifishGoods : ifishGoodsList) { + //商品信息DTO + IfishGoodsDto dto = new IfishGoodsDto(ifishGoods.getGoodsId(), ifishGoods.getShopName(), ifishGoods.getGoodsName(), + ifishGoods.getGoodsLink(), ifishGoods.getOriPrice(), ifishGoods.getPrePrice()); + dto.setIsTaobaoLink(ifishGoods.getIsTaobaoLink()); + dtoList.add(dto); + //商品图片地址 + String goodsPicture = IfishFilePath.getPath(SubDirectoryEnum.ifishGoods,ifishGoods.getGoodsPicture()); + dto.setGoodsPicture(goodsPicture); + } + return ResultUtil.success(dtoList); + } + + /** + * 增加商品点击数 + */ + @Override + public JsonResult addClickNum(Integer goodsId) { + IfishGoods ifishGoods = ifishGoodsDao.get(goodsId); + if(ifishGoods!=null){ + Integer clickNum = ifishGoods.getClickNum(); + ifishGoods.setClickNum(++clickNum); + ifishGoodsDao.update(ifishGoods); + } + return ResultUtil.success(); + } + +} diff --git a/src/main/java/com/ifish/serviceImpl/InformationServiceImpl.java b/src/main/java/com/ifish/serviceImpl/InformationServiceImpl.java new file mode 100644 index 0000000..8b3a85a --- /dev/null +++ b/src/main/java/com/ifish/serviceImpl/InformationServiceImpl.java @@ -0,0 +1,197 @@ +package com.ifish.serviceImpl; + +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.hibernate.criterion.Order; +import org.hibernate.criterion.Restrictions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.alibaba.fastjson.JSONObject; +import com.ifish.dao.CommentDao; +import com.ifish.dao.InformationDao; +import com.ifish.dao.InformationStatsDao; +import com.ifish.dao.UeditorDao; +import com.ifish.dao.UserDao; +import com.ifish.dto.InformationDto; +import com.ifish.dto.JsonResult; +import com.ifish.dto.PageingDto; +import com.ifish.entity.Comment; +import com.ifish.entity.Information; +import com.ifish.entity.InformationStats; +import com.ifish.entity.Ueditor; +import com.ifish.entity.User; +import com.ifish.enums.BooleanEnum; +import com.ifish.enums.SubDirectoryEnum; +import com.ifish.enums.ResultEnum; +import com.ifish.enums.UeditorTypeEnum; +import com.ifish.exception.IfishException; +import com.ifish.hibernate.Pagination; +import com.ifish.netease.NeteaseIM; +import com.ifish.service.InformationService; +import com.ifish.util.IfishFilePath; +import com.ifish.util.ResultUtil; +import com.ifish.validator.PageParam; + +@Service +@Transactional +public class InformationServiceImpl implements InformationService{ + + @Autowired + private UserDao userDao; + @Autowired + private UeditorDao ueditorDao; + @Autowired + private CommentDao commentDao; + @Autowired + private InformationDao informationDao; + @Autowired + private InformationStatsDao informStatsDao; + @Autowired + private NeteaseIM neteaseIM; + + @Override + public Object saveComment(Comment comment) { + Integer ueditorId = comment.getUeditorId(); + Integer userId = comment.getUserId(); + String commentContent = comment.getCommentContent(); + if(ueditorId!=null && userId!=null && commentContent!=null && commentContent.length()>0){ + Integer asUserId = comment.getAsUserId(); + if(asUserId!=null){ + if(!asUserId.equals(userId)){ + //发送云信消息给所@的用户 + neteaseIM.sendMsg(userId.toString(), asUserId.toString(), "来自资讯的回复:"+commentContent,""); + } + } + comment.setCreateTime(new Date()); + this.commentDao.save(comment); + return true; + } + return false; + } + + @Override + public Ueditor findUeditorById(Integer ueditorId) { + if(ueditorId!=null){ + return this.ueditorDao.get(ueditorId); + } + return null; + } + + @Override + public Map findCommentsByUeditorId(Integer ueditorId,Integer firstResult,Integer pageSize) { + if(ueditorId!=null){ + if(firstResult==null){ + firstResult = 0; + } + if(pageSize==null){ + pageSize = 10; + } + Pagination page = this.commentDao.findByCriteria(firstResult, pageSize, Order.desc("commentId"), Restrictions.eq("ueditorId", ueditorId)); + List commentList = page.getList(); + for (Comment comment : commentList) { + User user = this.userDao.get(comment.getUserId()); + if(user!=null){ + comment.setUserName(user.getNickName()); + comment.setUserImg(user.getUserImg()); + } + if(comment.getAsUserId()!=null){ + User tmpUser = this.userDao.get(comment.getAsUserId()); + if(tmpUser!=null){ + comment.setAsUserName("@"+tmpUser.getNickName()+" "); + } + else{ + comment.setAsUserName(""); + } + } + else{ + comment.setAsUserName(""); + } + } + firstResult+=commentList.size(); + Map map = new HashMap(); + map.put("commentList", commentList); + map.put("firstResult", firstResult); + map.put("totalCount", page.getTotalCount()); + return map; + } + else{ + return null; + } + } + + /** + * 分页获取资讯 + */ + @Override + public PageingDto getInformationsByPage(PageParam pageParam) { + //分页获取数据 + Integer firstResult = pageParam.getFirstResult(); + Pagination page = informationDao.findByCriteria(firstResult, pageParam.getPageSize(),Order.desc("infoId"),Restrictions.eq("appShow", BooleanEnum.YES.getKey())); + List list = page.getList(); + firstResult+=list.size(); + //数据封装 + List dtoList = new ArrayList(); + for (Information info : list) { + //资讯ID + Integer infoId = info.getInfoId(); + InformationDto dto = new InformationDto(infoId); + dtoList.add(dto); + //标题内容图片 + dto.setTitle(info.getTitle()); + dto.setContents(info.getContents()); + dto.setImage(IfishFilePath.getPath(SubDirectoryEnum.information,info.getImage())); + //点击数 + InformationStats infoStats = informStatsDao.get(infoId); + if(infoStats!=null){ + dto.setClickNum(infoStats.getClickNum()); + } + //编辑器 + Integer ueditorId = info.getUeditorId(); + if(ueditorId!=null){ + //链接 + StringBuilder link = new StringBuilder(IfishFilePath.getPath(SubDirectoryEnum.ueditorHtml,info.getLink())); + //是否可以评论,可以评论则拼接用户ID + if(UeditorTypeEnum.yespinglun.getKey().equals(info.getUeditorType())){ + link.append("&userId="+pageParam.getUserId()); + } + //标题链接 + dto.setLink(link.toString()); + //评论数 + Integer pinglunNum = commentDao.getPinglunNum(ueditorId); + dto.setPinglunNum(pinglunNum); + } + else{ + dto.setLink(info.getLink()); + } + } + //分页数据封装 + return new PageingDto(ResultEnum.success.getKey(), firstResult, page.getTotalCount(), dtoList); + } + + /** + * 加点击数 + */ + @Override + public JsonResult addClickNum(Integer infoId) { + //资讯统计信息 + InformationStats informStats = informStatsDao.get(infoId); + if(informStats==null){ + throw new IfishException(ResultEnum.error402); + } + Integer cNum = informStats.getClickNum(); + informStats.setClickNum(++cNum); + informStatsDao.update(informStats); + //返回数据 + JSONObject json = new JSONObject(); + json.put("infoId", informStats.getInfoId()); + json.put("clickNum", informStats.getClickNum()); + return ResultUtil.success(json); + } + +} \ No newline at end of file diff --git a/src/main/java/com/ifish/serviceImpl/LiveRoomServiceImpl.java b/src/main/java/com/ifish/serviceImpl/LiveRoomServiceImpl.java new file mode 100644 index 0000000..0ef807c --- /dev/null +++ b/src/main/java/com/ifish/serviceImpl/LiveRoomServiceImpl.java @@ -0,0 +1,554 @@ +package com.ifish.serviceImpl; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang3.StringUtils; +import org.hibernate.criterion.Order; +import org.hibernate.criterion.Restrictions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.alibaba.fastjson.JSONObject; +import com.ifish.dao.BrowseRoomDao; +import com.ifish.dao.CameraDao; +import com.ifish.dao.CameraUserDao; +import com.ifish.dao.GoldGetRecordDao; +import com.ifish.dao.LiveBannerDao; +import com.ifish.dao.LiveMessageDao; +import com.ifish.dao.LiveRoomDao; +import com.ifish.dao.LiveRoomZanDao; +import com.ifish.dao.UserAssetDao; +import com.ifish.dao.UserDao; +import com.ifish.dto.JsonResult; +import com.ifish.dto.LiveRoomInfoDto; +import com.ifish.dto.PageingDto; +import com.ifish.entity.BrowseRoom; +import com.ifish.entity.BrowseRoomId; +import com.ifish.entity.CameraUser; +import com.ifish.entity.CameraUserId; +import com.ifish.entity.Grade; +import com.ifish.entity.LiveBanner; +import com.ifish.entity.LiveMessage; +import com.ifish.entity.LiveRoom; +import com.ifish.entity.LiveRoomZan; +import com.ifish.entity.LiveRoomZanId; +import com.ifish.entity.User; +import com.ifish.entity.UserAsset; +import com.ifish.enums.BooleanEnum; +import com.ifish.enums.ResultEnum; +import com.ifish.enums.RoomStatusEnum; +import com.ifish.exception.IfishException; +import com.ifish.hibernate.Pagination; +import com.ifish.netease.NeteaseIM; +import com.ifish.service.AsyncTaskService; +import com.ifish.service.CacheService; +import com.ifish.service.LiveRoomService; +import com.ifish.util.IfishUtil; +import com.ifish.util.ResultUtil; +import com.ifish.validator.LiveRoomParam; +import com.ifish.validator.PageParam; + +@Service +@Transactional +public class LiveRoomServiceImpl implements LiveRoomService { + + @Autowired + private UserDao userDao; + @Autowired + private CameraDao cameraDao; + @Autowired + private NeteaseIM neteaseIM; + @Autowired + private LiveRoomDao liveRoomDao; + @Autowired + private UserAssetDao userAssetDao; + @Autowired + private CacheService cacheService; + @Autowired + private CameraUserDao cameraUserDao; + @Autowired + private LiveBannerDao liveBannerDao; + @Autowired + private BrowseRoomDao browseRoomDao; + @Autowired + private LiveMessageDao liveMessageDao; + @Autowired + private LiveRoomZanDao liveRoomZanDao; + @Autowired + private GoldGetRecordDao goldGetRecordDao; + @Autowired + private AsyncTaskService asyncTaskService; + + @Override + public JSONObject addLiveRoom(LiveRoomParam liveRoomParam) { + //用户ID + Integer userId = liveRoomParam.getUserId(); + User user = userDao.get(userId); + if (user == null) { + throw new IfishException(ResultEnum.error402); + } + //用户是否绑定摄像头 + String cameraId = liveRoomParam.getCameraId(); + CameraUserId cameraUserId = new CameraUserId(userId, cameraId); + CameraUser cameraUser = this.cameraUserDao.get(cameraUserId); + if (cameraUser == null) { + throw new IfishException(ResultEnum.error402); + } + //原来不是开启状态 + if (!BooleanEnum.YES.getKey().equals(cameraUser.getIsLive())) { + //开启直播 + cameraUser.setIsLive(BooleanEnum.YES.getKey()); + } + //新增直播间 + LiveRoom liveRoom = new LiveRoom(); + liveRoom.setUserId(userId); + liveRoom.setRoomName(liveRoomParam.getRoomName()); + liveRoom.setRoomDesc(liveRoomParam.getRoomDesc()); + liveRoom.setRoomStatus(liveRoomParam.getRoomStatus()); + liveRoom.setCreateTime(new Date()); + //首次开启分享则发送云信消息给所有用户 + /*if(!BooleanEnum.YES.getKey().equals(liveRoom.getFirstShare()) && RoomStatusEnum.status1.getKey().equals(liveRoom.getRoomStatus())){ + liveRoom.setFirstShare(BooleanEnum.YES.getKey()); + asyncTaskService.sendMsgToAll(userId); + } + else{*/ + liveRoom.setFirstShare(BooleanEnum.NO.getKey()); + //} + //人气值 + liveRoom.setPopularityValue(0); + //摄像头ID + liveRoomDao.save(liveRoom); + Integer roomId = liveRoom.getRoomId(); + JSONObject json = new JSONObject(); + json.put("cameraId", cameraId); + json.put("isLive", cameraUser.getIsLive()); + json.put("roomId", roomId); + return json; + } + + @Override + public JsonResult updateLiveRoom(Integer roomId, LiveRoomParam liveRoomParam) { + //查找直播间信息 + LiveRoom curLiveRoom = this.liveRoomDao.get(roomId); + if (curLiveRoom == null) { + throw new IfishException(ResultEnum.error402); + } + //用户ID + Integer userId = liveRoomParam.getUserId(); + //摄像头 + String cameraId = liveRoomParam.getCameraId(); + //用户是否绑定摄像头 + CameraUserId cameraUserId = new CameraUserId(userId, cameraId); + CameraUser cameraUser = this.cameraUserDao.get(cameraUserId); + if (cameraUser == null) { + throw new IfishException(ResultEnum.error402); + } + //返回摄像头信息 + List list = new ArrayList(); + //原来不是开启状态 + if (!BooleanEnum.YES.getKey().equals(cameraUser.getIsLive())) { + //开启直播 + cameraUser.setIsLive(BooleanEnum.YES.getKey()); + //关闭其他摄像头直播 + List cameraUserList = this.cameraUserDao.findByProperty(Restrictions.eq("cameraUserId.userId", userId), Restrictions.ne("cameraUserId.cameraId", cameraId)); + for (CameraUser curCameraUser : cameraUserList) { + curCameraUser.setIsLive(BooleanEnum.NO.getKey()); + JSONObject json = new JSONObject(); + json.put("cameraId", curCameraUser.getCameraUserId().getCameraId()); + json.put("isLive", curCameraUser.getIsLive()); + list.add(json); + } + } + //返回摄像头直播状态 + JSONObject json = new JSONObject(); + json.put("cameraId", cameraId); + json.put("isLive", cameraUser.getIsLive()); + list.add(json); + //更新直播间信息 + curLiveRoom.setRoomName(liveRoomParam.getRoomName()); + curLiveRoom.setRoomDesc(liveRoomParam.getRoomDesc()); + curLiveRoom.setRoomStatus(liveRoomParam.getRoomStatus()); + //首次开启分享则发送云信消息给所有用户 + /*if(!BooleanEnum.YES.getKey().equals(curLiveRoom.getFirstShare()) && RoomStatusEnum.status1.getKey().equals(liveRoomParam.getRoomStatus())){ + curLiveRoom.setFirstShare(BooleanEnum.YES.getKey()); + asyncTaskService.sendMsgToAll(userId); + }*/ + return ResultUtil.success(list); + } + + @Override + public Object popularityValue(Integer roomId, Integer userId) { + if (roomId != null && userId != null) { + //浏览直播间记录 + BrowseRoomId browseRoomId = new BrowseRoomId(roomId, userId); + BrowseRoom browseRoom = this.browseRoomDao.get(browseRoomId); + Date date = new Date(); + //新增浏览记录 + if (browseRoom != null) { + browseRoom.setUpdateTime(date); + this.browseRoomDao.update(browseRoom); + } else { + //更新浏览记录 + browseRoom = new BrowseRoom(); + browseRoom.setBrowseRoomId(browseRoomId); + browseRoom.setUpdateTime(date); + browseRoom.setCreateTime(date); + this.browseRoomDao.save(browseRoom); + } + //查找直播间信息 + LiveRoom curLiveRoom = this.liveRoomDao.get(roomId); + if (curLiveRoom != null) { + Integer popularityValue = curLiveRoom.getPopularityValue(); + //人气值加一 + popularityValue++; + curLiveRoom.setPopularityValue(popularityValue); + this.liveRoomDao.update(curLiveRoom); + Map map = new HashMap(); + map.put("roomId", roomId); + map.put("popularityValue", popularityValue); + return IfishUtil.toJson(ResultEnum.success.getKey(), popularityValue); + } + } + return IfishUtil.toJson(ResultEnum.fail101.getKey(), ""); + } + + @Override + public Object getLiveRoomInfo(Integer userId) { + if (userId != null) { + //查找直播间信息 + LiveRoom curLiveRoom = this.liveRoomDao.findUniqueByProperty(Restrictions.eq("userId", userId)); + if (curLiveRoom != null) { + Map map = new HashMap(); + Integer roomId = curLiveRoom.getRoomId(); + map.put("roomId", roomId); + map.put("userId", curLiveRoom.getUserId()); + map.put("roomName", curLiveRoom.getRoomName()); + map.put("roomDesc", curLiveRoom.getRoomDesc()); + map.put("popularityValue", curLiveRoom.getPopularityValue()); + map.put("roomStatus", curLiveRoom.getRoomStatus()); + return IfishUtil.toJson(ResultEnum.success.getKey(), map); + } + } + return IfishUtil.toJson(ResultEnum.success.getKey(), ""); + } + + @Override + public Object getLiveRoomsByPage(Integer firstResult, Integer pageSize, Integer userId, String orders) { + if (firstResult != null && pageSize != null && userId != null) { + Map returnMap = new HashMap(); + LinkedHashMap map = new LinkedHashMap(); + if (firstResult == 0) { + User user = this.userDao.get(userId); + if (user != null) { + //经度 + Double longitude = user.getLongitude(); + //纬度 + Double latitude = user.getLatitude(); + //距离用户最近的前5条记录 + List distanceList = this.liveRoomDao.findByDistance(longitude, latitude); + for (LiveRoomInfoDto liveRoomInfo : distanceList) { + Integer roomId = liveRoomInfo.getRoomId(); + map.put(roomId, liveRoomInfo); + } + //获取用户最近浏览的5条记录 + List browseList = this.liveRoomDao.findByBrowse(userId); + for (LiveRoomInfoDto liveRoomInfo : browseList) { + Integer roomId = liveRoomInfo.getRoomId(); + map.put(roomId, liveRoomInfo); + } + //获取人气值最高的5条记录 + List popularityList = this.liveRoomDao.findByPopularityValue(); + for (LiveRoomInfoDto liveRoomInfo : popularityList) { + Integer roomId = liveRoomInfo.getRoomId(); + map.put(roomId, liveRoomInfo); + } + //去重条件 + orders = StringUtils.join(map.keySet().toArray(), ","); + //根据开播时间倒序排列 + Pagination page = this.liveRoomDao.findByTime(firstResult, pageSize, orders); + List timeList = page.getList(); + for (LiveRoomInfoDto liveRoomInfo : timeList) { + Integer roomId = liveRoomInfo.getRoomId(); + map.put(roomId, liveRoomInfo); + } + List list = new ArrayList(); + Long curTime = new Date().getTime(); + //计算活跃值 + for (LiveRoomInfoDto liveRoomInfo : map.values()) { + Long loginTime = liveRoomInfo.getLoginTime().getTime(); + //最近登录天数 + Integer days = (int) ((curTime - loginTime) / (1000 * 60 * 60 * 24)); + //小于一周 + if (days <= 7) { + liveRoomInfo.setLiveness("优"); + } //一周至半个月 + else if (days > 7 && days <= 15) { + liveRoomInfo.setLiveness("良"); + } //半个月至一个月 + else if (days > 15 && days <= 30) { + liveRoomInfo.setLiveness("中"); + } else { + liveRoomInfo.setLiveness("差"); + } + list.add(liveRoomInfo); + } + returnMap.put("orders", orders); + returnMap.put("total", page.getTotalCount()); + returnMap.put("liveRoomInfo", list); + return IfishUtil.toJson(ResultEnum.success.getKey(), returnMap); + } + } else { + //根据开播时间倒序排列 + Pagination page = this.liveRoomDao.findByTime(firstResult, pageSize, orders); + List timeList = page.getList(); + Long curTime = new Date().getTime(); + //计算活跃值 + for (LiveRoomInfoDto liveRoomInfo : timeList) { + Long loginTime = liveRoomInfo.getLoginTime().getTime(); + //最近登录天数 + Integer days = (int) ((curTime - loginTime) / (1000 * 60 * 60 * 24)); + //小于一周 + if (days <= 7) { + liveRoomInfo.setLiveness("优"); + } //一周至半个月 + else if (days > 7 && days <= 15) { + liveRoomInfo.setLiveness("良"); + } //半个月至一个月 + else if (days > 15 && days <= 30) { + liveRoomInfo.setLiveness("中"); + } else { + liveRoomInfo.setLiveness("差"); + } + } + returnMap.put("orders", orders); + returnMap.put("total", page.getTotalCount()); + returnMap.put("liveRoomInfo", timeList); + return IfishUtil.toJson(ResultEnum.success.getKey(), returnMap); + } + } + return IfishUtil.toJson(ResultEnum.fail101.getKey(), ""); + } + + @Override + public List getLiveBanners() { + //app展示的banner图 + List list = this.liveBannerDao.findByProperty(Order.desc("bannerId"), Restrictions.eq("appShow", BooleanEnum.YES.getKey())); + return list; + } + + @Override + public Object leaveMessage(LiveMessage liveMessage) { + Integer roomId = liveMessage.getRoomId(); + Integer userId = liveMessage.getUserId(); + String messageContent = liveMessage.getMessageContent(); + if (roomId != null && userId != null && messageContent != null && messageContent.length() > 0) { + LiveRoom liveRoom = this.liveRoomDao.get(roomId); + User user = this.userDao.get(userId); + if (liveRoom != null && user != null) { + liveMessage.setCreateTime(new Date()); + this.liveMessageDao.save(liveMessage); + liveMessage.setUserName(user.getNickName()); + liveMessage.setUserImg(user.getUserImg()); + Integer asUserId = liveMessage.getAsUserId(); + if (asUserId != null) { + User asUser = this.userDao.get(asUserId); + if (asUser != null) { + liveMessage.setAsUserName(asUser.getNickName()); + if (!asUserId.equals(userId)) { + //发送云信消息给所@的用户 + neteaseIM.sendMsg(userId.toString(), asUserId.toString(), "来自爱鱼看看的回复:" + messageContent, ""); + } + } else { + Integer roomUserId = liveRoom.getUserId(); + if (!roomUserId.equals(userId)) { + //发送云信消息给房主 + neteaseIM.sendMsg(userId.toString(), roomUserId.toString(), "来自爱鱼看看的留言:" + messageContent, ""); + } + } + } + return IfishUtil.toJson(ResultEnum.success.getKey(), liveMessage); + } + } + return IfishUtil.toJson(ResultEnum.fail101.getKey(), ""); + } + + @Override + public Object getLiveMessageByPage(Integer firstResult, Integer pageSize, Integer roomId) { + if (firstResult == null) { + firstResult = 0; + } + if (pageSize == null) { + pageSize = 10; + } + //根据直播间ID分页获取留言信息 + Pagination page = this.liveMessageDao.findByCriteria(firstResult, pageSize, Order.desc("messageId"), Restrictions.eq("roomId", roomId)); + List list = page.getList(); + for (LiveMessage liveMessage : list) { + User user = this.userDao.get(liveMessage.getUserId()); + if (user != null) { + liveMessage.setUserName(user.getNickName()); + liveMessage.setUserImg(user.getUserImg()); + } + if (liveMessage.getAsUserId() != null) { + User tmpUser = this.userDao.get(liveMessage.getAsUserId()); + if (tmpUser != null) { + liveMessage.setAsUserName(tmpUser.getNickName()); + } else { + liveMessage.setAsUserName(""); + } + } else { + liveMessage.setAsUserName(""); + } + } + firstResult += list.size(); + //分页数据封装 + PageingDto pageingData = new PageingDto(ResultEnum.success.getKey(), firstResult, page.getTotalCount(), list); + return pageingData; + } + + /** + * 按时间倒序分页获取直播间信息 + */ + @Override + public PageingDto getLiveRoomsByTime(PageParam pageParam) { + Integer firstResult = pageParam.getFirstResult(); + //按时间倒序 + Pagination page = this.liveRoomDao.findByTime(firstResult, pageParam.getPageSize(), null); + List list = page.getList(); + firstResult += list.size(); + //分页数据封装 + return new PageingDto(ResultEnum.success.getKey(), firstResult, page.getTotalCount(), getLiveRoomInfoDto(pageParam.getUserId(), list)); + } + + /** + * 按人气值倒序分页获取直播间信息 + */ + @Override + public PageingDto getLiveRoomsByPopularityValue(PageParam pageParam) { + Integer firstResult = pageParam.getFirstResult(); + //按时间倒序 + Pagination page = this.liveRoomDao.findByPopularityValue(firstResult, pageParam.getPageSize()); + List list = page.getList(); + firstResult += list.size(); + //分页数据封装 + return new PageingDto(ResultEnum.success.getKey(), firstResult, page.getTotalCount(), getLiveRoomInfoDto(pageParam.getUserId(), list)); + } + + @Override + public PageingDto getLiveRoomsByTuijian(PageParam pageParam) { + Integer firstResult = pageParam.getFirstResult(); + //按时间倒序 + Pagination page = this.liveRoomDao.getLiveRoomsByTuijian(firstResult, pageParam.getPageSize()); + List list = page.getList(); + firstResult += list.size(); + //分页数据封装 + return new PageingDto(ResultEnum.success.getKey(), firstResult, page.getTotalCount(), getLiveRoomInfoDto(pageParam.getUserId(), list)); + } + + /** + * 封装数据 + * + * @param userId + * @param list + * @return + */ + public List getLiveRoomInfoDto(Integer userId, List list) { + Long curTime = new Date().getTime(); + for (LiveRoomInfoDto liveRoomInfo : list) { + Integer roomId = liveRoomInfo.getRoomId(); + Integer roomUserId = liveRoomInfo.getUserId(); + //是否点赞 + LiveRoomZanId id = new LiveRoomZanId(roomId, userId); + LiveRoomZan zan = liveRoomZanDao.get(id); + if (zan == null) { + liveRoomInfo.setIsZan(BooleanEnum.NO.getKey()); + } else { + liveRoomInfo.setIsZan(BooleanEnum.YES.getKey()); + } + //点赞数量 + liveRoomInfo.setZanNum(liveRoomZanDao.getZanNum(roomId)); + //评论数 + liveRoomInfo.setPinglunNum(liveMessageDao.getLiveMessageCount(roomId)); + //打赏金币数量 + BigDecimal goldValue = goldGetRecordDao.getQuestionPayTourGoldValue(roomUserId); + if (goldValue != null) { + liveRoomInfo.setTotalGoldValue(goldValue); + } else { + liveRoomInfo.setTotalGoldValue(new BigDecimal(0)); + } + //等级 + UserAsset userAsset = userAssetDao.get(roomUserId); + liveRoomInfo.setGradeNum(0); + if (userAsset != null) { + //经验值 + Integer gradeValue = userAsset.getGradeValue(); + //等级 + for (Grade grade : cacheService.getGradeList()) { + if (gradeValue >= grade.getMinValue() && gradeValue < grade.getMaxValue()) { + liveRoomInfo.setGradeNum(grade.getGradeNum()); + break; + } + } + } + //最近登录天数 + Long loginTime = liveRoomInfo.getLoginTime().getTime(); + Integer days = (int) ((curTime - loginTime) / (1000 * 60 * 60 * 24)); + //小于一周 + if (days <= 7) { + liveRoomInfo.setLiveness("优"); + } //一周至半个月 + else if (days > 7 && days <= 15) { + liveRoomInfo.setLiveness("良"); + } //半个月至一个月 + else if (days > 15 && days <= 30) { + liveRoomInfo.setLiveness("中"); + } else { + liveRoomInfo.setLiveness("差"); + } + } + return list; + } + + /** + * 点赞/取消点赞 + */ + @Override + public JsonResult liveRoomsZan(Integer roomId, Integer userId) { + //点赞数量 + Integer zanNum = liveRoomZanDao.getZanNum(roomId); + //是否点过赞 + LiveRoomZanId id = new LiveRoomZanId(roomId, userId); + LiveRoomZan zan = liveRoomZanDao.get(id); + JSONObject json = new JSONObject(); + if (zan == null) { + LiveRoom liveRoom = liveRoomDao.get(roomId); + if (liveRoom == null) { + throw new IfishException(ResultEnum.error402); + } + User user = userDao.get(userId); + if (user == null) { + throw new IfishException(ResultEnum.error402); + } + //点赞 + zan = new LiveRoomZan(id); + liveRoomZanDao.save(zan); + json.put("isZan", BooleanEnum.YES.getKey()); + zanNum++; + } else { + //取消点赞 + liveRoomZanDao.delete(zan); + json.put("isZan", BooleanEnum.NO.getKey()); + zanNum--; + } + json.put("zanNum", zanNum); + return ResultUtil.success(json); + } + +} diff --git a/src/main/java/com/ifish/serviceImpl/PageListServiceImpl.java b/src/main/java/com/ifish/serviceImpl/PageListServiceImpl.java new file mode 100644 index 0000000..cda805e --- /dev/null +++ b/src/main/java/com/ifish/serviceImpl/PageListServiceImpl.java @@ -0,0 +1,39 @@ +package com.ifish.serviceImpl; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.ifish.dao.PushListDao; +import com.ifish.dao.UserDao; +import com.ifish.dto.ShopsLookUserDto; +import com.ifish.entity.PushList; +import com.ifish.hibernate.Pagination; +import com.ifish.service.PageListService; + +/** + * @ClassName: PageListServiceImpl + * @Description: TODO + * @author ggw + * + */ +@Service +@Transactional +public class PageListServiceImpl implements PageListService { + + @Autowired + private PushListDao pushListDao; + @Autowired + private UserDao userDao; + + @Override + public Pagination getPushListByPage(Integer pushId, Integer userId, Integer firstResult, Integer pageSize) { + return pushListDao.findByCriteria(pushId, userId, firstResult, pageSize); + } + + @Override + public Pagination getLookListByPage(Integer shopsUserId,Integer firstResult, Integer pageSize) { + return userDao.findByCriteria(shopsUserId, firstResult, pageSize); + } + +} diff --git a/src/main/java/com/ifish/serviceImpl/ShopsServiceImpl.java b/src/main/java/com/ifish/serviceImpl/ShopsServiceImpl.java new file mode 100644 index 0000000..9e30078 --- /dev/null +++ b/src/main/java/com/ifish/serviceImpl/ShopsServiceImpl.java @@ -0,0 +1,475 @@ +package com.ifish.serviceImpl; + +import java.io.File; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.hibernate.criterion.Order; +import org.hibernate.criterion.Restrictions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import com.ifish.dao.CameraUserDao; +import com.ifish.dao.DeviceUserDao; +import com.ifish.dao.ShopsInfoDao; +import com.ifish.dao.ShopsUserInfoDao; +import com.ifish.dao.UserDao; +import com.ifish.dto.JsonResult; +import com.ifish.dto.PageingDto; +import com.ifish.dto.ShopsListDto; +import com.ifish.dto.ShopsUserDto; +import com.ifish.dto.ShopsUserInfoDto; +import com.ifish.entity.CameraUser; +import com.ifish.entity.ShopsInfo; +import com.ifish.entity.ShopsUserInfo; +import com.ifish.entity.ShopsUserInfoId; +import com.ifish.entity.User; +import com.ifish.enums.BooleanEnum; +import com.ifish.enums.MemberLevelEnum; +import com.ifish.enums.PushTypeEnum; +import com.ifish.enums.ResultEnum; +import com.ifish.enums.ShopsStatusEnum; +import com.ifish.enums.UserTypeEnum; +import com.ifish.exception.IfishException; +import com.ifish.hibernate.Pagination; +import com.ifish.mail.Mail; +import com.ifish.netease.NeteaseIM; +import com.ifish.service.AsyncTaskService; +import com.ifish.service.ShopsService; +import com.ifish.util.IfishFilePath; +import com.ifish.util.IfishUtil; +import com.ifish.util.ResultUtil; +import com.ifish.validator.PageParam; +import com.ifish.validator.ShopsUserInfoParam; + +@Service +@Transactional +public class ShopsServiceImpl implements ShopsService{ + + @Autowired + private UserDao userDao; + @Autowired + private NeteaseIM neteaseIM; + @Autowired + private ShopsInfoDao shopsInfoDao; + @Autowired + private CameraUserDao cameraUserDao; + @Autowired + private DeviceUserDao deviceUserDao; + @Autowired + private ShopsUserInfoDao shopsUserInfoDao; + @Autowired + private AsyncTaskService asyncTaskService; + + @Override + public Object getShopsInfoByPage(Integer userId,Integer firstResult, Integer pageSize) { + if(userId!=null){ + if(firstResult==null){ + firstResult=0; + } + if(pageSize==null){ + pageSize=10; + } + User user = this.userDao.get(userId); + Pagination page = this.shopsInfoDao.findByDistance(user.getLongitude(), user.getLatitude(), firstResult, pageSize); + Map returnMap = new HashMap(); + returnMap.put("result", ResultEnum.success.getKey()); + returnMap.put("total", page.getTotalCount()); + returnMap.put("data", page.getList()); + return returnMap; + } + return IfishUtil.toJson(ResultEnum.fail101.getKey(), ""); + } + + @Override + public Object choiceShops(Integer shopsUserId, Integer userId) { + //普通用户 + User user = this.userDao.get(userId); + if(user==null){ + throw new IfishException(ResultEnum.error402); + } + //商家用户 + User shopsUser = this.userDao.get(shopsUserId); + if(shopsUser==null){ + throw new IfishException(ResultEnum.error402); + } + //商家信息 + ShopsInfo shopsInfo = this.shopsInfoDao.findUniqueByProperty(Restrictions.eq("userId", shopsUserId)); + if(shopsInfo==null){ + throw new IfishException(ResultEnum.error402); + } + //是商家类型用户 + if(shopsUser.getUserType().equals(UserTypeEnum.userType1.getKey())){ + //选择商家 + user.setShopsUserId(shopsUserId); + this.userDao.update(user); + //摄像头默认开启看护 + List CameraUserList = cameraUserDao.findByProperty(Restrictions.eq("cameraUserId.userId", userId)); + for (CameraUser cameraUser : CameraUserList) { + cameraUser.setIsLook(BooleanEnum.YES.getKey()); + cameraUserDao.update(cameraUser); + } + //成为商家会员 + ShopsUserInfoId id = new ShopsUserInfoId(shopsInfo.getShopsId(), userId); + ShopsUserInfo tmp = shopsUserInfoDao.get(id); + if(tmp==null){ + //新增商家用户信息 + tmp = new ShopsUserInfo(id, MemberLevelEnum.level_1.getKey()); + tmp.setUserName(user.getNickName()); + tmp.setPhoneNumber(user.getPhoneNumber()); + shopsUserInfoDao.save(tmp); + //发送云信息消息 + asyncTaskService.sendMsgToShopsUser(userId, shopsUserId, user.getNickName()); + } + //发送云信消息 + neteaseIM.sendMsg(IfishFilePath.ifish_account, shopsUserId.toString(), "【"+PushTypeEnum.shops_push.getValue()+"】恭喜,["+user.getNickName()+"]已经将你锁定为他的看护商家,快去看看吧",""); + return IfishUtil.toJson(ResultEnum.success.getKey(), getShoppsInfo(shopsInfo, shopsUser)); + } + return IfishUtil.toJson(ResultEnum.fail101.getKey(), ""); + } + + @Override + public Object removeLook(Integer userId) { + if(userId!=null){ + User user = this.userDao.get(userId); + if(user!=null){ + //解除看护关系 + user.setShopsUserId(null); + this.userDao.update(user); + List cameraUserList = this.cameraUserDao.findByProperty(Restrictions.eq("isLook", BooleanEnum.YES.getKey())); + for (CameraUser cameraUser : cameraUserList) { + cameraUser.setIsLook(BooleanEnum.NO.getKey()); + this.cameraUserDao.update(cameraUser); + } + return IfishUtil.toJson(ResultEnum.success.getKey(), ""); + } + } + return IfishUtil.toJson(ResultEnum.fail101.getKey(), ""); + } + + @Override + public Object saveShopsInfo(ShopsInfo shopsInfo,MultipartFile file1,MultipartFile file2,MultipartFile file3) { + //用户ID + Integer userId = shopsInfo.getUserId(); + User user = this.userDao.get(userId); + if(user==null){ + return IfishUtil.returnJson(ResultEnum.warn211.getKey(), ""); + } + //验证图片格式 + if(!file1.isEmpty() && !file2.isEmpty() && !file3.isEmpty()) { + try { + if(!file1.getOriginalFilename().equals("")){ + File picFile = new File(IfishFilePath.path_shops+"/"+userId, "1.png"); + //不存在则创建 + if(!picFile.exists()){ + picFile.mkdirs(); + } + //保存 + file1.transferTo(picFile); + } + if(!file2.getOriginalFilename().equals("")){ + File picFile = new File(IfishFilePath.path_shops+"/"+userId, "2.png"); + //不存在则创建 + if(!picFile.exists()){ + picFile.mkdirs(); + } + //保存 + file2.transferTo(picFile); + } + if(!file3.getOriginalFilename().equals("")){ + File picFile = new File(IfishFilePath.path_shops+"/"+userId, "3.png"); + //不存在则创建 + if(!picFile.exists()){ + picFile.mkdirs(); + } + //保存 + file3.transferTo(picFile); + } + //保存商家信息 + shopsInfo.setPicture1("1.png"); + shopsInfo.setPicture2("2.png"); + shopsInfo.setPicture3("3.png"); + shopsInfo.setStatus(ShopsStatusEnum.status2.getKey()); + shopsInfo.setUpdateTime(new Date()); + shopsInfo.setCreateTime(new Date()); + this.shopsInfoDao.save(shopsInfo); + //发送邮件 + Mail.send(user.getNickName()+"("+user.getPhoneNumber()+")提交审核了", "有提交新的审核!"); + return IfishUtil.returnJson(ResultEnum.success.getKey(), getShoppsInfo(shopsInfo, user)); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + @Override + public Object updateShopsInfo(ShopsInfo shopsInfo, MultipartFile file1,MultipartFile file2, MultipartFile file3) { + ShopsInfo tmpShopsInfo = this.shopsInfoDao.get(shopsInfo.getShopsId()); + if(tmpShopsInfo!=null){ + Integer userId = tmpShopsInfo.getUserId(); + try { + if(file1!=null && !file1.isEmpty() && !file1.getOriginalFilename().equals("")){ + File picFile = new File(IfishFilePath.path_shops+"/"+userId, "1.png"); + //不存在则创建 + if(!picFile.exists()){ + picFile.mkdirs(); + } + //保存 + file1.transferTo(picFile); + } + if(file2!=null && !file2.isEmpty() && !file2.getOriginalFilename().equals("")){ + File picFile = new File(IfishFilePath.path_shops+"/"+userId, "2.png"); + //不存在则创建 + if(!picFile.exists()){ + picFile.mkdirs(); + } + //保存 + file2.transferTo(picFile); + } + if(file3!=null && !file3.isEmpty() && !file3.getOriginalFilename().equals("")){ + File picFile = new File(IfishFilePath.path_shops+"/"+userId, "3.png"); + //不存在则创建 + if(!picFile.exists()){ + picFile.mkdirs(); + } + //保存 + file3.transferTo(picFile); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + //保存商家信息 + tmpShopsInfo.setShopsName(shopsInfo.getShopsName()); + tmpShopsInfo.setUserName(shopsInfo.getUserName()); + tmpShopsInfo.setShopsPhone(shopsInfo.getShopsPhone()); + tmpShopsInfo.setShopsProvince(shopsInfo.getShopsProvince()); + tmpShopsInfo.setShopsCity(shopsInfo.getShopsCity()); + tmpShopsInfo.setShopsArea(shopsInfo.getShopsArea()); + tmpShopsInfo.setShopsAddress(shopsInfo.getShopsAddress()); + tmpShopsInfo.setStatus(ShopsStatusEnum.status2.getKey()); + tmpShopsInfo.setWeixinCode(shopsInfo.getWeixinCode()); + tmpShopsInfo.setShopLink(shopsInfo.getShopLink()); + tmpShopsInfo.setUpdateTime(new Date()); + this.shopsInfoDao.update(tmpShopsInfo); + User user = this.userDao.get(tmpShopsInfo.getUserId()); + //发送邮件 + Mail.send(user.getNickName()+"("+user.getPhoneNumber()+")重新提交审核了", "重新提交了新的审核!"); + return IfishUtil.returnJson(ResultEnum.success.getKey(), getShoppsInfo(tmpShopsInfo, user)); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + @Override + public Object updateBaseShopsInfo(ShopsInfo shopsInfo,MultipartFile file4) { + ShopsInfo tmpShopsInfo = this.shopsInfoDao.get(shopsInfo.getShopsId()); + if(tmpShopsInfo!=null){ + try{ + if(file4!=null && !file4.isEmpty() && !file4.getOriginalFilename().equals("")){ + File picFile = new File(IfishFilePath.path_shops+"/"+tmpShopsInfo.getUserId(), "4.png"); + //不存在则创建 + if(!picFile.exists()){ + picFile.mkdirs(); + } + //保存 + file4.transferTo(picFile); + tmpShopsInfo.setPicture4("4.png"); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + tmpShopsInfo.setShopsPhone(shopsInfo.getShopsPhone()); + tmpShopsInfo.setShopsProvince(shopsInfo.getShopsProvince()); + tmpShopsInfo.setShopsCity(shopsInfo.getShopsCity()); + tmpShopsInfo.setShopsArea(shopsInfo.getShopsArea()); + tmpShopsInfo.setShopsAddress(shopsInfo.getShopsAddress()); + tmpShopsInfo.setWeixinCode(shopsInfo.getWeixinCode()); + tmpShopsInfo.setShopLink(shopsInfo.getShopLink()); + tmpShopsInfo.setUpdateTime(new Date()); + this.shopsInfoDao.update(tmpShopsInfo); + User user = this.userDao.get(tmpShopsInfo.getUserId()); + return IfishUtil.returnJson(ResultEnum.success.getKey(), getShoppsInfo(tmpShopsInfo, user)); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + @Override + public Object getShopsStatus(Integer shopsId){ + ShopsInfo shopsInfo = this.shopsInfoDao.get(shopsId); + if(shopsInfo!=null){ + User user = this.userDao.get(shopsInfo.getUserId()); + return IfishUtil.returnJson(ResultEnum.success.getKey(), getShoppsInfo(shopsInfo, user)); + } + return IfishUtil.returnJson(ResultEnum.fail101.getKey(), ""); + } + + public Map getShoppsInfo(ShopsInfo shopsInfo,User user){ + Map shopsInfoMap = new HashMap(); + shopsInfoMap.put("shopsId", shopsInfo.getShopsId()); + shopsInfoMap.put("userId", shopsInfo.getUserId()); + shopsInfoMap.put("userImg", user.getUserImg()); + shopsInfoMap.put("userName", shopsInfo.getUserName()); + shopsInfoMap.put("shopsName", shopsInfo.getShopsName()); + shopsInfoMap.put("shopsPhone", shopsInfo.getShopsPhone()); + shopsInfoMap.put("shopsProvince", shopsInfo.getShopsProvince()); + shopsInfoMap.put("shopsCity", shopsInfo.getShopsCity()); + shopsInfoMap.put("shopsArea", shopsInfo.getShopsArea()); + shopsInfoMap.put("shopsAddress", shopsInfo.getShopsAddress()); + shopsInfoMap.put("picture1", shopsInfo.getPicture1()); + shopsInfoMap.put("picture2", shopsInfo.getPicture2()); + shopsInfoMap.put("picture3", shopsInfo.getPicture3()); + shopsInfoMap.put("picture4", shopsInfo.getPicture4()); + shopsInfoMap.put("status", shopsInfo.getStatus()); + shopsInfoMap.put("remark", shopsInfo.getRemark()); + shopsInfoMap.put("reason", shopsInfo.getReason()); + shopsInfoMap.put("weixinCode", shopsInfo.getWeixinCode()); + shopsInfoMap.put("shopLink", shopsInfo.getShopLink()); + return shopsInfoMap; + } + + /** + * 获取商家会员信息 + */ + @Override + public JsonResult getShopsUserInfoById(Integer userId, Integer shopsId) { + ShopsUserInfoId id = new ShopsUserInfoId(shopsId, userId); + ShopsUserInfo shopsUserInfo = shopsUserInfoDao.get(id); + //商家用户信息 + if(shopsUserInfo==null){ + //用户信息 + User user = userDao.get(userId); + if(user==null){ + throw new IfishException(ResultEnum.error402); + } + //临时商家用户信息 + shopsUserInfo = new ShopsUserInfo(id, MemberLevelEnum.level_1.getKey()); + shopsUserInfo.setPhoneNumber(user.getPhoneNumber()); + shopsUserInfo.setUserName(user.getNickName()); + } + //水族箱个数 + int deviceNum = deviceUserDao.getDeviceNumById(userId); + //摄像头个数 + int cameraNum = cameraUserDao.getCameraNumById(userId); + //返回信息DTO + ShopsUserInfoDto infoDto = new ShopsUserInfoDto(userId, shopsId, shopsUserInfo.getMemberLevel(), deviceNum, cameraNum); + infoDto.setUserName(shopsUserInfo.getUserName()); + infoDto.setPhoneNumber(shopsUserInfo.getPhoneNumber()); + infoDto.setProvince(shopsUserInfo.getProvince()); + infoDto.setCity(shopsUserInfo.getCity()); + infoDto.setArea(shopsUserInfo.getArea()); + infoDto.setAddress(shopsUserInfo.getAddress()); + infoDto.setRemark(shopsUserInfo.getRemark()); + return ResultUtil.success(infoDto); + } + + /** + * 更新商家会员信息 + */ + @Override + public JsonResult updateShopsUserInfo(Integer userId,Integer shopsId,ShopsUserInfoParam param) { + //商家用户信息 + ShopsUserInfoId id = new ShopsUserInfoId(shopsId, userId); + ShopsUserInfo tmp = shopsUserInfoDao.get(id); + if(tmp==null){ + //用户信息 + User user = userDao.get(userId); + if(user==null){ + throw new IfishException(ResultEnum.error402); + } + //商家信息 + ShopsInfo shopsInfo = shopsInfoDao.get(shopsId); + if(shopsInfo==null){ + throw new IfishException(ResultEnum.error402); + } + //新增商家会员信息 + tmp = new ShopsUserInfo(id, param.getMemberLevel()); + tmp.setUserName(param.getUserName()); + tmp.setPhoneNumber(param.getPhoneNumber()); + tmp.setProvince(param.getProvince()); + tmp.setCity(param.getCity()); + tmp.setArea(param.getArea()); + tmp.setAddress(param.getAddress()); + tmp.setRemark(param.getRemark()); + shopsUserInfoDao.save(tmp); + //发送云信息消息 + asyncTaskService.sendMsgToShopsUser(userId, shopsInfo.getUserId(), user.getNickName()); + } + else{ + //更新用户信息 + tmp.setMemberLevel(param.getMemberLevel()); + tmp.setUserName(param.getUserName()); + tmp.setPhoneNumber(param.getPhoneNumber()); + tmp.setProvince(param.getProvince()); + tmp.setCity(param.getCity()); + tmp.setArea(param.getArea()); + tmp.setAddress(param.getAddress()); + tmp.setRemark(param.getRemark()); + tmp.setUpdateTime(new Date()); + shopsUserInfoDao.update(tmp); + } + return ResultUtil.success(); + } + + /** + * 分页获取商家会员信息 + */ + @Override + public PageingDto getShopsUserInfoByPage(Integer shopsId,PageParam pageParam) { + //分页获取数据 + Integer firstResult = pageParam.getFirstResult(); + Pagination page = shopsUserInfoDao.findByCriteria(firstResult, pageParam.getPageSize(), Order.desc("createTime"), Restrictions.eq("id.shopsId", shopsId)); + List list = page.getList(); + firstResult+=list.size(); + //封装 + List dtoList = new ArrayList(); + for (ShopsUserInfo info : list) { + Integer userId = info.getId().getUserId(); + //分页会员信息DTO + ShopsUserDto dto = new ShopsUserDto(userId, info.getUserName()); + dtoList.add(dto); + User user = userDao.get(userId); + if(user!=null){ + dto.setNickName(user.getNickName()); + dto.setUserImg(user.getUserImg()); + dto.setLoginTime(IfishUtil.format1(user.getLoginTime())); + } + } + return new PageingDto(ResultEnum.success.getKey(), firstResult, page.getTotalCount(), dtoList); + } + + /** + * 成为商家用户 + */ + @Override + public JsonResult becomeShopsUser(Integer userId, Integer shopsId) { + //商家会员 + ShopsUserInfoId id = new ShopsUserInfoId(shopsId, userId); + ShopsUserInfo shopsUser = shopsUserInfoDao.get(id); + if(shopsUser==null){ + //用户信息 + User user = userDao.get(userId); + if(user==null){ + throw new IfishException(ResultEnum.error402); + } + //商家信息 + ShopsInfo shopsInfo = shopsInfoDao.get(shopsId); + if(shopsInfo==null){ + throw new IfishException(ResultEnum.error402); + } + //新增商家会员信息 + shopsUser = new ShopsUserInfo(id, MemberLevelEnum.level_1.getKey()); + shopsUser.setPhoneNumber(user.getPhoneNumber()); + shopsUser.setUserName(user.getNickName()); + shopsUserInfoDao.save(shopsUser); + //发送云信息消息 + asyncTaskService.sendMsgToShopsUser(userId, shopsInfo.getUserId(), user.getNickName()); + } + return ResultUtil.success(); + } + +} diff --git a/src/main/java/com/ifish/serviceImpl/UserActivityServiceImpl.java b/src/main/java/com/ifish/serviceImpl/UserActivityServiceImpl.java new file mode 100644 index 0000000..d726f3d --- /dev/null +++ b/src/main/java/com/ifish/serviceImpl/UserActivityServiceImpl.java @@ -0,0 +1,82 @@ +package com.ifish.serviceImpl; + +import java.util.ArrayList; +import java.util.List; + +import org.hibernate.criterion.Order; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.ifish.dao.UserActivityDao; +import com.ifish.dao.UserAssetDao; +import com.ifish.dao.UserDao; +import com.ifish.dto.PageingDto; +import com.ifish.dto.UserActivityDto; +import com.ifish.entity.Grade; +import com.ifish.entity.User; +import com.ifish.entity.UserActivity; +import com.ifish.entity.UserAsset; +import com.ifish.hibernate.Pagination; +import com.ifish.service.CacheService; +import com.ifish.service.UserActivityService; +import com.ifish.util.ResultUtil; +import com.ifish.validator.PageParam; + +/** + * 用户动态 + * + * @author Administrator + * + */ +@Service +@Transactional +public class UserActivityServiceImpl implements UserActivityService { + + @Autowired + private UserDao userDao; + @Autowired + private UserAssetDao userAssetDao; + @Autowired + private CacheService cacheService; + @Autowired + private UserActivityDao userActivityDao; + + /** + * 分页获取用户动态 + */ + @Override + public PageingDto getUserActivityByPage(Integer pageSize, Integer firstResult) { + //分页获取数据 + Pagination page = userActivityDao.findByCriteria(firstResult, pageSize, Order.desc("activityId")); + List list = page.getList(); + firstResult += list.size(); + //返回数据 + List dtoList = new ArrayList(); + for (UserActivity userActivity : list) { + Integer userId = userActivity.getUserId(); + User user = userDao.get(userId); + if (user != null) { + UserActivityDto dto = new UserActivityDto(userActivity.getActivityId(), userId, userActivity.getActivityType(), userActivity.getCreateTime()); + dtoList.add(dto); + dto.setNickName(user.getNickName()); + dto.setUserImg(user.getUserImg()); + UserAsset userAsset = userAssetDao.get(userId); + if (userAsset != null) { + //经验值 + Integer gradeValue = userAsset.getGradeValue(); + //等级 + for (Grade grade : cacheService.getGradeList()) { + if (gradeValue >= grade.getMinValue() && gradeValue < grade.getMaxValue()) { + dto.setGradeNum(grade.getGradeNum()); + break; + } + } + } + } + } + //分页数据封装 + return ResultUtil.success(firstResult, page.getTotalCount(), dtoList); + } + +} diff --git a/src/main/java/com/ifish/serviceImpl/UserServiceImpl.java b/src/main/java/com/ifish/serviceImpl/UserServiceImpl.java new file mode 100644 index 0000000..6a0a56e --- /dev/null +++ b/src/main/java/com/ifish/serviceImpl/UserServiceImpl.java @@ -0,0 +1,1072 @@ +package com.ifish.serviceImpl; + +import java.io.File; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; + +import org.apache.commons.lang3.StringUtils; +import org.hibernate.criterion.Restrictions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import com.alibaba.fastjson.JSONObject; +import com.ifish.apiVersion.ApiVersion; +import com.ifish.dao.CameraDao; +import com.ifish.dao.CameraUserDao; +import com.ifish.dao.DeviceCameraDao; +import com.ifish.dao.DeviceDao; +import com.ifish.dao.DeviceUserDao; +import com.ifish.dao.GoldControlDao; +import com.ifish.dao.GoldGetRecordDao; +import com.ifish.dao.InformationDao; +import com.ifish.dao.PushListDao; +import com.ifish.dao.ShopsInfoDao; +import com.ifish.dao.UserAssetDao; +import com.ifish.dao.UserDao; +import com.ifish.dto.DeviceDto; +import com.ifish.dto.DeviceInfoDto; +import com.ifish.dto.GoldTaskDto; +import com.ifish.dto.GwellParamDto; +import com.ifish.dto.JsonResult; +import com.ifish.dto.NeteaseParamDto; +import com.ifish.dto.UserAssetDto; +import com.ifish.dto.UserInfoDto; +import com.ifish.dto.VenderDto; +import com.ifish.entity.Camera; +import com.ifish.entity.CameraUser; +import com.ifish.entity.Device; +import com.ifish.entity.DeviceCamera; +import com.ifish.entity.DeviceCameraId; +import com.ifish.entity.DeviceUser; +import com.ifish.entity.DeviceUserId; +import com.ifish.entity.GoldControl; +import com.ifish.entity.GoldGetRecord; +import com.ifish.entity.GoldTask; +import com.ifish.entity.GradeTask; +import com.ifish.entity.HardwareType; +import com.ifish.entity.PushList; +import com.ifish.entity.ShopsInfo; +import com.ifish.entity.User; +import com.ifish.entity.UserAsset; +import com.ifish.entity.VenderList; +import com.ifish.enums.AddTypeEnum; +import com.ifish.enums.BooleanEnum; +import com.ifish.enums.GoldGetTypeEnum; +import com.ifish.enums.GradeGetTypeEnum; +import com.ifish.enums.GwellEnum; +import com.ifish.enums.NeteaseEnum; +import com.ifish.enums.PushTypeEnum; +import com.ifish.enums.ResultEnum; +import com.ifish.enums.SendTypeEnum; +import com.ifish.enums.SmsSignEnum; +import com.ifish.enums.SmsTemplateEnum; +import com.ifish.enums.SubDirectoryEnum; +import com.ifish.enums.UserTypeEnum; +import com.ifish.exception.IfishException; +import com.ifish.gwell.GwellApi; +import com.ifish.jpush.SmsNumSend; +import com.ifish.netease.NeteaseIM; +import com.ifish.service.CacheService; +import com.ifish.service.GoldService; +import com.ifish.service.GradeService; +import com.ifish.service.UserService; +import com.ifish.util.IfishFilePath; +import com.ifish.util.IfishUtil; +import com.ifish.validator.LoginParam; +import com.ifish.validator.RegisterParam; + +/** + * @ClassName: UserServiceImpl + * @Description: TODO + * @author ggw + * + */ +@Service +@Transactional +public class UserServiceImpl implements UserService { + + @Autowired + private UserDao userDao; + @Autowired + private DeviceDao deviceDao; + @Autowired + private CameraDao cameraDao; + @Autowired + private NeteaseIM neteaseIM; + @Autowired + private SmsNumSend smsNumSend; + @Autowired + private PushListDao pushListDao; + @Autowired + private ShopsInfoDao shopsInfoDao; + @Autowired + private UserAssetDao userAssetDao; + @Autowired + private DeviceUserDao deviceUserDao; + @Autowired + private CameraUserDao cameraUserDao; + @Autowired + private GoldControlDao goldControlDao; + @Autowired + private InformationDao informationDao; + @Autowired + private DeviceCameraDao deviceCameraDao; + @Autowired + private GoldGetRecordDao goldGetRecordDao; + @Autowired + private GoldService goldService; + @Autowired + private CacheService cacheService; + @Autowired + private GradeService gradeService; + + @Override + public JsonResult getVerificateCode(String phoneNumber, String sendType) { + //验证参数 + if(StringUtils.isNotBlank(phoneNumber) && StringUtils.isNotBlank(sendType)){ + User user = userDao.findUniqueByProperty(Restrictions.eq("phoneNumber",phoneNumber)); + //已注册 + if(user!=null){ + //找回密码操作 + if(sendType.equals(SendTypeEnum.findpwd.getKey())){ + //发送短信 + return sendMessage(phoneNumber,SmsSignEnum.sign5.getValue(),SmsTemplateEnum.SMS_720021.getKey()); + } + //注册操作 + else if(sendType.equals(SendTypeEnum.register.getKey())){ + //手机注册过,发送错误码 + return new JsonResult(ResultEnum.warn201.getKey()); + } + } + //未注册 + else{ + //注册操作 + if(sendType.equals(SendTypeEnum.register.getKey())){ + //发送短信 + return sendMessage(phoneNumber,SmsSignEnum.sign4.getValue(),SmsTemplateEnum.SMS_720018.getKey()); + } + } + } + return new JsonResult(ResultEnum.fail101.getKey()); + } + + @Override + public JsonResult login(LoginParam loginParam) { + //手机号 + String phoneNumber = loginParam.getPhoneNumber(); + //用户是否存在 + User user = userDao.findUniqueByProperty(Restrictions.eq("phoneNumber",phoneNumber)); + if(user!=null){ + //密码是否正确 + if(user.getUserPassword().equals(loginParam.getUserPassword())){ + //技威参数 + GwellParamDto gwellParam = getGwellInfo(user.getIsRegisterGwell(), phoneNumber); + if(gwellParam!=null){ + user.setIsRegisterGwell(gwellParam.getIsRegisterGwell()); + user.setP2PVerifyCode1(gwellParam.getP2PVerifyCode1()); + user.setP2PVerifyCode2(gwellParam.getP2PVerifyCode2()); + user.setGwellUserID(gwellParam.getUserID()); + } + //云信参数 + Integer userId = user.getUserId(); + NeteaseParamDto neteaseParam = GetNeteaseInfo(user.getIsRegisterNetease(), userId, user.getNickName(), user.getUserImg(), user.getNeteaseToken()); + if(neteaseParam!=null){ + user.setIsRegisterNetease(neteaseParam.getIsRegisterNetease()); + user.setNeteaseToken(neteaseParam.getNeteaseToken()); + } + /** + * 更新登陆参数 + */ + userDao.executeLoginUpdate(userId,loginParam.getLoginType()); + //设备信息 + DeviceInfoDto deviceInfo = getDeviceInfo(userId); + /** + * 登录返回信息 + */ + JSONObject jsonObject = new JSONObject(); + //用户信息 + jsonObject.put("user", getUserInfo(user)); + //版本号 + if(ApiVersion.version1_0.equals(loginParam.getVersion())){ + //用户资产 + jsonObject.put("userAsset", getUserAssetInfo(userId)); + //金币任务 + jsonObject.put("goldTasks", getGoldTaskList(userId)); + } + //资讯信息 + jsonObject.put("information", cacheService.getInformation()); + //设备信息 + jsonObject.put("device", deviceInfo.getDeviceList()); + //摄像头信息 + jsonObject.put("camera", getCameraInfo(userId)); + //设备关联摄像头信息 + jsonObject.put("deviceCamera", getDeviceCamera(deviceInfo.getDeviceIds())); + //商家信息(自己是商家) + jsonObject.put("shopsInfo", getShopsInfo(userId,user.getUserImg())); + //看护商家信息 + jsonObject.put("shopsInfo2", getShopsInfo(user.getShopsUserId(),null)); + return new JsonResult(ResultEnum.success.getKey(), jsonObject); + } + else{ + //密码不正确 + return new JsonResult(ResultEnum.warn204.getKey()); + } + } + else{ + //用户不存在 + return new JsonResult(ResultEnum.warn202.getKey()); + } + } + + /** + * 优化后登陆验证 + */ + @Override + public JsonResult loginValidate(LoginParam loginParam){ + //手机号 + String phoneNumber = loginParam.getPhoneNumber(); + //用户信息 + User user = userDao.findUniqueByProperty(Restrictions.eq("phoneNumber",phoneNumber)); + //用户不存在 + if(user==null){ + throw new IfishException(ResultEnum.warn202); + } + //密码不正确 + if(!loginParam.getUserPassword().equals(user.getUserPassword())){ + throw new IfishException(ResultEnum.warn204); + } + //技威参数 + GwellParamDto gwellParam = getGwellInfo(user.getIsRegisterGwell(), phoneNumber); + if(gwellParam!=null){ + user.setIsRegisterGwell(gwellParam.getIsRegisterGwell()); + user.setP2PVerifyCode1(gwellParam.getP2PVerifyCode1()); + user.setP2PVerifyCode2(gwellParam.getP2PVerifyCode2()); + user.setGwellUserID(gwellParam.getUserID()); + } + //云信参数 + Integer userId = user.getUserId(); + NeteaseParamDto neteaseParam = GetNeteaseInfo(user.getIsRegisterNetease(), userId, user.getNickName(), user.getUserImg(), user.getNeteaseToken()); + if(neteaseParam!=null){ + user.setIsRegisterNetease(neteaseParam.getIsRegisterNetease()); + user.setNeteaseToken(neteaseParam.getNeteaseToken()); + } + //更新登陆参数 + userDao.executeLoginUpdate(userId,loginParam.getLoginType()); + //用户基本信息 + UserInfoDto userInfoDto = getUserInfoDto(user); + //用户资产信息 + UserAssetDto userAssetDto = getUserAssetInfo(userId); + //返回json信息 + JSONObject json = new JSONObject(); + json.put("userInfo", userInfoDto); + json.put("userAsset", userAssetDto); + return new JsonResult(ResultEnum.success.getKey(), json); + } + /** + * 更多用户数据信息 + */ + @Override + public JsonResult moreUserData(Integer userId){ + User user = userDao.get(userId); + //用户不存在 + if(user==null){ + throw new IfishException(ResultEnum.warn202); + } + /** + * 登录返回信息 + */ + JSONObject jsonObject = new JSONObject(); + //设备信息 + DeviceInfoDto deviceInfo = getSimpleDeviceInfo(userId); + //金币任务 + jsonObject.put("goldTasks", getGoldTaskList(userId)); + //资讯信息 + List information = cacheService.getInformation(); + JSONObject infoJson = new JSONObject(); + if(information.size()>0){ + JSONObject json = information.get(0); + Integer infoId = json.getInteger("infoId"); + String title = json.getString("title"); + //资讯只返回id和title + infoJson.put("infoId", infoId); + infoJson.put("title", title); + jsonObject.put("information", infoJson); + } + else{ + jsonObject.put("information", infoJson); + } + //设备信息 + jsonObject.put("device",deviceInfo.getDeviceList()); + //摄像头信息 + jsonObject.put("camera", getCameraInfo(userId)); + //设备关联摄像头信息 + jsonObject.put("deviceCamera", getDeviceCamera(deviceInfo.getDeviceIds())); + //商家信息(自己是商家) + jsonObject.put("shopsInfo", getShopsInfo(userId,user.getUserImg())); + //看护商家信息 + jsonObject.put("shopsInfo2", getShopsInfo(user.getShopsUserId(),null)); + return new JsonResult(ResultEnum.success.getKey(), jsonObject); + } + + /** + * 绑定设备 + */ + @Override + public JsonResult bindDevice(Integer userId,String macAddress){ + //设备信息 + Device device = deviceDao.findUniqueByProperty(Restrictions.eq("macAddress", macAddress)); + if(device==null){ + throw new IfishException(ResultEnum.error402); + } + //用户信息 + User user = userDao.get(userId); + if(user==null){ + throw new IfishException(ResultEnum.error402); + } + //首次激活 + if(device.getFirstActivate()==null){ + device.setFirstActivate(new Date()); + } + //设备ID + Integer deviceId = device.getDeviceId(); + //是否已关联设备 + DeviceUserId priId = new DeviceUserId(userId, deviceId); + DeviceUser deviceUser = deviceUserDao.get(priId); + if(deviceUser==null){ + //已关联设备的其他用户 + List deviceUserList = deviceUserDao.findByProperty(Restrictions.eq("priId.deviceId", deviceId)); + //解除关联关系并发送推送 + deleteDeviceAndPushMsg(deviceUserList, deviceId); + //关联设备 + deviceUser = new DeviceUser(priId, BooleanEnum.YES.getKey(), "鱼缸"+(int)(Math.random()*9000+1000)); + deviceUserDao.save(deviceUser); + } + else{ + //不是主控制权 + if(!BooleanEnum.YES.getKey().equals(deviceUser.getIsMaster())){ + //已关联设备的其他用户 + List deviceUserList = deviceUserDao.findByProperty(Restrictions.eq("priId.deviceId", deviceId),Restrictions.ne("priId.userId", userId)); + //解除关联关系并发送推送 + deleteDeviceAndPushMsg(deviceUserList, deviceId); + //设为主控并更新时间 + deviceUser.setIsMaster(BooleanEnum.YES.getKey()); + deviceUser.setUpdateTime(new Date()); + } + } + return new JsonResult(ResultEnum.success.getKey(), getDeviceDto(deviceUser, device)); + } + + /** + * 扫一扫分享设备 + */ + @Override + public JsonResult shareDevice(Integer userId,Integer deviceId){ + //设备信息 + Device device = deviceDao.get(deviceId); + if(device==null){ + throw new IfishException(ResultEnum.error402); + } + //用户信息 + User user = userDao.get(userId); + if(user==null){ + throw new IfishException(ResultEnum.error402); + } + //是否已关联设备 + DeviceUserId priId = new DeviceUserId(userId, deviceId); + DeviceUser deviceUser = deviceUserDao.get(priId); + if(deviceUser==null){ + //关联设备 + deviceUser = new DeviceUser(priId, BooleanEnum.NO.getKey(), "鱼缸"+(int)(Math.random()*9000+1000)); + deviceUserDao.save(deviceUser); + } + return new JsonResult(ResultEnum.success.getKey(), getDeviceDto(deviceUser, device)); + } + + @Override + public JsonResult register(RegisterParam registerParam) { + String phoneNumber = registerParam.getPhoneNumber(); + User user = userDao.findUniqueByProperty(Restrictions.eq("phoneNumber", phoneNumber)); + if(user!=null){ + return new JsonResult(ResultEnum.warn201.getKey()); + } + else{ + user = new User(); + user.setPhoneNumber(phoneNumber); + user.setUserPassword(registerParam.getUserPassword()); + user.setPhoneType(registerParam.getPhoneType()); + user.setLoginType(registerParam.getPhoneType()); + user.setIsRegisterGwell(BooleanEnum.NO.getKey()); + user.setIsRegisterNetease(BooleanEnum.NO.getKey()); + user.setNeteaseToken(""); + user.setUserType(UserTypeEnum.userType0.getKey()); + user.setAddress(registerParam.getAddress()); + user.setLongitude(registerParam.getLongitude()); + user.setLatitude(registerParam.getLatitude()); + //随机给一个默认头像 + String userImg = "default/"+(new Random().nextInt(7)+1)+".png"; + user.setUserImg(userImg); + //随机生成用户名 + String nickName = "鱼友"+IfishUtil.getCharAndNumr(5); + user.setNickName(nickName); + user.setCreateTime(new Date()); + userDao.save(user); + //首次注册赠送10金币 + BigDecimal gold = new BigDecimal(10); + UserAsset userAsset = new UserAsset(user.getUserId(),gold); + userAssetDao.save(userAsset); + //获取记录 + GoldGetRecord getRecord = new GoldGetRecord(user.getUserId(), GoldGetTypeEnum.registerGive.getKey(), gold, GoldGetTypeEnum.registerGive.getValue()); + goldGetRecordDao.save(getRecord); + return new JsonResult(ResultEnum.success.getKey()); + } + } + + @Override + public JsonResult updateInfo(User user){ + //用户ID + Integer userId = user.getUserId(); + if(userId!=null){ + //查找用户信息 + User curUser = userDao.get(userId); + if(curUser!=null){ + //是否需要更新 + boolean bln = false; + //昵称 + String nickName = user.getNickName(); + if(StringUtils.isNotBlank(nickName)){ + //敏感词过滤 + if(nickName.contains("爱鱼奇") || nickName.contains("官方")){ + return new JsonResult(ResultEnum.warn213.getKey()); + } + else{ + curUser.setNickName(nickName); + bln=true; + } + } + //性别 + String userSex = user.getUserSex(); + if(StringUtils.isNotBlank(userSex)){ + curUser.setUserSex(userSex); + bln=true; + } + //签名 + String signature = user.getSignature(); + if(StringUtils.isNotBlank(signature)){ + curUser.setSignature(signature); + bln=true; + } + //有参数变更 + if(bln){ + //更新用户信息 + curUser.setUpdateTime(new Date()); + userDao.update(curUser); + //更新云信 + updateIMUserInfo(userId.toString(), curUser.getNickName(), curUser.getUserImg()); + } + return new JsonResult(ResultEnum.success.getKey()); + } + else{ + return new JsonResult(ResultEnum.warn211.getKey()); + } + } + else{ + return new JsonResult(ResultEnum.fail101.getKey()); + } + } + + @Override + public JsonResult uploadUserImg(Integer userId,MultipartFile fileUpload){ + //查找用户信息 + User user = userDao.get(userId); + if(user!=null){ + if(fileUpload!=null && !fileUpload.isEmpty()){ + //上传的图片不能大于1M + if(fileUpload.getSize()>1048576){ + return new JsonResult(ResultEnum.warn206.getKey()); + } + else{ + //验证图片格式 + String extEndName = IfishFilePath.checkImgName(fileUpload.getOriginalFilename()); + //验证图片格式 + if(extEndName!=null) { + //图片名称 + String picName = userId+"_icon.png"; + try { + File file = new File(IfishFilePath.path_img, picName); + //不存在则创建 + if(!file.exists()){ + file.mkdirs(); + } + //保存 + fileUpload.transferTo(file); + } catch (Exception e) { + throw new RuntimeException(e); + } + //更新数据库 + user.setUserImg(picName); + user.setUpdateTime(new Date()); + user = userDao.update(user); + //更新云信 + updateIMUserInfo(userId.toString(), user.getNickName(), user.getUserImg()); + //返回数据 + JSONObject json = new JSONObject(); + json.put("userImg", picName); + return new JsonResult(ResultEnum.success.getKey(),json); + } + else{ + return new JsonResult(ResultEnum.warn205.getKey()); + } + } + } + else{ + return new JsonResult(ResultEnum.fail101.getKey()); + } + } + else{ + return new JsonResult(ResultEnum.warn211.getKey()); + } + } + + /** + * 发送手机短信 + * @param phoneNumber + * @param smsSign + * @param smsTemplate + * @return + */ + public JsonResult sendMessage(String phoneNumber,String smsSign,String smsTemplate) { + //4位随机数 + Integer code = (int)(Math.random()*9000+1000); + boolean bln = smsNumSend.sendSmsNum(phoneNumber, code.toString(),smsSign,smsTemplate); + //发送验证码 + if(bln){ + return new JsonResult(ResultEnum.success.getKey(),code.toString()); + } + else{ + return new JsonResult(ResultEnum.fail101.getKey()); + } + } + /** + * 注册云信 + * @param userId + * @param nickName + * @param userImg + * @return + */ + public Map registerIM(String userId,String nickName,String userImg){ + return neteaseIM.createAccid(userId, nickName, IfishFilePath.getPath(SubDirectoryEnum.headImage,userImg), ""); + } + /** + * 更新云信信息 + * @param userId + * @param nickName + * @param userImg + * @return + */ + public Map updateIMUserInfo(String userId,String nickName,String userImg){ + return neteaseIM.updateUinfo(userId, nickName, IfishFilePath.getPath(SubDirectoryEnum.headImage,userImg),""); + } + /** + * 获取云信token + * @param userId + * @return + */ + public Map refreshToken(String userId){ + return neteaseIM.refreshToken(userId); + } + /** + * 第一次注册云信发送一条系统消息 + * @param to + */ + public void sendMsgByIM(String to){ + //发送云信消息 + User user = userDao.findUniqueByProperty(Restrictions.eq("phoneNumber", IfishFilePath.netease_phone)); + if(user!=null){ + String from = user.getUserId().toString(); + neteaseIM.sendMsg(from, to, "感谢您使用爱鱼奇,连接智能设备请查看下方说明书,内含操作视频:http://u.eqxiu.com/s/KmmVl87l \n摄像头售后:021-54131006\n睿芯插排售后:15757401229\n绚多插排售后:18857689069\n松诺插排售后:13392205468",""); + } + } + /** + * 封装设备信息 + * @param userId + * @return + */ + @Deprecated + public DeviceInfoDto getDeviceInfo(Integer userId){ + //设备list + List deviceList = new ArrayList(); + //设备ID + List deviceIds = new ArrayList(); + //获取用户拥有设备 + List deviceUserList = deviceUserDao.findByProperty(Restrictions.eq("priId.userId", userId)); + for(DeviceUser deviceUser:deviceUserList){ + //查询设备信息 + Integer deviceId = deviceUser.getPriId().getDeviceId(); + Device device = deviceDao.get(deviceId); + //json + JSONObject json = new JSONObject(); + //封装设备返回信息 + deviceIds.add(deviceId); + deviceList.add(json); + //json存储设备信息 + json.put("userId", userId); + json.put("deviceId", deviceId); + json.put("isMaster", deviceUser.getIsMaster()); + json.put("showName", deviceUser.getShowName()); + json.put("macAddress", device.getMacAddress()); + json.put("isBlacklist", device.getIsBlacklist()); + //控制方案 + String type = device.getHardwareType(); + //鱼缸厂code + String brandCode = device.getBrandCode(); + if(type!=null){ + HardwareType hardwareType = cacheService.findHardwareTypeById(type); + if(hardwareType!=null){ + //设备类型 + json.put("type", type); + //有无工作模式 + json.put("isWorkModel", hardwareType.getIsWorkModel()); + //控制信息 + json.put("controlAmount", hardwareType.getControlAmount()); + json.put("timerAmount", hardwareType.getTimerAmount()); + //背光/柜灯 + json.put("isLightness", hardwareType.getIsLightness()); + json.put("isSarkLamp", hardwareType.getIsSarkLamp()); + //是否显示预警推送 + if(brandCode!=null && brandCode.equals("YUEM") && device.getCreateTime().before(IfishUtil.StrToDate("2016-04-26"))){ + json.put("isPushWendu", BooleanEnum.NO.getKey()); + } + else{ + json.put("isPushWendu", BooleanEnum.YES.getKey()); + } + //换水提醒 + json.put("todayRemind", device.getTodayRemind()); + json.put("waterRemind", device.getWaterRemind()); + json.put("remindDate", device.getRemindDate()!=null?IfishUtil.format1(device.getRemindDate()):""); + json.put("remindCycle", device.getRemindCycle()!=null?device.getRemindCycle():""); + //自定义图标信息 + String isCustomIcon = hardwareType.getIsCustomIcon(); + json.put("isCustomIcon", isCustomIcon); + if(isCustomIcon.equals(BooleanEnum.YES.getKey())){ + json.put("customIconName", deviceUser.getCustomIconName()); + json.put("customShowName", deviceUser.getCustomShowName()); + json.put("isCustomIcon", hardwareType.getIsCustomIcon()); + json.put("iconLink", hardwareType.getIconLink()); + json.put("allIconName", hardwareType.getAllIconName()); + json.put("allShowName", hardwareType.getAllShowName()); + json.put("defaultIconName", hardwareType.getDefaultIconName()); + json.put("defaultShowName", hardwareType.getDefaultShowName()); + } + } + } + //厂家 + VenderList venderList = cacheService.findVenderListById(brandCode); + if(venderList!=null){ + json.put("venderList", venderList); + } + else{ + //默认爱鱼奇 + json.put("venderList", cacheService.findVenderListById("AYQ")); + } + } + return new DeviceInfoDto(deviceIds, deviceList); + } + + /** + * 删除设备关联关系并推送消息 + * @param deviceUserList + * @param deviceId + */ + public void deleteDeviceAndPushMsg(List deviceUserList,Integer deviceId){ + //推送消息类型 + PushTypeEnum pushTypeEnum = PushTypeEnum.remove_device; + String title = pushTypeEnum.getValue(); + String pushType = pushTypeEnum.getKey(); + String timestamp = IfishUtil.format(new Date()); + //解除设备和用户关联关系并发送推送 + for (DeviceUser deviceUser : deviceUserList) { + deviceUserDao.delete(deviceUser); + Integer userId = deviceUser.getPriId().getUserId(); + String showName = deviceUser.getShowName(); + String content = "你已于"+timestamp+"失去对“"+showName+"”设备的控制权"; + //推送云信消息 + Map neteaseMap = neteaseIM.sendMsg(IfishFilePath.ifish_account, userId.toString(), "【"+title+"】"+content,null); + String neteaseStatus = NeteaseEnum.status200.getKey().equals(neteaseMap.get("code"))?BooleanEnum.YES.getKey():BooleanEnum.NO.getKey(); + //保存推送记录 + PushList pushList = new PushList(userId, deviceId, showName, pushType ,neteaseStatus, title, content); + pushListDao.save(pushList); + } + //删除设备和摄像头关联关系 + List deviceCameraList = deviceCameraDao.findByProperty(Restrictions.eq("deviceCameraId.deviceId", deviceId)); + for (DeviceCamera deviceCamera : deviceCameraList) { + deviceCameraDao.delete(deviceCamera); + } + } + + /** + * 设备DTO + * @param deviceUser + * @param device + * @return + */ + public DeviceDto getDeviceDto(DeviceUser deviceUser,Device device){ + String type = device.getHardwareType(); + //设备信息DTO + DeviceDto dto = new DeviceDto(device.getDeviceId(), device.getMacAddress(), deviceUser.getShowName(), deviceUser.getIsMaster(), type, device.getIsBlacklist()); + //用户ID + dto.setUserId(deviceUser.getPriId().getUserId()); + //硬件类型 + HardwareType hardwareType = cacheService.findHardwareTypeById(type); + if(hardwareType!=null){ + //控制数和定时器数 + dto.setControlAmount(hardwareType.getControlAmount()); + dto.setTimerAmount(hardwareType.getTimerAmount()); + //有无工作模式 + dto.setIsWorkModel(hardwareType.getIsWorkModel()); + //背光/柜灯 + dto.setIsLightness(hardwareType.getIsLightness()); + dto.setIsSarkLamp(hardwareType.getIsSarkLamp()); + } + //鱼缸厂 + String brandCode = device.getBrandCode(); + //是否显示预警推送,2016-04-26号之前越美水族的不显示温度预警开关 + if("YUEM".equals(brandCode) && device.getCreateTime().before(IfishUtil.StrToDate("2016-04-26"))){ + dto.setIsPushWendu(BooleanEnum.NO.getKey()); + } + else{ + dto.setIsPushWendu(BooleanEnum.YES.getKey()); + } + //换水提醒 + dto.setTodayRemind(device.getTodayRemind()); + dto.setWaterRemind(device.getWaterRemind()); + dto.setRemindDate(device.getRemindDate()!=null?IfishUtil.format1(device.getRemindDate()):""); + dto.setRemindCycle(device.getRemindCycle()!=null?device.getRemindCycle().toString():""); + //鱼缸厂信息 + VenderList venderList = cacheService.findVenderListById(brandCode); + if(venderList==null){ + //默认爱鱼奇 + venderList = cacheService.findVenderListById("AYQ"); + } + if(venderList!=null){ + //鱼缸厂信息DTO + VenderDto venderDto = new VenderDto(venderList.getBrandName(), venderList.getBrandIntroduce(), venderList.getLogo()); + dto.setVenderDto(venderDto); + } + return dto; + } + + /** + * 优化后设备信息 + * @param userId + */ + public DeviceInfoDto getSimpleDeviceInfo(Integer userId){ + //设备信息DTO + List deviceDtoList = new ArrayList(); + //设备ID + List deviceIds = new ArrayList(); + //用户关联的设备信息 + List deviceUserList = deviceUserDao.findByProperty(Restrictions.eq("priId.userId", userId)); + for (DeviceUser deviceUser : deviceUserList) { + //设备Id + Integer deviceId = deviceUser.getPriId().getDeviceId(); + //设备信息 + Device device = deviceDao.get(deviceId); + if(device!=null){ + deviceIds.add(deviceId); + deviceDtoList.add(getDeviceDto(deviceUser, device)); + } + } + return new DeviceInfoDto(deviceIds, deviceDtoList); + } + + /** + * 获取技威相关参数 + * @param isRegisterGwell + * @param phoneNumber + * @return + */ + public GwellParamDto getGwellInfo(String isRegisterGwell,String phoneNumber){ + //未注册技威 + if(!BooleanEnum.YES.getKey().equals(isRegisterGwell)){ + //注册技威 + Map registerMap = GwellApi.Register(phoneNumber); + String registerResult = registerMap.get("result"); + if(registerResult!=null){ + //注册成功 + if(registerResult.equals(GwellEnum.success.getKey())){ + return new GwellParamDto(BooleanEnum.YES.getKey(),registerMap.get("P2PVerifyCode1"),registerMap.get("P2PVerifyCode2"),registerMap.get("UserID")); + } + //已经注册过 + else if(registerResult.equals(GwellEnum.repeat.getKey())){ + //重新登陆获取 + Map loginMap = GwellApi.Login(phoneNumber); + String loginResult = loginMap.get("result"); + //登陆成功 + if(GwellEnum.success.getKey().equals(loginResult)){ + return new GwellParamDto(BooleanEnum.YES.getKey(),loginMap.get("P2PVerifyCode1"),loginMap.get("P2PVerifyCode2"),loginMap.get("UserID")); + } + else{ + return new GwellParamDto(BooleanEnum.YES.getKey()); + } + } + } + } + return null; + } + + /** + * 获取云信相关参数 + * @param isRegisterNetease + * @param userId + * @param nickName + * @param userImg + * @param neteaseToken + * @return + */ + public NeteaseParamDto GetNeteaseInfo(String isRegisterNetease,Integer userId,String nickName,String userImg,String neteaseToken){ + //未注册云信 + if(!BooleanEnum.YES.getKey().equals(isRegisterNetease)){ + //注册云信 + Map registerMap = registerIM(userId.toString(),nickName,userImg); + if(registerMap!=null){ + String code = registerMap.get("code"); + if(code.equals(NeteaseEnum.status200.getKey())){ + //发送云信消息 + sendMsgByIM(userId.toString()); + return new NeteaseParamDto(BooleanEnum.YES.getKey(), registerMap.get("token")); + } + else if(code.equals(NeteaseEnum.status414.getKey())){ + //获取云信token + Map refreshMap = refreshToken(userId.toString()); + if(refreshMap!=null){ + String refreshCode = refreshMap.get("code"); + if(refreshCode.equals(NeteaseEnum.status200.getKey())){ + return new NeteaseParamDto(BooleanEnum.YES.getKey(), refreshMap.get("token")); + } + } + } + } + } + //已注册云信 + else if(BooleanEnum.YES.getKey().equals(isRegisterNetease)){ + //token为空 + if(!StringUtils.isNotBlank(neteaseToken)){ + //获取云信token + Map refreshMap = refreshToken(userId.toString()); + if(refreshMap!=null){ + String code = refreshMap.get("code"); + if(code.equals(NeteaseEnum.status200.getKey())){ + return new NeteaseParamDto(BooleanEnum.YES.getKey(), refreshMap.get("token")); + } + } + } + } + return null; + } + + /** + * 封装用户信息 + * @param user + * @return + */ + public JSONObject getUserInfo(User user){ + JSONObject json = new JSONObject(); + json.put("userId", user.getUserId()); + json.put("phoneNumber", user.getPhoneNumber()); + json.put("nickName", user.getNickName()); + json.put("userSex", user.getUserSex()); + json.put("signature", user.getSignature()); + json.put("userImg", user.getUserImg()); + json.put("P2PVerifyCode1", user.getP2PVerifyCode1()); + json.put("P2PVerifyCode2", user.getP2PVerifyCode2()); + json.put("gwellUserID", user.getGwellUserID()); + json.put("neteaseToken", user.getNeteaseToken()); + json.put("userType", user.getUserType()); + json.put("shopsUserId", user.getShopsUserId()); + return json; + } + /** + * 封装用户信息 + * @param user + * @return + */ + public UserInfoDto getUserInfoDto(User user){ + UserInfoDto dto = new UserInfoDto(); + dto.setUserId(user.getUserId()); + dto.setPhoneNumber(user.getPhoneNumber()); + dto.setNickName(user.getNickName()); + dto.setUserSex(user.getUserSex()); + dto.setSignature(user.getSignature()); + dto.setUserImg(user.getUserImg()); + dto.setP2PVerifyCode1(user.getP2PVerifyCode1()); + dto.setP2PVerifyCode2(user.getP2PVerifyCode2()); + dto.setGwellUserID(user.getGwellUserID()); + dto.setNeteaseToken(user.getNeteaseToken()); + dto.setUserType(user.getUserType()); + dto.setShopsUserId(user.getShopsUserId()); + return dto; + } + /** + * 用户资产和签到信息(经验值,金币等) + * @param userId + * @return + */ + public UserAssetDto getUserAssetInfo(Integer userId){ + UserAsset userAsset = userAssetDao.get(userId); + if(userAsset==null){ + //之前注册用户赠送20金币 + BigDecimal gold = new BigDecimal(20); + userAsset = new UserAsset(userId,gold); + userAssetDao.save(userAsset); + //获取记录 + GoldGetRecord getRecord = new GoldGetRecord(userId, GoldGetTypeEnum.registerGive.getKey(), gold, GoldGetTypeEnum.registerGive.getValue()); + goldGetRecordDao.save(getRecord); + } + //日期 + Calendar calendar = Calendar.getInstance(); + //今天 + Date date = calendar.getTime(); + String today = IfishUtil.format1(date); + //昨天 + calendar.add(Calendar.DAY_OF_MONTH, -1); + String yesterday = IfishUtil.format1(calendar.getTime()); + //最后一天登陆日期 + String lastLogin = userAsset.getLastLoginDate(); + //规则 + GradeTask gradeRule = cacheService.getGradeRule(GradeGetTypeEnum.everyDayLogin.getKey()); + //今天登陆过 + if(gradeRule==null || lastLogin.equals(today)){ + return goldService.getUserAssetInfo(userAsset, new BigDecimal(0), today, yesterday); + } + return gradeService.getGradeControl(userAsset, gradeRule ,true); + } + + /** + * 封装摄像头信息 + * @param userId + * @return + */ + public List getCameraInfo(Integer userId){ + List cameraList = new ArrayList(); + //获取用户拥有摄像头 + List cameraUserList = cameraUserDao.findByProperty(Restrictions.eq("cameraUserId.userId", userId)); + for(CameraUser cameraUser:cameraUserList){ + Camera camera = cameraDao.get(cameraUser.getCameraUserId().getCameraId()); + //封装摄像头返回信息 + JSONObject json = new JSONObject(); + json.put("cameraId", camera.getCameraId()); + //json.put("isMaster", cameraUser.getIsMaster()); + json.put("isLook", cameraUser.getIsLook()); + json.put("isLive", cameraUser.getIsLive()); + json.put("isActive", camera.getActiveCode()!=null&&camera.getActiveCode().length()>0?"1":"0"); + json.put("showName", cameraUser.getShowName()); + cameraList.add(json); + } + return cameraList; + } + + /** + * 设备关联摄像头 + * @param deviceIds + * @return + */ + public List getDeviceCamera(List deviceIds){ + //设备关联摄像头信息 + List deviceCameraList = new ArrayList(); + //设备已关联摄像头 + if(deviceIds.size()>0){ + List list = deviceCameraDao.findByProperty(Restrictions.in("deviceCameraId.deviceId", deviceIds)); + for(DeviceCamera deviceCamera:list){ + deviceCameraList.add(deviceCamera.getDeviceCameraId()); + } + } + return deviceCameraList; + } + + /** + * 封装商家认证信息 + * @param shopsInfo + * @param userImg + * @return + */ + public JSONObject getShopsInfo(Integer userId,String userImg){ + if(userId!=null){ + ShopsInfo shopsInfo = shopsInfoDao.findUniqueByProperty(Restrictions.eq("userId", userId)); + if(shopsInfo!=null){ + //封装商家认证信息 + JSONObject json = new JSONObject(); + json.put("shopsId", shopsInfo.getShopsId()); + json.put("userId", shopsInfo.getUserId()); + if(userImg!=null){ + json.put("userImg", userImg); + } + else{ + User user = userDao.get(userId); + json.put("userImg", user.getUserImg()); + } + json.put("userName", shopsInfo.getUserName()); + json.put("shopsName", shopsInfo.getShopsName()); + json.put("shopsPhone", shopsInfo.getShopsPhone()); + json.put("shopsProvince", shopsInfo.getShopsProvince()); + json.put("shopsCity", shopsInfo.getShopsCity()); + json.put("shopsArea", shopsInfo.getShopsArea()); + json.put("shopsAddress", shopsInfo.getShopsAddress()); + json.put("picture1", shopsInfo.getPicture1()); + json.put("picture2", shopsInfo.getPicture2()); + json.put("picture3", shopsInfo.getPicture3()); + json.put("picture4", shopsInfo.getPicture4()); + json.put("status", shopsInfo.getStatus()); + json.put("remark", shopsInfo.getRemark()); + json.put("reason", shopsInfo.getReason()); + json.put("weixinCode", shopsInfo.getWeixinCode()); + json.put("shopLink", shopsInfo.getShopLink()); + return json; + } + } + return new JSONObject(); + } + + /** + * 金币任务信息 + * @param userId + * @return + */ + public List getGoldTaskList(Integer userId){ + //任务信息 + List goldTaskList = new ArrayList(); + //今天日期 + String today = IfishUtil.format1(new Date()); + //已完成金币任务 + Map finishMap = new HashMap(); + List goldControls = goldControlDao.findByProperty(Restrictions.eq("goldControlId.userId", userId)); + for (GoldControl goldControl : goldControls) { + finishMap.put(goldControl.getGoldControlId().getRuleType(), goldControl.getControlParam()); + } + //所有金币任务 + for (GoldTask goldRule : cacheService.getGoldRuleList()) { + //类型 + String ruleType = goldRule.getRuleType(); + //加成类型 + String addType = goldRule.getAddType(); + //任务是否完成 + String controlDate = finishMap.get(ruleType); + //规则信息DTO + GoldTaskDto taskDto = new GoldTaskDto(ruleType, addType, goldRule.getAddValue().toString(), BooleanEnum.NO.getKey()); + goldTaskList.add(taskDto); + if(controlDate!=null){ + if(addType.equals(AddTypeEnum.once.getKey()) || (addType.equals(AddTypeEnum.everyDay.getKey()) && controlDate.equals(today))){ + taskDto.setIsFinish(BooleanEnum.YES.getKey()); + } + } + } + return goldTaskList; + } +} diff --git a/src/main/java/com/ifish/util/IfishFilePath.java b/src/main/java/com/ifish/util/IfishFilePath.java new file mode 100644 index 0000000..7a4ee49 --- /dev/null +++ b/src/main/java/com/ifish/util/IfishFilePath.java @@ -0,0 +1,90 @@ +package com.ifish.util; + +import java.io.InputStream; +import java.lang.reflect.Field; +import java.util.Properties; + +import com.ifish.enums.SubDirectoryEnum; + +/** + * 文件目录及地址 + * + * @author Administrator + * + */ +public class IfishFilePath { + //头像地址 + public static String path_img; + /** + * 图片头地址 + */ + public static String link_img_head; + //商家图片地址 + public static String path_shops; + //商品介绍图片 + public static String path_commodity; + //微信分享页面 + public static String path_share_html; + //微信分享页图片 + public static String path_share_img; + //看护报告页面 + public static String path_look_html; + //看护报告图片 + public static String path_look_img; + //html名字 + public static String html_name; + //图片上传格式 + public static String check_style; + //云信爱鱼奇官方帐号 + public static String ifish_account; + //IM官方手机号 + public static String netease_phone; + //直播间封面 + public static String path_room_img; + //FastDFS商家视频上传URL访问路径(本地和测试环境) + public static String fastDFS_url_local; + //FastDFS商家视频上传URL访问路径(正式环境) + public static String fastDFS_url_app; + + static { + Properties prop = new Properties(); + InputStream in = IfishFilePath.class.getResourceAsStream("/property.properties"); + try { + prop.load(in); + //利用反射机制给属性赋值 + Field[] fields = IfishFilePath.class.getDeclaredFields(); + for (Field field : fields) { + String name = field.getName(); + field.set(IfishFilePath.class, prop.getProperty(name).trim()); + } + in.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 验证图片格式 + */ + public static String checkImgName(String fileName) { + //对格式进行验证 + int index = fileName.lastIndexOf("."); + String extEndName = fileName.substring(++index, fileName.length()); + if (check_style.indexOf(extEndName.toUpperCase()) == -1) { + return null; + } + //返回格式.png + return "." + extEndName; + } + + /** + * 获取图片链接地址 + * + * @param type + * @return + */ + public static String getPath(SubDirectoryEnum pictureEnum, String fileName) { + return link_img_head + pictureEnum.getKey() + fileName; + } + +} diff --git a/src/main/java/com/ifish/util/IfishFileUtils.java b/src/main/java/com/ifish/util/IfishFileUtils.java new file mode 100644 index 0000000..fb126ef --- /dev/null +++ b/src/main/java/com/ifish/util/IfishFileUtils.java @@ -0,0 +1,43 @@ +package com.ifish.util; + +import java.io.File; +import java.io.IOException; + +import org.springframework.web.multipart.MultipartFile; + +/** + * 文件处理工具类 + * @author Administrator + * + */ +public class IfishFileUtils { + /** + * 上传文件 + * @param path + * @param fileName + * @param multipartFile + * @throws IllegalStateException + * @throws IOException + */ + public static void uploadFile(String path,String fileName,MultipartFile multipartFile) throws IllegalStateException, IOException{ + //文件名 + File newFile = new File(path,fileName); + if(!newFile.exists()){ + newFile.mkdirs(); + } + //传输文件 + multipartFile.transferTo(newFile); + } + /** + * 删除文件 + * @param path + * @param fileName + */ + public static void deleteFile(String path,String fileName){ + File file = new File(path, fileName); + if(file.exists()){ + file.delete(); + } + } + +} diff --git a/src/main/java/com/ifish/util/IfishUtil.java b/src/main/java/com/ifish/util/IfishUtil.java new file mode 100644 index 0000000..89aed0f --- /dev/null +++ b/src/main/java/com/ifish/util/IfishUtil.java @@ -0,0 +1,488 @@ +package com.ifish.util; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.Random; + +import org.springframework.web.multipart.MultipartFile; + +import com.ifish.entity.LookReport; +import com.ifish.entity.ShopsInfo; +import com.ifish.entity.User; +import com.ifish.enums.Index1Enum; +import com.ifish.enums.Index2Enum; +import com.ifish.enums.Index3Enum; +import com.ifish.hibernate.Pagination; +import java.io.UnsupportedEncodingException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.codehaus.jackson.map.ObjectMapper; +import org.codehaus.jackson.type.JavaType; + +public class IfishUtil { + + private static final String formatDate = "yyyy-MM-dd HH:mm:ss"; + + private static final String formatDate3 = "MM-dd HH:mm"; + + private static final String formatDate2 = "yyyy-MM-dd HH:mm"; + + private static final String formatDate1 = "yyyy-MM-dd"; + + /** + * 测试缓存时间:一分钟;单位:秒 + */ + public static final int CacheTime_Test_SECONDS = 60; + /** + * 缓存时间:一秒;单位:秒 + */ + public static final int CacheTime_SECONDS = 1; + /** + * 缓存时间:一分钟;单位:分 + */ + public static final int CacheTime_MINUTES = 1; + /** + * 缓存时间:一小时;单位:小时 + */ + public static final int CacheTime_HOURS = 1; + /** + * 缓存时间:一天;单位:天 + */ + public static final int CacheTime_DAYS = 1; + + /** + * Object转Json + */ + public static String ObjectToJson(Object value) { + try { + if (value == null) { + return null; + } + ObjectMapper mapper = new ObjectMapper(); + String js = mapper.writeValueAsString(value); + return js; + } catch (Exception ex) { + System.out.println("【异常信息】 >>> " + ex.toString()); + return "Error"; + } + } + + /** + * Json转Object(JavaBean) + * + * @param json 需要转换的JSON字符串 + * @param bean JavaBean, + * @return 拿到结果需要强转一次,因为你拿到的是Object, 例如这样调用和强转: School lst + * =(School)StringUtil.JsonToObjectList(value, School.class); + */ + public static Object JsonToBean(String json, Class bean) throws Exception { + ObjectMapper mapper = new ObjectMapper(); + JavaType javaType = mapper.getTypeFactory().uncheckedSimpleType(bean); + return mapper.readValue(json, javaType); + } + + //返回时分秒的时间字符串 + public static String TimestampToStringAndSecond(Object timestamp) { + DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try { + return (format.format(timestamp)); + } catch (Exception e) { + System.out.println("【isGaokaoYearExpire 异常】:" + e); + return ""; + } + } + + //返回时分秒的时间字符串 + public static String TimestampToStringAndSecond(Object timestamp, String geshi) { + DateFormat format = new SimpleDateFormat(geshi); + try { + return (format.format(timestamp)); + } catch (Exception e) { + System.out.println("【isGaokaoYearExpire 异常】:" + e); + return ""; + } + } + + /** + * 返回当前日期yyyy-MM-dd + * + * @return + * @throws ParseException + */ + public static Date getCurDate() { + DateFormat df = DateFormat.getDateInstance(); + try { + return df.parse(df.format(new Date())); + } catch (ParseException e) { + } + return null; + } + + /** + * 格式化日期yyyy-MM-dd HH:mm:ss + * + * @param date + * @return + */ + public static String format(Date date) { + SimpleDateFormat format = new SimpleDateFormat(formatDate); + return format.format(date); + } + + /** + * 格式化日期 + * + * @param date + * @return + */ + public static String format1(Date date) { + SimpleDateFormat format = new SimpleDateFormat(formatDate1); + return format.format(date); + } + + /** + * 格式化日期 + * + * @param date + * @return + */ + public static String format2(Date date) { + SimpleDateFormat format = new SimpleDateFormat(formatDate2); + return format.format(date); + } + + /** + * 格式化日期 + * + * @param date + * @return + */ + public static String format3(Date date) { + SimpleDateFormat format = new SimpleDateFormat(formatDate3); + return format.format(date); + } + + /** + * 字符串转换成日期 + * + * @param str + * @return date + */ + public static Date StrToDate(String str) { + SimpleDateFormat format = new SimpleDateFormat(formatDate1); + Date date = null; + try { + date = format.parse(str); + } catch (ParseException e) { + e.printStackTrace(); + } + return date; + } + + /** + * 随机生成字母与数字组合 + * + * @param length + * @return + */ + public static String getCharAndNumr(int length) { + String val = ""; + Random random = new Random(); + for (int i = 0; i < length; i++) { + // 输出字母还是数字 + String charOrNum = random.nextInt(2) % 2 == 0 ? "char" : "num"; + // 字符串 + if ("char".equalsIgnoreCase(charOrNum)) { + // 取得大写字母还是小写字母 + int choice = random.nextInt(2) % 2 == 0 ? 65 : 97; + val += (char) (choice + random.nextInt(26)); + // 数字 + } else if ("num".equalsIgnoreCase(charOrNum)) { + val += String.valueOf(random.nextInt(10)); + } + } + return val; + } + + /** + * 返回json数据 + * + * @param str + * @return + */ + public static Map returnJson(String key, Object value) { + Map map = new HashMap(); + map.put("result", key); + if (value.equals("")) { + map.put("data", null); + } else { + map.put("data", value); + } + return map; + } + + /** + * 返回json数据 + * + * @param str + * @return + */ + public static Map toJson(String key, Object value) { + Map map = new HashMap(); + map.put("result", key); + if (value.equals("")) { + map.put("data", null); + } else { + map.put("data", value); + } + return map; + } + + /** + * 返回分页数据 + * + * @param str + * @return + */ + public static Object returnPageData(Pagination page) { + Map map = new HashMap(); + //实际的行数 + map.put("total", page.getTotalCount()); + //数据 + map.put("data", page.getList()); + return map; + } + + /** + * 上传图片文件 + * + * @param fileUpload + * @param path + * @return + */ + public static String uploadFile(MultipartFile fileUpload, String path) { + //根据时间得文件名 + Calendar calendar = Calendar.getInstance(); + String fileName = String.valueOf(calendar.getTimeInMillis()); + //保存文件 + if (fileUpload == null) { + return "base/default.png"; + } + if (!fileUpload.isEmpty()) { + try { + if (!fileUpload.getOriginalFilename().equals("")) { + File picFile = new File(path, fileName + ".png"); + //不存在则创建 + if (!picFile.exists()) { + picFile.mkdirs(); + } + //保存 + fileUpload.transferTo(picFile); + } + return "share/" + fileName + ".png"; + } catch (Exception e) { + throw new RuntimeException(e); + } + } + return ""; + } + + /** + * 生成微信分享页面 + * + * @param title + * @param base64 + * @return + */ + public static String getHtmlFile(String title, String pngName, String modelFile, String filePath) { + try { + if (pngName != null && !pngName.equals("")) { + //读取模板文件 + FileInputStream fileinputstream = new FileInputStream(filePath + modelFile); + int lenght = fileinputstream.available(); + byte bytes[] = new byte[lenght]; + fileinputstream.read(bytes); + fileinputstream.close(); + String templateContent = new String(bytes); + //替换掉模板中相应的地方 + templateContent = templateContent.replaceAll("###title###", title); + templateContent = templateContent.replaceAll("###fileName###", pngName); + //根据时间得文件名 + Calendar calendar = Calendar.getInstance(); + String fileName = String.valueOf(calendar.getTimeInMillis()); + fileName = fileName + ".html"; + //建立文件输出流 + FileOutputStream fileoutputstream = new FileOutputStream(filePath + fileName); + byte tag_bytes[] = templateContent.getBytes(); + fileoutputstream.write(tag_bytes); + fileoutputstream.close(); + return fileName; + } + } catch (Exception e) { + throw new RuntimeException(e); + } + return ""; + } + + /** + * 随即区间整数 + * + * @param min + * @param max + * @return + */ + public static int getRandom(int min, int max) { + int r = new Random().nextInt(max - min); + return r + min; + } + + /** + * 生成看护报告页面 + * + * @param title + * @param base64 + * @return + */ + public static LookReport getLookFile(ShopsInfo shopsInfo, User user, String index1, String index2, String index3, String suggestion, String pngName, String modelFile, String filePath) { + LookReport lookReport = new LookReport(); + try { + //根据时间得文件名 + Calendar calendar = Calendar.getInstance(); + String fileName = String.valueOf(calendar.getTimeInMillis()); + Date date = new Date(); + String time = format2(date); + //读取模板文件 + FileInputStream fileinputstream = new FileInputStream(filePath + modelFile); + int lenght = fileinputstream.available(); + byte bytes[] = new byte[lenght]; + fileinputstream.read(bytes); + fileinputstream.close(); + String templateContent = new String(bytes); + + String value1 = Index1Enum.getValue(index1); + String value2 = Index2Enum.getValue(index2); + String value3 = Index3Enum.getValue(index3); + Integer totalIndex = Integer.valueOf(index1) + Integer.valueOf(index2) + Integer.valueOf(index3); + Integer baifenbi = 99; + if (totalIndex >= 0 && totalIndex <= 50) { + //50%~70% + baifenbi = getRandom(50, 70); + } else if (totalIndex > 50 && totalIndex <= 80) { + //71%~84% + baifenbi = getRandom(71, 84); + } else { + //85%~99% + baifenbi = getRandom(85, 99); + } + //替换掉模板中相应的地方 + templateContent = templateContent.replaceAll("###time###", time); + templateContent = templateContent.replaceAll("###index1###", index1); + templateContent = templateContent.replaceAll("###index2###", index2); + templateContent = templateContent.replaceAll("###index3###", index3); + templateContent = templateContent.replaceAll("###totalIndex###", totalIndex.toString()); + templateContent = templateContent.replaceAll("###baifenbi###", baifenbi.toString()); + templateContent = templateContent.replaceAll("###value1###", value1); + templateContent = templateContent.replaceAll("###value2###", value2); + templateContent = templateContent.replaceAll("###value3###", value3); + templateContent = templateContent.replaceAll("###suggestion###", suggestion); + templateContent = templateContent.replaceAll("###fileName###", pngName); + templateContent = templateContent.replaceAll("###shopsName###", shopsInfo.getShopsName()); + templateContent = templateContent.replaceAll("###userImg###", user.getUserImg()); + templateContent = templateContent.replaceAll("###signature###", user.getSignature()); + //看护报告 + lookReport.setTimestamp(date); + lookReport.setShareImg(pngName); + lookReport.setIndex1(index1); + lookReport.setIndex2(index2); + lookReport.setIndex3(index3); + lookReport.setSuggestion(suggestion); + lookReport.setTotalIndex(totalIndex.toString()); + lookReport.setBaifenbi(baifenbi.toString()); + lookReport.setUserImg(user.getUserImg()); + lookReport.setShopsName(shopsInfo.getShopsName()); + lookReport.setSignature(user.getSignature()); + lookReport.setCreateTime(new Date()); + //html文件名 + fileName = fileName + ".html"; + lookReport.setHtmlName(fileName); + //建立文件输出流 + FileOutputStream fileoutputstream = new FileOutputStream(filePath + fileName); + byte tag_bytes[] = templateContent.getBytes(); + fileoutputstream.write(tag_bytes); + fileoutputstream.close(); + return lookReport; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * URL 解码 + * + * @return String + * @author lifq + * @date 2015-3-17 下午04:09:51 + */ + public static String getURLDecoderString(String str) { + String result = ""; + if (null == str) { + return ""; + } + try { + result = java.net.URLDecoder.decode(str, "GBK"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + return result; + } + + /** + * URL 转码 + * + * @return String + * @author lifq + * @date 2015-3-17 下午04:10:28 + */ + public static String getURLEncoderString(String str) { + String result = ""; + if (null == str) { + return ""; + } + try { + result = java.net.URLEncoder.encode(str, "GBK"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + return result; + } + + /** + * 正则表达式截取字符串 + * + * @param str + * @param regex + * @return + */ + public static String regex(String str, String regex) { + Matcher matcher = Pattern.compile(regex).matcher(str); + if (matcher.find()) { + return matcher.group(0); + } else { + return ""; + } + } + + public static String regexToChinese(String str) { + String regex = "([\\u4e00-\\u9fa5]+)"; + return regex(str, regex); + } +} diff --git a/src/main/java/com/ifish/util/RedisKey.java b/src/main/java/com/ifish/util/RedisKey.java new file mode 100644 index 0000000..8b2a8a5 --- /dev/null +++ b/src/main/java/com/ifish/util/RedisKey.java @@ -0,0 +1,60 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ifish.util; + +import com.ifish.entity.CameraUser; + +/** + * + * @author Administrator + */ +public class RedisKey { + + /** + * 用户缓存前缀 + */ + public static final String User_Key = "user:"; + + /** + * 商家信息缓存前缀 + */ + public static final String ShopsInfo_Key = "shopsInfo:"; + + /** + * 用户绑定设备缓存前缀 + */ + public static final String DeviceUser_Key = "deviceUser:"; + + /** + * 设备绑定摄像头缓存前缀 + */ + public static final String DeviceCamera_key = "deviceCamera:"; + + /** + * 设备详情缓存前缀 + */ + public static final String Device_key = "device:"; + + /** + * 设备类型缓存前缀 + */ + public static final String HardWareType_key = "hardwaretype:"; + + /** + * 厂家列表缓存前缀 + */ + public static final String VenderList_key = "venderlist:"; + + /** + * 用户和摄像头的绑定关系存前缀 + */ + public static final String CameraUser_key = "cameraUser:"; + + /** + * 摄像头详情缓存前缀 + */ + public static final String Camera_key = "camera:"; +} diff --git a/src/main/java/com/ifish/util/ResultUtil.java b/src/main/java/com/ifish/util/ResultUtil.java new file mode 100644 index 0000000..569b709 --- /dev/null +++ b/src/main/java/com/ifish/util/ResultUtil.java @@ -0,0 +1,66 @@ +package com.ifish.util; + +import java.util.List; + +import com.ifish.dto.JsonResult; +import com.ifish.dto.PageingDto; +import com.ifish.enums.ResultEnum; + +/** + * 结果工具类 + * @author Administrator + * + */ +public class ResultUtil { + + /** + * 错误 + * @param result + * @return + */ + public static JsonResult error(String result){ + JsonResult jsonResult = new JsonResult(result); + return jsonResult; + } + /** + * 警告 + * @param result + * @param object + * @return + */ + public static JsonResult warn(String result,Object object){ + JsonResult jsonResult = new JsonResult(result,object); + return jsonResult; + } + /** + * 成功,有数据 + * @param object + * @return + */ + public static JsonResult success(Object object){ + JsonResult jsonResult = new JsonResult(ResultEnum.success.getKey(),object); + return jsonResult; + } + + /** + * 成功,无数据 + * @param object + * @return + */ + public static JsonResult success(){ + JsonResult jsonResult = new JsonResult(ResultEnum.success.getKey()); + return jsonResult; + } + + /** + * 成功,返回分页数据 + * @param firstResult + * @param totalCount + * @param list + * @return + */ + public static PageingDto success(Integer firstResult,Integer totalCount,List list){ + return new PageingDto(ResultEnum.success.getKey(), firstResult, totalCount, list); + } + +} diff --git a/src/main/java/com/ifish/util/StringUtil.java b/src/main/java/com/ifish/util/StringUtil.java new file mode 100644 index 0000000..7c4bf82 --- /dev/null +++ b/src/main/java/com/ifish/util/StringUtil.java @@ -0,0 +1,229 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ifish.util; + +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.net.URLEncoder; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.List; +import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.codehaus.jackson.map.ObjectMapper; +import org.codehaus.jackson.type.JavaType; + +public class StringUtil { + + + /** + * Object转Json + */ + public static String ObjectToJson(Object value) { + try { + if(value==null) + return null; + ObjectMapper mapper = new ObjectMapper(); + String js = mapper.writeValueAsString(value); + return js; + } catch (Exception ex) { + System.out.println("【异常信息】 >>> " + ex.toString()); + return "Error"; + } + } + + /** + * Json转Object(List) + * + * @param json 需要转换的JSON字符串 + * @param bean JavaBean, + * @return 拿到结果需要强转一次,因为你拿到的是Object, 例如这样调用和强转: List<School> lst + * =(List<School>)StringUtil.JsonToObjectList(value, School.class); + */ + public static Object JsonToList(String json, Class bean) throws Exception { + ObjectMapper mapper = new ObjectMapper(); + JavaType javaType = mapper.getTypeFactory().constructParametricType(List.class, bean); + return mapper.readValue(json, javaType); + } + + /** + * Json转Object(JavaBean) + * + * @param json 需要转换的JSON字符串 + * @param bean JavaBean, + * @return 拿到结果需要强转一次,因为你拿到的是Object, 例如这样调用和强转: School lst + * =(School)StringUtil.JsonToObjectList(value, School.class); + */ + public static Object JsonToBean(String json, Class bean) throws Exception { + ObjectMapper mapper = new ObjectMapper(); + JavaType javaType = mapper.getTypeFactory().uncheckedSimpleType(bean); + return mapper.readValue(json, javaType); + } + + /** + * 将json格式的字符串解析成Map对象 + */ + public static Map> JsonToMap(String json) { + try { + ObjectMapper mapper = new ObjectMapper(); + Map> maps = mapper.readValue(json, Map.class); + return maps; + } catch (Exception e) { + System.out.println("【异常信息】 >>> " + e.toString()); + return null; + } + } + + public static Map JsonToMapContainMap(String json) { + try { + ObjectMapper mapper = new ObjectMapper(); + Map maps = mapper.readValue(json, Map.class); + return maps; + } catch (Exception e) { + System.out.println("【异常信息】 >>> " + e.toString()); + return null; + } + } + + public static Map JsonToRealMap(String json) { + try { + ObjectMapper mapper = new ObjectMapper(); + Map maps = mapper.readValue(json, Map.class); + return maps; + } catch (Exception e) { + System.out.println("【异常信息】 >>> " + e.toString()); + return null; + } + } + + /** + * 正则表达式验证 + * + * @param value 需要验证的值 + * @param regexp 进行验证的正则表达式 + */ + public static boolean regExpTest(String value, String regexp) { + //验证标识符必须由字母、数字、下划线组成 + Pattern p = Pattern.compile(regexp); + Matcher m = p.matcher(value); + boolean flg = m.matches(); + return flg; + } + + /** + * ISO-8859-1转UTF-8 主要用于POST数据处理 + * + * @param str 需要转码的值 + */ + public static String encodeStr(String str) { + try { + return new String(str.getBytes("ISO-8859-1"), "UTF-8"); + } catch (UnsupportedEncodingException e) { + return null; + } + } + + /** + * 利用MD5进行加密 + * + * @param str 待加密的字符串 + * @return 加密后的字符串 + * @throws NoSuchAlgorithmException 没有这种产生消息摘要的算法 + * @throws UnsupportedEncodingException + */ + public static String EncoderByMd5(String str) throws NoSuchAlgorithmException, UnsupportedEncodingException { + + byte[] bs = MessageDigest.getInstance("MD5").digest(str.getBytes()); + StringBuilder sb = new StringBuilder(40); + for (byte x : bs) { + if ((x & 0xff) >> 4 == 0) { + sb.append("0").append(Integer.toHexString(x & 0xff)); + } else { + sb.append(Integer.toHexString(x & 0xff)); + } + } + return sb.toString(); + } + + /** + * 对文字进行编码处理 + * + * @param str + * @return + * @throws NoSuchAlgorithmException + * @throws UnsupportedEncodingException + */ + public static String encoderUrl(String str) { + try { + String urlStr = URLEncoder.encode(str, "utf-8"); + return urlStr.replace("%", "$"); + } catch (UnsupportedEncodingException ex) { + Logger.getLogger(StringUtil.class.getName()).log(Level.SEVERE, null, ex); + } + + return null; + } + + /** + * 对编码后的文字进行解码 + * + * @param str + * @return + * @throws NoSuchAlgorithmException + * @throws UnsupportedEncodingException + */ + public static String decoderUrl(String str) { + try { + str = str.replace("$", "%"); + String urlStr = URLDecoder.decode(str, "utf-8"); + return urlStr; + + } catch (UnsupportedEncodingException ex) { + Logger.getLogger(StringUtil.class.getName()).log(Level.SEVERE, null, ex); + } + return null; + } + + /** + * byte数组转hex字符串
+ * 一个byte转为2个hex字符 + * + * @param src + * @return + */ + public static String bytes2Hex(byte[] src) { + char[] res = new char[src.length * 2]; + final char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; + for (int i = 0, j = 0; i < src.length; i++) { + res[j++] = hexDigits[src[i] >>> 4 & 0x0f]; + res[j++] = hexDigits[src[i] & 0x0f]; + } + + return new String(res); + } + + /** + * hex字符串转byte数组
+ * 2个hex转为一个byte + * + * @param src + * @return + */ + public static byte[] hex2Bytes(String src) { + byte[] res = new byte[src.length() / 2]; + char[] chs = src.toCharArray(); + for (int i = 0, c = 0; i < chs.length; i += 2, c++) { + res[c] = (byte) (Integer.parseInt(new String(chs, i, 2), 16)); + } + + return res; + } + + +} diff --git a/src/main/java/com/ifish/validator/AddValueParam.java b/src/main/java/com/ifish/validator/AddValueParam.java new file mode 100644 index 0000000..34fd26d --- /dev/null +++ b/src/main/java/com/ifish/validator/AddValueParam.java @@ -0,0 +1,50 @@ +package com.ifish.validator; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; + +import org.hibernate.validator.constraints.Length; +import org.hibernate.validator.constraints.NotBlank; + + +/** + * 增加经验值或金币值参数 + * @author Administrator + * + */ +public class AddValueParam{ + + /** + * 规则类型 + */ + @NotBlank + @Length(max=20,min=3) + private String ruleType; + /** + * 用户ID + */ + @NotNull + @Min(1) + private Integer userId; + + public AddValueParam() {} + + public AddValueParam(String ruleType, Integer userId) { + this.ruleType = ruleType; + this.userId = userId; + } + + public String getRuleType() { + return ruleType; + } + public void setRuleType(String ruleType) { + this.ruleType = ruleType; + } + public Integer getUserId() { + return userId; + } + public void setUserId(Integer userId) { + this.userId = userId; + } + +} diff --git a/src/main/java/com/ifish/validator/LiveRoomParam.java b/src/main/java/com/ifish/validator/LiveRoomParam.java new file mode 100644 index 0000000..c4b04cc --- /dev/null +++ b/src/main/java/com/ifish/validator/LiveRoomParam.java @@ -0,0 +1,75 @@ +package com.ifish.validator; + +import org.hibernate.validator.constraints.Length; +import org.hibernate.validator.constraints.NotBlank; + + +/** + * 直播间信息 + * @author Administrator + * + */ +public class LiveRoomParam{ + /** + * 用户ID + */ + @NotBlank + private Integer userId; + /** + * 直播间名称 + */ + @NotBlank + @Length(max=20) + private String roomName; + /** + * 直播间描述 + */ + @NotBlank + @Length(max=70) + private String roomDesc; + /** + * 直播间状态 + * @return + */ + @NotBlank + @Length(max=1) + private String RoomStatus; + /** + * 摄像头ID + */ + @NotBlank + @Length(max=20) + private String cameraId; + + public String getRoomName() { + return roomName; + } + public void setRoomName(String roomName) { + this.roomName = roomName; + } + public String getRoomDesc() { + return roomDesc; + } + public void setRoomDesc(String roomDesc) { + this.roomDesc = roomDesc; + } + public String getRoomStatus() { + return RoomStatus; + } + public void setRoomStatus(String roomStatus) { + RoomStatus = roomStatus; + } + public String getCameraId() { + return cameraId; + } + public void setCameraId(String cameraId) { + this.cameraId = cameraId; + } + public Integer getUserId() { + return userId; + } + public void setUserId(Integer userId) { + this.userId = userId; + } + +} diff --git a/src/main/java/com/ifish/validator/LoginParam.java b/src/main/java/com/ifish/validator/LoginParam.java new file mode 100644 index 0000000..8c668cd --- /dev/null +++ b/src/main/java/com/ifish/validator/LoginParam.java @@ -0,0 +1,64 @@ +package com.ifish.validator; + +import org.hibernate.validator.constraints.Length; +import org.hibernate.validator.constraints.NotBlank; + + +/** + * 用户登陆参数 + * @author Administrator + * + */ +public class LoginParam{ + + /** + * 手机号 + */ + @NotBlank + @Length(max=11,min=8) + private String phoneNumber; + /** + * 密码 + */ + @NotBlank + @Length(max=32,min=32) + private String userPassword; + /** + * 手机登陆类型 + */ + @NotBlank + @Length(max=7,min=3) + private String loginType; + /** + * 接口版本号 + * @return + */ + @Length(max=3) + private String version; + + public String getPhoneNumber() { + return phoneNumber; + } + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; + } + public String getUserPassword() { + return userPassword; + } + public void setUserPassword(String userPassword) { + this.userPassword = userPassword; + } + public String getLoginType() { + return loginType; + } + public void setLoginType(String loginType) { + this.loginType = loginType; + } + public String getVersion() { + return version; + } + public void setVersion(String version) { + this.version = version; + } + +} diff --git a/src/main/java/com/ifish/validator/PageParam.java b/src/main/java/com/ifish/validator/PageParam.java new file mode 100644 index 0000000..6e46c05 --- /dev/null +++ b/src/main/java/com/ifish/validator/PageParam.java @@ -0,0 +1,61 @@ +package com.ifish.validator; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; + + +/** + * 分页数据参数 + * @author Administrator + * + */ +public class PageParam{ + + /** + * 用户ID + */ + @NotNull + @Min(1) + private Integer userId; + /** + * 开始行 + */ + @NotNull + @Min(0) + private Integer firstResult; + /** + * 分页大小 + */ + @NotNull + @Min(1) + @Max(20) + private Integer pageSize; + + public PageParam() {} + + public PageParam(Integer userId, Integer firstResult, Integer pageSize) { + this.userId = userId; + this.firstResult = firstResult; + this.pageSize = pageSize; + } + public Integer getUserId() { + return userId; + } + public void setUserId(Integer userId) { + this.userId = userId; + } + public Integer getFirstResult() { + return firstResult; + } + public void setFirstResult(Integer firstResult) { + this.firstResult = firstResult; + } + public Integer getPageSize() { + return pageSize; + } + public void setPageSize(Integer pageSize) { + this.pageSize = pageSize; + } + +} diff --git a/src/main/java/com/ifish/validator/RegisterParam.java b/src/main/java/com/ifish/validator/RegisterParam.java new file mode 100644 index 0000000..d11edaa --- /dev/null +++ b/src/main/java/com/ifish/validator/RegisterParam.java @@ -0,0 +1,106 @@ +package com.ifish.validator; + +import org.hibernate.validator.constraints.Length; +import org.hibernate.validator.constraints.NotBlank; + + +/** + * 注册参数 + * @author Administrator + * + */ +public class RegisterParam{ + + /** + * 手机号 + */ + @NotBlank + @Length(max=11,min=8) + private String phoneNumber; + /** + * 密码 + */ + @NotBlank + @Length(max=32,min=32) + private String userPassword; + /** + * 手机注册类型 + */ + @NotBlank + @Length(max=7,min=3) + private String phoneType; + /** + * 注册地址 + */ + @Length(max=200) + private String address; + /** + * 经度 + */ + private Double longitude; + /** + * 维度 + */ + private Double latitude; + + public RegisterParam() {} + + public RegisterParam(String phoneNumber, String userPassword, String phoneType, + String address, Double longitude, Double latitude) { + this.phoneNumber = phoneNumber; + this.userPassword = userPassword; + this.phoneType = phoneType; + this.address = address; + this.longitude = longitude; + this.latitude = latitude; + } + + public String getPhoneNumber() { + return phoneNumber; + } + + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; + } + + public String getUserPassword() { + return userPassword; + } + + public void setUserPassword(String userPassword) { + this.userPassword = userPassword; + } + + public String getPhoneType() { + return phoneType; + } + + public void setPhoneType(String phoneType) { + this.phoneType = phoneType; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public Double getLongitude() { + return longitude; + } + + public void setLongitude(Double longitude) { + this.longitude = longitude; + } + + public Double getLatitude() { + return latitude; + } + + public void setLatitude(Double latitude) { + this.latitude = latitude; + } + +} diff --git a/src/main/java/com/ifish/validator/ShopsUserInfoParam.java b/src/main/java/com/ifish/validator/ShopsUserInfoParam.java new file mode 100644 index 0000000..f865698 --- /dev/null +++ b/src/main/java/com/ifish/validator/ShopsUserInfoParam.java @@ -0,0 +1,108 @@ +package com.ifish.validator; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; + +import org.hibernate.validator.constraints.Length; +import org.hibernate.validator.constraints.NotBlank; +/** + * 商家会员信息 + * @author Administrator + * + */ +public class ShopsUserInfoParam { + + /** + * 会员等级 + */ + @Min(1) + @Max(3) + private int memberLevel; + /** + * 用户名称 + */ + @NotBlank + @Length(max=10) + private String userName; + /** + * 手机号码 + */ + @NotBlank + @Length(max=11) + private String phoneNumber; + /** + * 省 + */ + @Length(max=30) + private String province; + /** + * 市 + */ + @Length(max=30) + private String city; + /** + * 区 + */ + @Length(max=30) + private String area; + /** + * 地址 + */ + @Length(max=100) + private String address; + /** + * 备注 + */ + @Length(max=50) + private String remark; + + public int getMemberLevel() { + return memberLevel; + } + public void setMemberLevel(int memberLevel) { + this.memberLevel = memberLevel; + } + public String getUserName() { + return userName; + } + public void setUserName(String userName) { + this.userName = userName; + } + public String getPhoneNumber() { + return phoneNumber; + } + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; + } + public String getAddress() { + return address; + } + public void setAddress(String address) { + this.address = address; + } + public String getRemark() { + return remark; + } + public void setRemark(String remark) { + this.remark = remark; + } + public String getProvince() { + return province; + } + public void setProvince(String province) { + this.province = province; + } + public String getCity() { + return city; + } + public void setCity(String city) { + this.city = city; + } + public String getArea() { + return area; + } + public void setArea(String area) { + this.area = area; + } + +} diff --git a/src/main/java/com/ifish/validator/ValidateUtil.java b/src/main/java/com/ifish/validator/ValidateUtil.java new file mode 100644 index 0000000..8014acc --- /dev/null +++ b/src/main/java/com/ifish/validator/ValidateUtil.java @@ -0,0 +1,23 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.ifish.validator; + +/** + * + * @author Administrator + */ +public class ValidateUtil { + + /** + * 验证当前系统是windows(本地,返回true),还是unix(服务器,返回false) + * + * @return + */ + public static boolean IsWinOrUnix() { + String os = System.getProperty("os.name");//获取当前操作系统 + return os.toLowerCase().startsWith("win"); + } +} diff --git a/src/main/resources/application-context.xml b/src/main/resources/application-context.xml new file mode 100644 index 0000000..d7086dc --- /dev/null +++ b/src/main/resources/application-context.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + classpath:/com/ifish/entity/hbm/*.hbm.xml + + + + + + com.ifish.entity + + + + + ${hibernate.dialect} + ${hibernate.show_sql} + ${hibernate.format_sql} + ${hibernate.hbm2ddl.auto} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/ehcache-setting.xml b/src/main/resources/ehcache-setting.xml new file mode 100644 index 0000000..b12fe8c --- /dev/null +++ b/src/main/resources/ehcache-setting.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/fdfs_client_ifish7.conf b/src/main/resources/fdfs_client_ifish7.conf new file mode 100644 index 0000000..9661bfb --- /dev/null +++ b/src/main/resources/fdfs_client_ifish7.conf @@ -0,0 +1,7 @@ +connect_timeout = 2 +network_timeout = 30 +charset = UTF-8 +http.tracker_http_port = 85 +http.anti_steal_token = no +http.secret_key = FastDFS1234567890 +tracker_server = 120.55.190.56:22131 \ No newline at end of file diff --git a/src/main/resources/fdfs_client_zhangxinyanv5.conf b/src/main/resources/fdfs_client_zhangxinyanv5.conf new file mode 100644 index 0000000..6a88c9e --- /dev/null +++ b/src/main/resources/fdfs_client_zhangxinyanv5.conf @@ -0,0 +1,8 @@ +connect_timeout = 2 +network_timeout = 30 +charset = UTF-8 +http.tracker_http_port = 8017 +http.anti_steal_token = no +http.secret_key = FastDFS1234567890 +tracker_server = 139.196.24.156:22122 + diff --git a/src/main/resources/ifish.properties b/src/main/resources/ifish.properties new file mode 100644 index 0000000..be9355a --- /dev/null +++ b/src/main/resources/ifish.properties @@ -0,0 +1,6 @@ +#ifish\u5b89\u5168\u6821\u9a8c +#ifishAppKey=5fc7bdada110e3a6eefd3065b8d8d995 +#ifishAppSecret=9596b393ab0f +overtime=30 +#\u5f00\u53d1\u6a21\u5f0f +devModel=true \ No newline at end of file diff --git a/src/main/resources/jdbc.properties b/src/main/resources/jdbc.properties new file mode 100644 index 0000000..66e9300 --- /dev/null +++ b/src/main/resources/jdbc.properties @@ -0,0 +1,29 @@ +c3p0.driverClassName=com.mysql.jdbc.Driver +c3p0.url=jdbc\:mysql\://localhost\:3306/myfishdb?characterEncoding\=UTF-8 +c3p0.username=ifish +c3p0.password=ifish7pwd +#c3p0.username=root +#c3p0.password=123456 + +c3p0.autoCommitOnClose=true +c3p0.initialPoolSize=20 +c3p0.minPoolSize=20 +c3p0.maxPoolSize=50 +c3p0.acquireIncrement=3 + +c3p0.checkoutTimeout=5000 +c3p0.maxIdleTime=7200 +c3p0.idleConnectionTestPeriod=18000 +#c3p0.maxIdleTimeExcessConnections=1800 + +#c3p0.automaticTestTable=C3P0TestTable +#c3p0.testConnectionOnCheckout=false +#c3p0.testConnectionOnCheckin=false + +#org.hibernate.dialect.MySQLInnoDBDialect +hibernate.dialect=org.hibernate.dialect.MySQLDialect +hibernate.show_sql=false +hibernate.format_sql=true +hibernate.hbm2ddl.auto=false +hibernate.jdbc.batch_size=50 +hibernate.query.substitutions=true 1,false 0 diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml new file mode 100644 index 0000000..6e5755d --- /dev/null +++ b/src/main/resources/logback.xml @@ -0,0 +1,38 @@ + + + + + + + %d{yyyy-MM-dd HH:mm:ss} 【%-5level】 【%logger{50}】 %msg%n + GBK + + + + + + ${LOG_HOME}/ifish/localhost.log + + ${LOG_HOME}/ifish/%d{yyyy-MM-dd}.log + 30 + + 100MB + + + + %d{yyyy-MM-dd HH:mm:ss} 【%-5level】 【%logger{50}】 %msg%n + UTF-8 + + + WARN + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/mybatis-config.xml b/src/main/resources/mybatis-config.xml new file mode 100644 index 0000000..37aca1b --- /dev/null +++ b/src/main/resources/mybatis-config.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/main/resources/property.properties b/src/main/resources/property.properties new file mode 100644 index 0000000..1e27a3e --- /dev/null +++ b/src/main/resources/property.properties @@ -0,0 +1,34 @@ +#\u5934\u50cf\u5b58\u50a8\u8def\u5f84 +path_img=/mydata/tmp/Img/app +#\u5546\u5bb6\u8ba4\u8bc1\u56fe\u7247 +path_shops=/mydata/tmp/Img/shops +#\u5546\u54c1\u4ecb\u7ecd\u56fe\u7247 +path_commodity=/mydata/tmp/Img/commodity +#\u76f4\u64ad\u95f4\u5c01\u9762 +path_room_img=/mydata/tmp/Img/room +#\u5fae\u4fe1\u5206\u4eab\u9875\u9762 +path_share_html=/mydata/tmp/html/ +#\u5fae\u4fe1\u5206\u4eab\u9875\u56fe\u7247 +path_share_img=/mydata/tmp/html/images/share +#\u770b\u62a4\u62a5\u544a\u9875\u9762 +path_look_html=/mydata/tmp/look/ +#\u770b\u62a4\u62a5\u544a\u56fe\u7247 +path_look_img=/mydata/tmp/look/images/share +#\u770b\u62a4\u62a5\u544a\u6a21\u7248html\u540d\u5b57 +html_name=index.html +#\u4e91\u4fe1\u7231\u9c7c\u5947\u5b98\u65b9\u5e10\u53f7 +ifish_account=ifish +#IM\u5b98\u65b9\u624b\u673a\u53f7 +netease_phone=18501773036 +#FastDFS\u6587\u4ef6URL\u8bbf\u95ee\u8def\u5f84(\u672c\u5730\u548c\u6d4b\u8bd5\u73af\u5883) +fastDFS_url_local=https://app.zhangxinyanv5.top/ +#FastDFS\u6587\u4ef6URL\u8bbf\u95ee\u8def\u5f84(\u6b63\u5f0f\u73af\u5883) +fastDFS_url_app=http://app.ifish7.com/ +#\u672c\u5730 +#link_img_head=http://192.168.61.128:81/ +#\u6d4b\u8bd5\u73af\u5883 +#link_img_head=https://app.zhangxinyanv5.top/ +#\u6b63\u5f0f\u73af\u5883 +link_img_head=https://app.ifish7.com/ +#\u56fe\u7247\u683c\u5f0f\u9a8c\u8bc1 +check_style=GIF,PNG,BMP,JPG,JPEG \ No newline at end of file diff --git a/src/main/resources/spring-mybatis.xml b/src/main/resources/spring-mybatis.xml new file mode 100644 index 0000000..e74a761 --- /dev/null +++ b/src/main/resources/spring-mybatis.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/springmvc-servlet.xml b/src/main/resources/springmvc-servlet.xml new file mode 100644 index 0000000..55f3857 --- /dev/null +++ b/src/main/resources/springmvc-servlet.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/META-INF/MANIFEST.MF b/src/main/webapp/META-INF/MANIFEST.MF new file mode 100644 index 0000000..254272e --- /dev/null +++ b/src/main/webapp/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Class-Path: + diff --git a/src/main/webapp/META-INF/context.xml b/src/main/webapp/META-INF/context.xml new file mode 100644 index 0000000..7118028 --- /dev/null +++ b/src/main/webapp/META-INF/context.xml @@ -0,0 +1,2 @@ + + diff --git a/src/main/webapp/WEB-INF/lib/commons-codec-1.4.jar b/src/main/webapp/WEB-INF/lib/commons-codec-1.4.jar new file mode 100644 index 0000000000000000000000000000000000000000..458d432da88b0efeab640c229903fb5aad274044 GIT binary patch literal 58160 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 literal 0 HcmV?d00001 diff --git a/src/main/webapp/WEB-INF/lib/fastdfs-client-java-1.25.jar b/src/main/webapp/WEB-INF/lib/fastdfs-client-java-1.25.jar new file mode 100644 index 0000000000000000000000000000000000000000..74adb9294c5580275b3cd37fefcb9311db2073bf GIT binary patch literal 91061 zcma&N1C%Avk}h0bw#_bf*=Cnc*|u%lwyiGPwr$(Ct-tTwJM-Smdo%CPwRWCdDh;S2KvXrszodIZx{bMLH+%e5?17=5t9bc$^J_W5{Tum*xNcgnZw`P z5q}%%|1KuQFD(WTR#2ps0^CbYj7v(;(9Xh1&`?fIOxMfPFEH&K+Ea^9jZjO_2tYy{ z6euU6Q}vLzwq}YmIfy%EQC6bjD%dmKGe$^+BTL-*Ax{aHhLM(1AeQ4xwsQCtAj8p}T|M27?1SG&?kb{=Jhx|JKRB{rZms^zW68y~%$J%Y-(G;(nK z4>ibtvsgDh9ce!t5Re5X5D>wCQTtcV1oRw?Sea=JEcF~5CRHt5GZ*c=O}cI9)GKeq zjiUldI*#-Q#JeKkl4)LvGE`NQVUuC|0$m&5NGdzmHZKM-&e)~PkpECDFvG>d3=Q!^ zkquyKFpe<927+e7kOYy$CJL-E|4tBid${AaA~@mNu3AD4W&J2G;4zuXbU5l@GBKX2 znCiHHF$0RYfnd9O(8u~33z+t}U49XO0(CKSXl8vjy%)CXIxxC7qU-Ya=xjlR*l3xK zV8mTGie-I1_wVO?RzkqP(G^OA5GTL4!1vsYfUp~g3h5}BtMAJF>|gU#$jHa%&Kr*@ zi!`w2F4K>;aOjJYLm2940sV!xZGg{RRX4=LemK}{tB%35+nX@vDV||d9(jGTc1=0h zpS{GgJ>UDBS*6a2zK37k+pJ@pz^~SB5u0=yiT%A|YXc~zb!&$d%7r$DRDTtnwyfQDCwPGH@Xd=d5u~D{iZ$a3oMo${xXQxH%1U9k>SSlgH5w-n+bu63L;hAYn3HQ%g=T`&Bds*FMg93yRbLZX z;z6x_qybqDXSbq_rkpNgDqXtK7;yM2#9d6jinvWEV{nan&X_RhsSHa6#&cAYHECRW zWjk(H=bVBf0$*SrUuK)>|rqFLV#EYD0ae z1OZp!jPCngrH&!4NTK>x(M%LIPyeo4ZLILGW!?{-FMe4UXL}`1yw%MjzvZ-X=cno- zod=_E3^LWlWZ9loL;CB+ULi)DND}`gcq$~^vBCOU#SLh(_kbw=NhMIdLZ)&5Qc)dS zlSoR|>E(duw;P-f;!9N6w;PQ`B9Tt^FhHbHv5@SXNw;farO_N`$+*Pe!5*b2PPaA!okT>bu%Qa z{S<}y>{cw-F#{GM&0E5Tnd7ySCcD!;Wh98q_e>cF zaiFDwle#aBtmbPh`K2{*_+M9Fn}n9IXENo}rK;+krF5YsL%h>E%Q7%ht&QrGxSz_c z)Y~7>o@bn(5q#B5_*|Lf-82As>+Pv1)DwEI4UvnX5b%=&1-R*vm)Wl?S84H=-cg$> z`ZUL2Dr+4v_8r!9EpW&ClofQ*>uO(NT|kyxqpKhZsEF`Uy+~#B(tX@NOh&q|Ks5=! z#}uYeY(vJdZnjWv0yox@0zV$Vz`l+cTnTE8tPMQ~kpdFM8jJ>55=zS4?gqJQ@m2Qi zHT%(T4rTUD6P7fE=9GTh2YO^(qQl`lIyj}B zF!-4Mh?U>mpkQ^Pp$L)E5*e$Z=!BgI-%f?B#n)EEFht>AKVz%AU5 zKFO#3kaU|@9f{#N*ds@9W>t9&4vpn$Y~ejWD!7By z(2k?>;y>BT+=pzvg&)by%>i;;;V?zg6Gws8R8w|{-0F_6Y_kK-dl-MUGzLkz1AWpnRPOK3K{X5Q|yR9X(7$Lr<{;nd;SjNx~X=Jc)G!+Zt39_t)hf3$l-eN)8jb|0X=|GM42 z^FnfyhJ9^Ky=!8}d&8)r}0dx_m3<}Ke~$~$^ZOymXB_ZTVSQr3DDA-Pv@j0=Z$l@yR}r@4|ZHetK` z5VcEWe}R+j@Z?NIj-CYl4cw9HA#9eqRWXnvPJw9 zhCv1R91ac6{Hhk}w*h^Rs&QGNX>_*qZbD245K_|}igY>&_TaEiCL;-f6m2(BO}s$6 zJ_kwtQo|{((==p}F=7GDoT~ic;DfQ6&GWS4Ijt(vFWqm7^>ou)Qr!t*wBJ%ttbc_` z>*YUx)m2mPcX|V443=5UEtL(PKV|@$`AbgaaCOFZ=?meWCukz~k`9oj3Edq?uYfH} zdM`_S&!B>?*F_B|XVx#*^edqj?4}lxRNg~38$33IvrcJTp*y#2ZrJtJ3<{{j4=Dr@ z!6XqBcZ?$6F*|?T41xzOPMwqIJz)3ErjQ~FioAjUO0QjFWt+pOZd8y%SpWr9|Tvzg85tYB`GN8%mufVoqL4oaX>oc2HMtg{YMu+AVES4uprqcRw3 z@>Zc4agR!;uhYdEk220LWOaN)Y%BlFez%Q2IvNKcVfR*;cYpJ~B=wS)GAGCU`Lfi9 zUtB}j5@U|^r)VwG{}TEL4i*lE~3!XNanm(57+`1#yR2%$Ho_j2$#2`M0ly9-@Xr`whw^BoOzU-MP z15-OtUSQB%4jQ~?v8S!!RY8JrO6k=LGT!o>zW&a1VQcnhP&|{6|||!J&!Lph+wu+ktaOUfm_}e z6!0CeTz9BM>Nw5;DRq2G+N94Y_ZOA%&GHOk^&bW8L9!4ti>7FMlNk-`qGL#hYkA`u z<7^~d@6MpaUIBYn>%t~7mB}8f1CG+_Fg}yhlBSbA565<^2(Iw$H0yj&E)ev{ny$Rk zO>Y=hW?3EcMqb4kXztRwk|eD|u8te_4{|5^XD(x+of4r!VqeN(w-P5sv@C(~feb4j zIwS54{dW(J*XA`lO{L!@+kd|1y7oW6LH<3;{b&4#WwP?11r7wn|2Kdo`@hG3V%BB= zGfN|RBRxYS`+tUkQOXt$C`On(>y~w5s+Jk@%tWe4q*6FUp=jg65{<|-mC&frl$Hrr z>FLH2b)^lO9ouMV!r-_f9g$9`c(x?Mm`Hr&@ZPrIpJaSJw<4j(n_9_D6)C3=o!Q53 zQw|<%$6uUo*gg8VkOn`NLTrgy134Z-7l-JphRDD=p;<$6bt78b*ds-5Oc6EuA$2tn z)e*h;3kGS4f4gITj!|24e;Xtk53i0VM{8KkCy5 zd8+k>`VW%^hBW4}HfW!ZpCg}fK{O)KsIfY{9$;58>xSA%3JwTc zYHCv%CY(>`SH+T&*AS_Uq?MPDIv+Y2#DKPLj>xvOF{#Y7j|qCY&obbgGS8`ZiBKI4 zY;hz``e};weMsl0N)<@}T2q%2%nVFN$Vn7}G$BU03oNiYMdx=toC_ZHm`qT`p`FPw z3zI6Wn-ZKtB;1uNW+R?pfm=^!?~MGdpZ2au$=1ca0NXnYu8z-eXJ+$qnUtx~d#m{2 z3Q-h8tohFthaIg>1K{G^3gQOQsp6#NaKztq>a1+mMX29`1M2L-R=Ftz8r<`&d!Y+% z+T)J4Z-wW1>1+*>BD0vta%4XwluW7&rD+PA^yP5ShEZ?pw<#FBeUwB>J6vy)|wP=#*MD>Z4AZ(*~QZgI0!Zv4YB zZjsfrPXFklnYeduA~(~?5bm=UhpW^m4wmb?!g(llM6;Q?6o#|a$_#3_Y7Bb!?%+j= znZ8tOrz3-MO(GvjAFUgu;sIJ??YORx>9&g7er3Js=N)@hjGAd3D$3-m@GlO_XCF7F zOs~khE7QZ(#fx(`f8XrY#F#%^8qw&88^HkNY?j5}_rn20I%@}h3emUq}{;{Ng0(skQ54S1Y;r0yEV)Y#o=E+2Q#AcDYuw^Y%@swNizUt9B#!uCJa2cL&J{U z8MV}ajfe%UNRp-7MXv(s(1;}6*bFbk4ay}k39IM(VkwJmI|EtLn~*PE0}?4D;oL;R zCtVwMBMdq$g8s0`nC_#)v--mK3xH(J;ol*L7*yexto62fOHt-^MReYKzH zr5ra5s9bu~C$w(vfSg@78c?>|6z`A{Jk}P>d#sZN$vLEXuQUs>YG)#lo?V@OD5M>&9+a&g(uIWuf+l_u_QU9{Jcc&5M9I}lt zk&@$(VPb54XoGYj{vzbRL|TEWB)d*2ayY+7MEQ=)TP5=|z9q9>7#37k7asP=lFPxE z(S&$nbw4!*kNP~Tpd$inbMp6P?MXFJCr4rn&a*0(l>?rc15?|?Xh{huPD&58GI7TT%PGFZ(*Cbz5E4Y(`HA}Yo(viHdx1^^Mi`V1TlYad zV0K4M=)x{vUhTZ6TB0mIF+`aY2^u|l6%gmUjZ~YJ;{C1Zze|StUcFmX_8Rmv`=}tNE8jS56 zBXgNNP^VOZ+a4*iAH+4b^)u_ZX<(uGjF1Za{0sa)0~BE7n+Ej<5Kzb8M)H3LC@D8# zR|6wkM>8Aif5MYjY^QWTJ!(+QIhCbt_SLk7uPal<`L2TgrUVme$>2g1{Ze{GtefswAz?)>97K8~F)x+V&6@aK0< z52E*ecM-c#0&jmNcxtZPLkU;m1bK6?L=A>VCt$W1Hn3r?|L;N)7rKWV14mr&g`$XB z!i!Ee{UE!Dx1UCKRxV4|Et9fTyKmY&^#uOUvl_WNS=Ih`M#n(@TiBP@voccFvve|& z)ie7S><7i`(Dm!04&}IPu9Y$d>jh7OG35!h5L%P8s{RqcRy+pW0 zMjdU>VKG^;v$t6){n#F8)*Cv!w;d+Q9<3wrQ#Ni(cLg4wG4uA71$bNK&)4`BteJH- zrPnAVz%FfRtZtMt@CL*>Nq<#v+2;~~TtQ{}L7jjrnu6EOV2*uX4$?EF@8>y~X#Ajj zfMR^ml0SeFmQ$Y@vCz!}Srv2VB$*yDF{jgwk=Kn~90dVGrqK^4BBt(Rwm$&VB?De4 zm0vgmmR)xPmj zz)W|^qzBjx%kO(Fyr>2lCNoZP5-r^lR9FtEC#Dz5{Acs)>QLQPKmY-WBK@D{|M&EQ zprx6SwWElojlQ1czq~$`b01tKEN`;a$q8D8c+2>u#3sx6->j=zL11xu~Y3^$Sv$-0!s}!=)XNe_PqrAS73IR z>Z(KLU_{)@dBSWf-}w7u1l^EgZO7eilIydV?|A6{b?>P3Jz2s5nF+UEV0?(h+6p&< z3}58o1pANV>bJp>Z26)4{xcuR{yCwydHy-jlYA%<&1fCOLoP;|;dwA7gU82v_b^!9 zi8HAZCKCeu)9hx$sf&{wBL0c?hhUo=R_aXUcaXL7=|<<7!{9RJ#SL2>$|H}_oXK({ zJmk3)DbCb1O!*q8X2TRk5k;hbS{syYBO5MH)OjycncV$wQIHoj*Or))uL?{an2^s@ zWR9sFs>pM#W*Y1}vDP!|8QrfFjk#7S+FdGOu@N!jt=%iWXZ-R53{Jb^c6YzJY9Cb1 zOMDJaQUl?J!>nilmO5?0lH=4`a-d374|z4M_P;W~F<4<^NEWay2~Sl<47+w1#BG z0zNB_$K*CS3pEVOb)bAZiB`{UnXpQJy8xuFxFG7(B$}-#!=CsOW+S5cWyW1)hTe&! zly#A>;9IoI9F&Z(M0o1tBrO)ihZF0`3>_leFnuqjHYSRGUgp-F(Xe$(Fu@U&&_Wmk z!{n{PZ@`ku6KOsw;TRbyu_!7lkXBX4mlzo+pH*_qVkJVBY5B$5Ot7{MgOu6jcTNEe zd@BYQ<+VB;q0XCEYXVp`E_MWS2Lf%C1Rte4B@||1EW1hCoRP{~vX*JqPV+QQFc`RY zF0{g?c_|~ecepU{oDf3W@*tLzU!;*}&|>!Pk@s?xqJY_U`oSLI(7OAol^*m{#)d<3 zws-2nc~+?QLD0Gf6)L(GPDZ-Co_S~LHTo`-4lDLtUOEG=}%X0TJrfF7pjEE5^qg(X_{>Ep69_f%B zRzIym6V#M1&(O1qj)k(Rgl7S*n#X?9mB-3Wp{{#HGDW_jTi!Fw_iSM^fu=Qi?J?;F zR5Jb-JdBH=R}EliQtF=mn@FHPAmwEys6wU;*qwqwjN#6-jN zbp%>?9G4N(Snj%{;B=C?wRS7*b0;lCd8ka1Fry#iB{MAa}m)% zL=7A?JpM`)RN@ipm(@!Oi=rY}G=IP`QR5Q^8T2bgH_>NAh#nx#wj&fm=xuAGBY@GF zgL`ItBYtv)j(^b>AZ<`1adO&a-w(w=2?|Te9p+Big5tJ3;;M!e-3lJIYR9I8)^U?y`WV1^|?@7a>rbn(@U0VSIU-*wgZ}NYqNHO zERGf^vqw=a-qdnBjd%9#n}2XtrF%CzGx+mcXxw#J3nB zWDHzNfcgJUl4vYkOkwW;eZsB{cjg0;5I zU!Ng_HGpVso))(O$_k+=haDbq9Xi6xCS{zmM&>L0&C6K%7IVZNQ=rS3uI`C;)i7Qc z|96(>9|ac*eK-#xf1T&-zm4+0IMM%(_d+%<)|NJUhJt#Qmil@I7XQS2u1A|?UT|=5 zL2zkjaA#+5cmQ~E-ogPR0Nfd_+Vq!Cg*OB=#fO23U*?ob^9SGyX|hbwK`vp#la1GX3kllK(%3qu^+7q-XWd z!2~I2$)Ly~^0>5LCb!K&qYls&EXkwmvAh%vh2)WuMtPAFGH`EN+t}HylCIPIx&8vl z`2gwK34qew3*hS^FyeMG6P3iCBy%{P%1ZlNm+-WFO~Chq+h5~1zRNFNJ-G<+AJ4Ll zw%xwe=IF`P3pCU)hIx8K^y_O0A#;z!%{-Fu!D7F{k~VxObv^pomG$Oab4vVtS5QZI z?gjbWXz6tb2pT(RbghMWNM$WwbKQA1uFG5{oI%u!)Z=~ySYf@t@iL~5YUHezSCVfz zb@DSu@*F-L{ycqzxQaL-hb3BVuNaL?av|4UWOKouJS_6fjRqS_8Dw6ki{WvKeUTHr z_S{BL9RB{J=gt`CxNQb$*iH03k=Q|zqf>$uICPoOe>%4YC$XrBkR~D$c|z{pP9sD*i{(4 zOkS)jFRg%{W*wYswC1}SLEkk2R9d9BV&63#9q)6`A>nXq|-I_E%x&4a9%;mrYXI=R5x{wuQew zGtqyu;Qqmpidh@m{3`@iJeOZrM*NDVtD_czgeKWV-qTc%YzZZ?nnxCZEGYLTQOkUdd8u=g9~ase+yE+N~m<=g4zPNPq8{erSVvXaFq};`m?f)hE3I= zMVmV9=oQz&12%24NeT)uW~Ot3&7(QdrELz zOgkltx8nkY?3MX`%-i4-7v>Ok`s_bqGG0Ly7#uv@PB0jH5qU&@=s2NS~pW% z;2lsbkeI=|#CEB@fe`q0Yt%oW4c@a*?aCy*e9c$#C>D1`cYBG=dB))FHjzBZ;+ge$(XWyMBYFG{n);-Y+H00Q$YkV5Hgw-rcmFFbpI%$ebA!zxa6xfX8Z;0KdPDcJ?+;8!F{2DZuOkUQ&R>#^vs>qks#1#>utCvugNue6 zC~w)%z;6^ziNgW3%Uz}2e3d7o2v~Q`eHq%&TNrJm5CsPf1*mOUH}t3r+t=hgj-9en z4Zk*iAmo4jbhK#*S5$}^7Qgx;V>cSv9NdA~9zpf_eNN1K2yai$CED*C%fB>4Civ-t zJz$=?;X9t|v55mkr!T5J3D@+k+Xt`3Cj3jrHw};6z&MJ1?ktt~TK3VGgwRjm60Jfx zn^3NNBGxlZaqA z8UhVuP@Zt%Padl|D=De^8ZnqJY6Rh%9fZGiLG`l%u1IRmN0(C>&%tiru3jLr!_iUH z%J=lOMg46-QZO2@YPpIeSgHZN4~E}iy(dUhSrBrunusN=?os=+N*Q%@n9!F$kyR3E ze=XoW3%pS@7Ebrms`z>P_@s{tBBHzlUgqJS30`Fz@_t}(RFWf?VcoH#3zak%Vz+ry z{~E)%@*NiQL2Sn(MOjVUuZ^VaMxDaESWooAGR@yZxH=7$X$8SCg5XevKZW8{#JMv)(e@zT{RNv=rrm!RV0Zt;0mGOkSn3760&r)G>06cue z=f7}{QVWu>dw+{rf6xE{k^a9;^iLcuREKiaSWMy-Ij<)grX!NpzrZ8~)u(dKWbX~6 zZm6T-61N-`twTYQS8K|#BCRtd;UM|#*Dy2J+2E*WmOI0$WokjrP9Y|!vNksdmU_x2 z!L^COX_e+xL{s?Pc`fGdY$(e0%FDC)o$YYV^L!yQrQqZJL5*Z}be!o~7y*A%j_Tdm z=N-g_b|v4UvFqE%1N}_dp|SfX;`v4!gWfp=EjMZcWijz#QnCV zSNg3xC6Ht}d^ifaTiMb(p^vTo1)Y}`zZxZGnd?=VzqK-ayT=AKe?9Ai4C4|F=J_n7 zLrrq~?I&%}Hci*Hu`|RR&R*N}3rookPbbz!~>u&0L1?hXr7dA8apb8_-o5o zw=3A}GjC$kuj@Cpt})+;qnpu_t_lzaq|jbGPwWatYfDJyXJROLHT=&)2(Soy>!Ib*HvyhL z!LP61dE4DO73dL)WJ>V?AYWHkp|yF^(oP}opS`kfVSmC{n(1j0U|U3(F=@pabclPe z=CF&@#lk_``jC)1LHt4qEG4tM1V@QSn;aRLX3=R5NtII81dg%0JO=&_+HxNiCh!eR9m}~3GPDmJMK;8}R z6*U%uN#KQmd3ryM;)jLqh@Y|RTEe@i$nEQ;eVAuzm1aB)+QB5e>~xU&JjOWy+s&Ma zVLf0dezNR{0);MUc8JnPwEk1QrW*q|uyC*MN0m|VBQ;it7HxgGhy?_ZXSxHDXq6Lo35sbn9Ym=X5Q|#rKw3HE(?QRl^ zI-&Z=(M-57%xIrv7Zrz=s1Z|WVA0f(xb*di1TUr)HcjT%5d%jC=d&X#!S7*XyexrD zCuxFg(E^qWgJt_x*s}_QIo(D`+T#Le#o~5g5fK(Q&+^a;u7 z-wT<^nQODH#ji>TqTC@<`JnT}oJt(Y@{FEDUR4!k3+>%o;r zj)wBq8j>aY-0Y@r71fz!R_s^L?}T&bOFe%$U3I`$qigfX=pENq=>Ji@BNp{PmgUUl zm&$A~WX_tjn7ugBgPWsaQ%s+QwtCxu$9i##lpCBP?7JA96*vn;pTCQs?#AX$C|a&5 zb7W$!eC(uEq3UDS}6B%dBmAp1Dt+A0ga=?A`vHda7Ct3PZRTvE}$GksIkCCtvThm9e3`o-~Bf zCZV0cQ15V$qL^d*avIgawdb_rAqUe=waue%)f#(bU{7}`cA3W}yVeg$c{v4p zV`Jly>6f(fF*-%g^W2!s`Ew1~>5V)av`qe&8Wb*o^bX|UzX?d*|SnmF#!}%)5#y8|3&3k&J@WH{xC(UPjZ^pZSG<~lYT0c7} zbAy5S{kfUK@fu54;)Oott8jI8?tn?uIu0^_xTV;8adP+>f9ULm@Aw*RH80Nv9LC!`I zflty6*v8$eW^3-=#Md(p>7I7}=2;?v9lLgVyj(WK`RFv`KEC8k3Tx9 zo#pXJO)<$SyovIWcH~g-L6#(4ab5cYfB7kpc|yL_Ko$EHOR|Gxvh14eSV*x$WU}o7 z-$X(Y{OFnri~%NK+CBHPq2I;v)3NAd`>}1=*9=6!w!8eJdn?cetZOoG8|VXo(uMaT zMfPF5)0}#v;kRwvX9M9K0@aQ35)Jn3mIBp{^CFGnjd0^3_2SiY&9>X_d(FD*;d{-p zivZ*^6L<~MwH?R@`r!-32l=6g@&$P#BJ~1#Gkmg7`T?~glU@`1Oo;M@dQ*(CGo5-v zebY}yec)mEV!}p25yFy}KqUZ>pNk}M& zAb7EPr9H`Ru?CN8hB?n`C*3dV@rNshInL#bd6eq$mn%$0D~5SA;+=_Udha_?1zRoz zLp9-;a05$2cE9p%U+r4lpsTWi4Gedu4si}oj(3oe^IZn5_W;)ck^+*Uv z8M#N{V$)M+kE~5-RTDmsaPu?EGJ8GP>9R%F@zUrmkYR{Wr zb}!0qm&$KR+?tWzG*%>llaE{yh|1#anQj3o{IcS0eZ%5yu||eZ{JlL=evA|wP~nfK zSAW{7>M2$c^NxOP6D|*eSLyk>7qhzonK`iRLkC3-i=2G4>?BOT=v~}O0Z|@8+WNvT z-ZkB$ZdrT3pUDd#3)331jfb@A&gs~D_L@%d%G2UnEZSG9yCrS++Uh1-7ep00yQ#$0 zCUAfu+O0CK>)a+Z`0FeeIR&GuMoc#bdgajj3M$;an)o5E66|S{KlR5Y=v&<=_ym7^ z1hU=;%_n1GzkR}SznEI?=wdCr;WR$LjlZ)R29o9$=w`a-eMBWXet%Qs%S3*`u-5v1 zb?Aj*w|x8b2VJa4C7?SbTGqj`z7o9Y^pkb&Ao1V)sowGkr$v{3Ag@d~Ya^i@_Kc^^ zLd$<_?l*U~2oZ$9n^GUPvWEn#dR|<$z-yf1Fb{Vje~#Y=rGZcm=Au_Ck91;}>3FaV z`=&ML7+#C6YwXom-Y2ztsYT2y7`kjgo#yLF`x2$>6pf<(TIg-?qiG1be4uoePc0|! zvkrG)iK-Jz~Tf8!wAH%o#H_HJzc(@fO+Ov_U zNldybHSd&BUh0-B0v9lm42N3Pk%h;TcDP}xm zb!OmZPu3Tg@>IEdnf#KOOYVZ>r2^gN6iIRObQN9j>*Zaq0w+M7>FAxO-T~L?=k5w7 z+O9;`e0`VQI)tIy6m;H_g1#}a)<`G zyFM(Tidhw2?p7KX2VsZRt5gmsi`8v<EJC(rF55!3Wi2Zg|81tYh%DP%oETSM%TA565W?#Ff(h%+@Avk+4&datIjg0;(OH$ZPPIizJ~c4fAVy07F2DE zlg8m{k>e~=Rvm-)gIxt+gDvkupUJD>X(?)yxj!TeClylqw}e(%yP5jcJZA**Xd*w^ zimfbem_oi&cPKruKzJ!PfGhD1C+nZx4k$g6bW$pA>y`be!P=faG5v4g(D zS|}Sf<>QkxZ*!h8Zz&$(fNM}NCYTMur`9_EV^_&}b`+rsYMu0=HA{ZJxx$|q#i7Jw z5Tmgu6=0Xq=0@DnysK8I?N=-zwbv?y z*E?Ssy{A?gz1ym|cvB%a4DrsbRb0~E4F>gVhEarvaM5F^Yt#60hAOd)_jjdJllpt5 z^Omo8 zJDyL>R{!*j2!nU%ca>t1^`FVYJ?3Eyi7Zl6g6e&VKTJ_odlGIuQzP_@!{#N2ysOMK;J-rpEGMSk*BE@%Qkf$A~^E1V)ZH>EhF)ee@? z`gl#rze+*6kh?OMT0L!JtxcougGtR2P#E$!4z3oSUqFI2$4+9%9bcu z&(-zT+eANYv*<*#qg$)~3|ZL~2cWUc)p{Vqm~({RX*Ch)f=~t9<%E7y|dZ;KDiF(HmiG}%ZQ{L^*o3n|2^3k z#2RgfNq8UK9n|=|FiA&n+1Gy|Ns*?sXw?5^8vn5;gZh6WN&n`xoeUg>j0|l4*RBl3 zZ3P@9)GurAi(o_v2^`ACnLkNnaIyYYWuU#m{zXG`3~3XNuD8bZV$JoNlNZ)yHy3=n z<#b(VFzn9Y?-x2V-GI+4GF_-NakAFqjf88@W6$HQ&F-(SeaIfhY!W-DaZY7N&v+r! zai|TYr)>3bs122;c@m-*>M*55#|?3PxSVrUnLS`uN6*}SKi?)}4&@qJ#K|LU;999> zBWOuQnqkikk6GrzyUwY7{Zi$`~}EFpEO4VaDTtK{U@lE?y@&XB)Oxv63_k72qPoa%s}=O0ru2fw+)Tx`O@~U$L#Y)r z>O8bGe0@ti6=Qy6%rADPG<-vGJ+I)Jgh*!#5jcRzYd_XFyqWkEZZUD(CobvYh<^@mOHG+e@{t!# z`5S%ZSO>v7#JKzM`cQIVZw^b>1aj-_TTA(pqMgP$boOmvRp-TS34}bw0s)par}tlU zB$0lk6{Ma9J78YU0du2t3NfDoj>`%FG859wi<88YF8+O!>Jfatp~rKg1C)DkGdGfO zGgKIND9mmV`?&)vgUcd354=PAWP_I#SPVmj;{4U}){=t8ep)hTh;Sa4?2Plt-M{3M zEJ+D-!8JG^irC$+w`N)|_eC!hG0vUvgtsH4!@fE8%i=aO-XXjeSL_V+K`4(*4ooUf z4Bm_woWYuh^)G>H2OC0^Dr*Ngf=EH22bnzWlFN5gl!RW7Nn_QHrq$=@rc z-E4a}hI2@vRpQFlVunU?hebU2qF?VjDF7ngNBaLA5G*6_qI3PknG8N{LH=(_`u}0m zD4RODnL7O!0O+e^D~}Z1yVPw?> z!qySv#_$w|57CP04$;-mDa>EP%&SKl^1r6;A{a(hpp89j zNP@pX7mlEBD+xo(U#SfLfSyidzk-@K+=WsmpBo%K@xU4L+JjZ2a6_<0QvOg6H!Lb0 zakKP*y| zk&@}FgN4sF^ag{Koq|^k&pK;WAn5&3-2~44_ar$`R+k_iBMIbXP%xkncFStWI zXHCMqriVzUL7cU;8*hmJecASER*1cQLZmvM#|!KK<7iQKv3L4}ME`^PO|I(jKM7$X zu4ZQc0mh{$%h}KUPkfY%ot=@!5+0yMQY^HaoYq&biW(_|5H<3BMn)drJloFkd_)gg zFbYu#3LVZ5LJ)zaoksX)B3deV)${gnrCrd^?*(NWf&q@>qS^@Nv8mkh&)GKQgAHH9 z^|D0vjx;qHXsSOU-(l5EL#mG%BP!69CQ^(~%^W~5s!?GK+wQk|;f7Czq(+4cALb-K zwCn1}0yx1Jh$&M#p@57BdeFN1X*SNMPvB&=BvJ1aa_6qa8YjAu=9mUeX?2nlz6k%` zw=^Tr^=-n^YBH5@p%l_U2Ds?bSnrMojrHkFwTuBJSRwtS6F?l zqp`P9aU5IaMFe5Vw3O%F<8`~8;QB_huDFhojxpS1ZmKiaa*Ot^<>ViqPZ;=eY%Gnc zDUzNkA1P;e2|bxF_c*JRolagSt3zT~>Y0&F>M$oBGAi9u+9`_v=qAk)sATJ;sRu^7 zAeQAeDgh&=~LH@cr5zGyBa+|Tu1$F^7F&$xClG+;ud(UCu_o(Y@4r~|?g@^_&`7yY0 z;|RW}0~Qsc{(VQ0i16D8w2v5hBq#XzWJrln54L#t#6c>l^JTQu8?MnDg57H$X$1N0 zNF~tLq11QUZRO%#%R~1~|5+!e1ikIT1D3(VIZ?KRc36*!nIHQs3_Ww9Q+1vtF&-U! zQvgr1QR8O5!;wN+qJx_>x_HlSLlgs@_1^9Nf`jWv2l}SEkk9hc(0Yn1EpqCu}Y8PyT+X!GRnZ@(#7ARXVrBdg$ap-iXp{04oW6s(d zGtcu5k8V$Pncwp&k93MDqUlO!*5gMEaZA9srJ9H(R>F-6S8-3>x7VmPKV>bBUwW?h z>`e!VyOI~|t)^smtb0vO3+%F7Y9`2)RW((_Q$0>4_Rq4d$()jwCgt>J-qw5~$ z$v3U4)T221KWaOytUPUt_d7)j{R~Yv9%FbKDp>V&;}vCYS6PbPMwpDkum{d0mlhZ2 z+jd3VWGPHrS3|imQ%Kj+J@>FvYN;>PRrNX{2(0KTv61*2P0SkP(iOVM1)4gnJbjcr zDTXpVEjUYlrc{OFRpL#W2L5W4PI>0OR=sy#m*}Oqe!k&WO>w=~XmX2*Eo{nbHUlfw zdRyF8cwQIZr?4+*+@HG1T~TE<2-uJMlw@@L`q*=fJ(XflW6F!cdB${HQ(3&j4<5v9 zrQJv4sg9DVOl7Qv3-M?U{wZp_qXN*BJ-F7)y4#kNDawh9>k_nE?eNi;>5r)V zHu3f|q8T#Q68zr2B1Q2I562}q3bFUgsw29TY`n7K5Q@-mtbhMPNB2Nefr@AtkamRJ zH($tK0D+&HN2#|aa?dpKxNzV)N~6(sUnWaWGo57_&7 zE_1v4rwN`dzCHzSM)q4e-|E?o#AnG8=UIBuOvgVW zVwl=cWaei&Xl0KZwKmFk!c#;o`;)}O??t0kMqy@i=mM`OYP83TYDjt?Lt-!aq5h>e zdVg2f#BVZ7O<>kmaPjxYi0{kw=Hfd1bqbmFw#GEZCEN@@beKEigdf+A&L|$#rfCU9 z<=NmZP!mU=T|n>rfah-={}Atqo~41^VF!Sa%9_vpaEJp+GY&sZqC>a|ofHuH)MHWPJqO<6ryDaKXHXERDlgY2nQ zX~acm7A9LoTUq~y5`#`Whi=bCP3#gwZAIz|rLM$ywWN_@hfmiRB%1e|(HOFY>l9}# zo-E6zYYO)JYpkbjNdoq()n1wn!crc+t!ain=AG7yF8LZ-{T;$~wKPnbZD8hPLRfVp zkEve=?FI7me7o*g{(M!Jo9BIpQ@44z*k($Pa(KrBO{Ni7x0$Ic;-IDelE5ym#A}W7 zhGsK{{!sa*=o;czsioe#uzA`_ZNfFRsrsF^dYa|a8))%u5WwdZX#bZ?|BB~Y8tQEd< zz_u#8nG%#(HO0~SgBL9r+731atCbs%^V8qI#Ey1igx}8SQU}gX$5ZJ;87C^UIr9YL zn#P@g2eaGN&zypLzmFmB{F$27xL zcsrcGKX9_URDhyRKrUvX)#4gMv@)yI*i`M5w9}Kll<5Lrf$wP66*%*4kvYyutS!J~ z3Pa2A$;z9W43VS-rC3FU4A5!LF^(aA3F1isbGGDB_zBdrc$(iQK<~nBYru2rP4Y9t zb^xz2gs^UJi`kU$&`+phDGbco#V6Zx-Nvlnt1fNDue{X%!Zzt!i!f*0$T`uCna)%? z>44Dv$WtYG8=7DD7w?EavM;A$)t$+}g050MSzUGNQcJJhz|#jlE#$;+l_Y-B&@0+4 z{DkmXH0=jB)**H2nvYx>=T#GjJ<{#v6HjI>>MgR1X`20hrcD?3M9WnP^VV2PsOOK` zKi~)EtzPZEj+B;_*B9okQTLS&{t5S6{<=IVogC(^XqsDJAOAFb56Lw5*^&X)7A_o$ zak|Rn+CMEm>-8_jS1>m%NM4qz_X%h_ILb4Rzd z%|g_^yYIf}hjFZi;k;50xw0$af4B_ocEkH#nFY~HO5vRcjQGdmcfKt4*|^>Vz16Rg zlO4RpYwSpuvVEGEKZXu{4gIom6BxW%C*-e*`#W-TQRcW^Y6vpT`(CNKXeOp_a{CDm zA(G#Jl3*PkJ$dfjr!o_7cZY#t-nG;8_fz{`SwCXS*B<+%)AV=L)7zlK4?HMl@~p)@ zO;v@}UB}m4^(J4r)G`-mO%309yRigY3hzRVz75bM@?P0$qmW0%=DqPtyZM6S&5|u%>42zU2O->XDarFnyXYNDdu{) zjvAF6MKwu%yv};6a)bsGYU(jcPDPvM3X!+fZ1qI$XH0*&pB<7af0&)FK<+Ff{G zt$KP?d)3{Zgwk7)aSHRMyVW=0ys>gOAeF76*R5cSSmmBMTKJ_}%Zf3X zr(PmlLgl;Sdc7W(@li?)og$g5>>@!>RY-Asw9ta=yK+jDPpC4 z;bsqpQ9xlUkAnV>73KUmPbu~hA*dwOg=gvYe?%W6xXn?_^qgWU6+DH-*;cK0up>VD zk}{@RdvR>lMCXpLm}{PNA=T@bU)QRNuy35ENL^(rX|RctZuLa9>q(H63YD ztZbSbrcj1=&b4T=z9}S*ZoI>`7=47)a4}7A#cys^c5*s zSIkhyVjT2TCN*Yg1$HIyg>r_jd!TKv(>#2gyc(!I@#s0TBKYRt+-jO|3GTVq!SdAC z;&W{kTszqgzfBSUzZJxs>+zT*2#_iyGkk`;_WL7=8uX_U=AacZlLWHONa@~OH2`B% z!BvGY9C~zn?9t#zEG05cLE|go0N6*+@@D2zB2glBJN zw?dhdrM$iyPNMOX>*gY}Bhd!4>nGL7M{L2-*XAxB|}yg*h>8`kts}Y$|$|F&h;W-4EZs z{}A@l?8i~7!Z0}pb{9gr@O#-5u(;3x$0_eRp)>!&^Is~^xljU?+{c8+bjx$4zq z7Vzq%bgL1Ws$kPmMgVXG1i zS^Wp^3dx~5G?G#n8p~oll(7NG)SKZp`|Kw$Zy!V7*z}WR-`*W$J=RNSho57?4C#BNfL3v+Vc+M4D()<>9kVM z3Vk8z`toW>KM1RjX;?S2FG#}O@-9e16OU|k_O&t;hr0`h`+au*NhWE}+90kp&~|Wn zH?kgO4k?I7$Hv)FC?s(93&EetN(qLLh_9l}Qb!P)1WJ8bC2@cE5ci(?xEfQMX$%RT z`8UelhOga+uiYd|W!n%M)VO;T_FDOcx?)*O|?O*ZFKEFEYDz=BdIX<8=+GU>QyVx8T2sC~J!Ik?qQ; z7gBElo`YGEWL&vJPWlo*qI#vcI(kTAGlc!ITPMEQnDaWqR-^xKr+?XrxPL~Yi%0&uhqWg1DAneGd zpojcXvFe<~mKsGu-KcxJ+fUb*t$eEe&wsiTUt%+T?dH$ zs8oA-H&NrQ%vQ_HebaARee};=5HRU{54`u(w9Q*5mAT6komhpv z)K`jQIAoU?o;7g5M+#eoy;I<_2`K@UrZvm`S{GiJ;9 z2h+C6f-Q>g>k^8EoGpr{dFc+O;T|AeO2QZ-MMve`>xc^o7amnxN zj;>9hMQdalxcsm7wZ4{%)zpooloLFNnzR;#qKEiu_I1%4>i@1|l1U>HA5)>>j&s8g z-(^`nlSadfo)r)qQsGL_9SH2mX+U^X3KvO1;vLd!h@CV!7AG_!m({$f;~EF>O##df+Ndr#_^2R)Ql=_@nypqCQUVqY?I0H!CFxH~7jkB1$CI zn$`FqUG3G#VcbomEvdRtA;U-(z-IJiv|LP6QSzIA(63cTBzvsvEMTlScN`fa`go*- z=`5%qOJnN(>k`jNS;WCtR5*g~kz`1iFoN{aw6fO-%ILu+ytsC9Vd_cw8Rpz8$n#Xh zVQkje2iA>tLvJQFd8CYPMv2JtOS*wwr+Q954x((3RgO)Sqn%a9Ms1z4&Kq!s#g5#I z{CH3P8c}UIUKGA>my{W;(9nz%P?b`QPce>9$pK5xXI&v4Zm?*RM@%@8v$}%grm3y+ zgzZ$Jk*9Eibl9R)pfTGWuVzjv)Z!)FXX;>i^11${iWkD?+$ySPSzYAkv(jw9%e(R5 z0#8k-{-y>2>#nt8K;>Li?JDJ4xzohP#PEO5d;@n{1vXpBOC=!`Xr`ZH&e-C=5QOP?_AIU9{SG<$;Z7v|Zv-6@j4P_L4cY3pWgWV6^jC@6Y zwvE~>w^wges#QLJIFUbtn*kncj}Xu3E8a1@5$3an=+6s=>U^(O0BNpTi`ArAIgSz$+>}u-cqd_?ZNcfU{c+^ahD|jQtb{Y)GI=-2>d&M-8|WA8qq=bDeiJG z?yI{mM|ZXQ)yp%~`%k7l`McIv?i>B@AF+D*D_&t(v&I>P=9U}xHVpcgA^e&7_e* zN0v-y;N?f$RqgG2$mdrKUqR?vrk*qFPN={YsH}Mee%0w=Al5E`DB4-0>Tx#wyL*sc zh%>KPZs3tk))s;IueuE7vgQv&;VUmujJCY2Sb@4MDwHiCWX`dIY{HnD}T# zcNz~J6e9J)gUgvC*sH(re0HLKbT{rn7h>%aonMX|VS)EHS!W1u-1CG&pY{n4nEM}r zuiAOUg&U>M)Nen0W8R5<$ju~+C5%PZ78H* zz*vC`r)!ZQX$sKV675`)7WzH8hTt_W0^B}=Ed|(fWXs4AuI^X1DBE3%ELHyY27m7K zgz+RiJ)2ve#4#&#V4?3(uH*X&(N-~qQQc+HwvW=C)pRG64RXInvSO}D=n}K>YuTa?Sg*z;m4OQZC8gjQ4$H& zlBGyfJi9%^bqZVFHE#B2f~ndLCtn@;w=%)P{Ku28;{0pbt>13;#}@@fU1(;_ar-+O zHg^{&Ud4+#u(^JEGC3r)jU%rnu3l_5ksOFm{FM4>T%P=t0GaZOn&+oz%+w}|8z<~+ z=1*6PJ;Sb)uYY7=IpKIebhkPI&h~U<4jiJpHhPHRtQjlK6+tOBx6e zZI_h4Z4EOx7j?+1I6W6dD?fgao|9}ImIV4`4wq^kUZU~L(dnzp)27QKox1yT0=SD% z6iK(dPImYZ!OopnvO7^^+|zHrLbi6ExUp}-A-rISbu2@Grto{_ROT5-y+)vN_k{=s zhDO1qM5pG~MBMy_UOe?iS^)cAWQo+DQNQe1t4oI(DxK4l?3DM$KpgwVNZkIA_sK3^ zAmqXQ7AQ`%_+#eF^{s_H!sSzHuB_>3t8b$ zEqL}!F4u=30mHb?F%=0s*Oqm^TjN!Hgbf|1g2>;TGOB9}#h)=%3TsOjo>g7)-?gCC<$g94u7Ok8<0)f8!JO52GRzLY|W1lyCvi+F0sxAX8?RI(Z!=LPY zv9~HO53@%uh2Ou=P~8h&`Ca)C@#%|fE%odnU-=;NZHc}c?+Xt4kWcvL7~Q478JzI- z%9vh(BLS0#7=Tv^2+d2npFm@Gm^H`DtB)0Q0es3?+69XdMremmWkhmZXjEnf@RJL(kp=i}m zs2z~lu!^6zsjqox%!#!9l$uFEAYwK64Z6v}M?N#kDf zo)y^ZKkG!Aa=^xNF5VNIxV^@IpwV+sIs7ube&69&bEt@rhkh>c z??u$dz4`P?j;#c=K}|lGD6WA8YYE+PoHT8*mw>3kifhLC$D{Hny^&PvXSB;bbG~QV zRl$BZfNzREM#Xbye8(LI?c1h01eiD$ByRzL%W4WJP-GCLzT8DE&W6j{J7$A83Wu1A zhser>_~eXlzasU3DFSZkAdZ$?e!U}SSNO}AKD(>HNSdbSgI21b;dn*5A1vO3gG()?%KjLX5)~sXmc#UVwSKjACZg&A&BW0%T7H6R6?tJmdE*s zl8T#N#iLTo-&&%I&3T5v72vwiGO3W@K}6^k38}mfOgq37&_IBk0TE%Axbdna8PZga z)li_Xf@i^xcBo>785b$sP_FQ3;$zT?MSP!Kd#~94s-3<6`g3WxkegfOe6cS=f|PBc zde|{ty>%N2av)^L1o3|V${m%-_+pXfu){Zlre)#^EJ$ho49l=K?O7NTO6pi+;iXda zkzxFo$@^skrI&Kph8BeaA5v(wL3H^X&F+^x>#W7sx0oTL9Fb`S&RGmh{@@Ziyy87e zfm3V{tJb+|`U%dB}x`AEFU`e*1PcVs<=#>sYscSI~Zr zA?wNzAPR4edMypeAN%73#~6#yo?a4Am*HoYC0`heXi??J5&PpkoRU-!2K+;49AwwU z5>6ZAq-8RY|3}6mR8g)n7G`Ecng-*{X)l~X>IkUYA?>HW5L+xdPD*24_7+@31}rp7f{ zDVTSi(@i|0AH|e-=|hABQE*xI!t&IEr}R4e*%`?u|8@+@{2}Y)o6R%7tW@4|>p)$< zzKg|Sz~E|a=(Gz;;R3t$$$cdaQmU5&Bu?NRkfp_~;K}ZU*5&{_L5L|hEQmADwcU2-Qix`g=U{ncpApb(llIMpe`cUnDs-X)S(^ABw z3U+ze=%m^z$xr0!8*K-7KF3g%4_MiyMqnmsFA`j0`oS;}<#`d8v%`1xHb~T;Ap!n# zEg~zs0b`H(oPVK_^r$X|eEE2A?tPy$#NnLl6&CCoiB|yBZ6lo9Mt>^-=RH(Xyq5}{ z(!ma8cA@B-66r(d$=2(_8!@)?!^^<8SZ|9mN2XY|i&FTW7RwJ4B88&MvQF=z5W zVQLMsYW9pg9n{{R0#Jiq$!<9Dy+1DsJBRk}vaZQHZTMiwz_6Xx9iqhe#B=6DRCo4! zByYnWxn1l6W*bi-3^QfdfS5zSINWImsy*%tvyOqznAFzzYwQc_*OYkicaMFz;NLj@ zN1!2mzD>k1@PrONb)qu@RemY12HV z{24*zC`Mv=!4jloski*Df+~&$Q0$lxj0JUP9+C|-J4#aEVG1D$}J81V}vfWlV5 zj=2j`!AFL2rU+bYJ^&XTfr|AFwS?`1A~zE3TeV$X{Uz6UvZ9HRSvTmXxhIOXtJYH(6z!`c`>QvEN~}P=h?GhqV%efj!i$?E|p~Y#Qm2O zC@qouD7#|sW5{@cz-PE)L-E|aQb5WBT!e~ue(g+Vz&(_Bx5PX2b83P99A}hW-wOYB zZla`v$f#^_0B*j^A2L@~%bE%aLi3 zE+m(4s|+md3jC`z5^J{#&9JW6h3B<153Ku3Wd7{OauzM4|D;>eH!LexqAytD^9jua zy?Q1J;U;~&aKN1-f{@QyE4e5EM|9g@%4ec4@u)qwWLK})H~OR>>}6SJ`Xb&`FJVvW zeif*)%@!^RM0aB%E}5k%!WK$U$PQt?)ksfTxK}PBN;zv0$(0z8Y!1ekE(T5Bs55Hv z=(*r|Z>F8XUSSD`gkqJZxdWm99CN(C0!IX0Rk6LClnc=N}Lx!?3L>yL7yO&O6s()U|q%V(nfLW4*>!^gkM1uciLsrdfe-}1`xs&>t_q00`;nlqx<6xuKWjba6 z-$H4qJd%&~6z0lO4v6qHm^YR5gRK5I<0)_C@Umtxde(oLJkCKGVH+ydnkIobp*YBX z=DMyUJML=RIFKA?0d^sSKRjXm7bV8YNK29H*8#?!Re#JE=vb*TyMF#EGFsFP9blt}^X8mr zBk-Z+RyXQGXt}HZ?6GW@Q;1q{(Ekt{q<1X5ufM;9$v<*Q#}ofp@nBcC6$%Vu91OI? z>}eEFwr0$?Gh;u?m1idQ*txS60jC-7$ra`5jBk4$rYhZ<%SLZR^RRe*v?DB@mD7RA znGBWr@~HQak;qVBqHsd;iQJhpHN)Ej>Lw{M7eOmb;C5omVZ9@!a>BJ^LTCDZ+mXXV z2ZBib6SnobrQ9^w9OKOBKGL4#1-m)_uxGj4Zcpe&1rz3>X1d=N;#|_iJeps<(LHrX zTm(SsB`rSlNdMt>SVjq1d1U$LfnJ}Vt-(s_vvC1P8EUy^N9QyU}cY} z0`nW2e29LK4*dK0iFN*ZYB=??Z*4`4V&z0IJTj+XF-Q#+&-?&XzF5z;z!O)Z4Q898&12o)8)5oVE#7`` zcy#A{i})N0W+&*khsfIkMgNw_)qs6lV?D9141e8Evpv&5(H?fpNSQuSgES}24fesF z;TzxYQVWQ#Vn!8y*|8ABJJ?h3M_82?d!ZSTmwcC2emt8H`wAE}uO zERF5oR@-!;fn^f)5xrs;QaFQ-CbvD|o;Tr%+=Gugw_7p5{3C)Pt>h3cW>7-h8{w0v zI}hCje(N5*)%QZK1^U_}{Q#R11x})~-m_`YaOjdgNtw#kX?G05tr4n_@@uLjRNjj( z#KtA`u^+L};|s*6#C+xrq2Y@V@$CiI99a1Bu!-HoS7ys|hY)(1)X507^IX>2bL|Ai z-S&c)bLLv-HTZ&$(7OHk8Ko0$U39~JW3Ahr!=SVxHIC6 z==%5%Eu*&x$h;mr?R9?O8qtXTOxYQ~r%aMONctAtg+7LdPy6BRCD&yA?Lf1Cv{^!7 z9#3v%5$Du4Www5i3(qFDG=C8a&yb;nMU61qW?}A&HN0Gd)v?RIIf)>m3*;(81LZ8Y zg*W7?UQk0*nRa-ydcpbURWbZEHcxxz;&HLuC6zt>qG>7*u8Mo!Bn3pa=;Ae>Atg`p z!FDqp)MYYRsNQ=kcjZIuD+n3yA9!@M4aU6L(!8$40=%f z2zp@rthXVoqlyohRFmpijRPEw z8jQ`*vr$J5l+m|(>NBH^rG`gbSd+R{W7!q)rnj9;Jwt1hemj*HR6fz?3(e1YBA@zC zs#nB|gxDz(JFZt9V{KBZG$lEdCK5w4VpBgi7_bS}9*@6P6j*mSjHvF~Lvont%0ix@ zOSkyRu$P$g!=rg#sHmKqhBuJacWawAE|nLv6uon%en)*N#cg zfNc|P;fvajAmrshSZnO_dZIi*?e_c-)LFPiqUTwwkbB!*qD9fVM$}u!MPiS-CTz6_ z_#6ZN(NgV?ZQR8*9XsDIXU{BEXYF-0m!HP`1LKMMFkXRDT~o{ zHB7y20@F*Ha0Z6@`;#N~ke$`)wKJ`@&2cw*hemBG&Q=AkD%QKGt{v_P^%1H|{o8ab zm|vN}Jd7!lFW9}_5MNI*&>Xs#d<#dHJPTo-NT+$$USrfL?G;g;Nt|ck(u2EP1%6&! zo{;-ASs)8h_SDjCvpBNqDfG-y#ux-rKDuv~8Vfj`w5#gni6MRlhddr2*>{JRV2g=@ za*){y1I>WcF|cm4>A^_%1;u2OTK+kguw6+xS%o6R+<``1Pj1NshmHUT8)*DXVNP zjuQguTO8}Ln+Pq=peVN2)&AO0IB;)kAf!Ua#uYo@dJq6~nuTC~Fz{mmbf(1M^BU-{ zOD52SfR3^!>Xew_9qfM++|DS>Us_pFE0ovO_2E;iBoY=ni_b1MW?LCGtyt}k9P$g3 z+H}28W)A4f$Nxf}>gehuADR`=VyOCM(vCd%ODERE0j=m6uv}*k_D#s~!4CS{T)5}A z`x$$j9!}|_5?o48SkO8I5C#D1=X@`Whu;OneXg(vN;v~_5VIoKB!aO=)NK$~-9nyb z@{at^{-IaMfRb&Wu7N@>RUi01mi(owCK1&aZQ){mYWoB4C&Wc9RWjg@Rh4s9S3MBeae)pF@J*UC?1lJpeux>g(^`G;JsyAk*S+2PK z_Ya~Q;-Gi@^R9-{2Fu)D+y^#+v79OBb6mdFngbr|F&aF_Puv;k^{x zuQSvFi+c^wc}&|(A7}XyP#=IVpsiMWL{P0nz9g;4UTanqk);nHJMK67DRNP6Z*B*= zke_8A#sMb0d@`}kw?4wF*a66`p9EL@AanE_>PxxZNW7bHu}(z{n+2e-Kny^ zYj#>3zHkdUzw`r0tL>o|b~uZa09#q+8yH-C$6;9X^e*6t?!@@uBzqGKIt`5D3sCEeLLPq?q&k$otcNg+1 zLczAL<>*n47*BuCknpVb(-*F26Y73hy7S+bD8n3iwV z2h*>@H?^;zo6E3QZ<3GxgpY3{A8;cdIQv_VA2j}0=H7Y(1ov>s5ggQKrq4t4*JnQw ze@jl__;@O(v$WS!lbB7|Boo8;lb^7p1rl-Rz&ll^?cmII$x8QdQ2Q^DQ~R%q`Q8OK zYG301F>tm{_6WmNQ`ls`w|u8FIj!wq_9q+n`zFvYlWf}^6#PVc->hHg_mIgp%#ah8w)r-z zZs%UBGV+~e3yi=`|MQ+Mlz;=d=~h5u_{ls4L|arv&a*udJ=E-zS`ig?5$dEme}7dH|KY#7#)3Lz|86qC7}08xKr zmx2~(ZY$-bK3?Ko+X|ng$GGnD%O|g^IDgZRxR3Dz_YU5AumkkQ&)$M1Zb{rg6|Y3+ z1z5MdqlMq$WmNnH&3vIw3v}*alYOzaN&H8fiW>ne`^_5&_lFM${VpfjNLIJGiW5-Z zan>=*Gm4fklU(Y;4wipUMF?9f>d@^c`1z}QEw7)SJK7J$Qcozed-S6i^-c!iUGTr_ zjFy*&F%CZC#I%_I-|o!+O=raNzqKK0o<1rIn8VZA2a~cl=t?9#1{&f&%|=5Yg@acc zz95@eql*AoWPfoQ8n9xRQGQiH(9%k&C|hXDQ?stdZ<;yX4qKgUrj3v}KLs{5RX4pg zzTGJco|hi2d)|6@wu%z<_XwKXnO(F$zPxOFy8SURy;;bSDl1qBu?I=J*r*X7w8XZ)C^RE=7cP-Dw3{4!rOqdJ5=Nu#6k?#dZ z5>cR`P$+lqkOOh$L!OfdK@sROlSAcabfIsn82LH((gku-HY(_daqP*fpk4X)o1_P6Ta`ATt3#UA(;#36mki7iY%f2{BVke%!Y)M`2? zE5=5cbA=UlipVuiM=~HVM7T9$Ek6*FVzH9EL8^;kdVqRc;#krQGs1p(H!uV}&PFMT z%FYfO%b}AqEvvq(%fVUt+JUQl8<={QG1%rJNP+MCscw`ePhmj7d~&DtZ&g zbnCIxTs&pB!*qXtr)}GnnMm~eWv?^w>X5$cm`9WHkm+!FMLdJVi@9Gw@l_eND+I`J zN5TtyxcryFgvM{9rCVRY=qx+ZDXk(!qgj0rlz);xt762wh{3b!m=zJ|6*u}YLEp_I zXKDXBoA$m4;MW%)z60fKWGYLuhDVQkY|++#6M-R}3;E5UctmWpD(kF^n`P~18-kH? zM^nz&HtQ`~j`qx^f1H$V-9^srQuHTO6%+w|?czEB*VYG8Al9R^@LmZMrl{B4D5!TJ zfJ2R94y{PtRla{hBRnZm6_i%Qzm(BsP7GTtU0~}%GVfgh2#gy%kFYcB!kRq6+x*T) z%`s;dzxydeniIuzIBWVu^BU7PZR!E3H_$&!Z3QwQj~Y%wV(JyfMd=-%zh(|qr|yv6 zVaL@A$EG1Dxk3n4r|Ae=#Dz;Xgr6V1LR^-L?-Jfg1^9{YEU~`A`pN9L12&7Uek0lU z^8z-DuZTh)O}U`XOrCrxeMtJ%mKpoQui&h7fz^Ua)^JS%zjoxW%yHkLh{vzgpTxqt zd#R90VlAi`;Y;HOpzkNO&PNOyNW$?r&v>{Uc*N=C}jQbBF3My^VPaWk&t`wc^CD9+ia zR$Wa7zl9M+^HikrGP%qInyk>lx)Y@~uo&Mrwa$jF(}Rx)wxo-aF#~RHljDO>S{x77 zSXPxjq~B?x#N}*^xJr2aY;}D)5Iw1STo{KtM?SCPP#kHIwpEcVi@Ti8S4lgi8-IwG z1vX6~he%()q{VEM_HZx%`jNe@!xfJjb>GM%#1AwXln)<1TSLX#LrWnM{!AyaD#_&e z(j)+f2(ClX_!3>;5>2b^x@^mZd;jPyu{LWU*s{w=U4B(0+;G2%thDl%U$1glD-qT_ zbLp_Wu39R%agX(745JXQp6FY7q<>*nF>dAu!37vMjdwm z=y+K4$OpB;`qu54vs>Mj=9euVHuIy-#05*NAd{c7QEN%fwavQ-p^HR#L2l*T&kk3d1UL?Zv(FG-(v3^P}6bx1E`yQ7=nw z*|jKY3!~on`J-a-qWO&LoCoM_Hx-?Sqb7`7HPkAab=xuV7tb8or7Vj*Yq?Kb%;tcB zw0Vab*XV_LH^oSQ{N~mbqH`snixRXXar8l zk9_j*)h$Nf3ite1G)!TSro>G`fxZ<%>G1DxwbP5|KSh*fPI&6Zd^m{3DFwe z(>!sNi4T5ZNjvrgP;SDyH81V`t`crBL7e^d_uP`JTFps@$M+X7mwc8po8Cw-;eQbJ z4#1fNf4^^R+u7K*ZQHi(Y>bU<+j^30%qO;Ob7N<-H~;gVTc^%jb>CanJySI`RZ~+v z-90~jzM069Y(niiAc|%pFpV9|8PlPfnl+1?_2&+ejv7vUkCo#~Gi||XZPE>KZPH9- zis-9!h>M$kq`q|bi(LdyoP|4*OPjI2dMZx%7Y4z;O#DbasrjQdS}IQgu{ks01$p`n zDVH8diCc^w=LQqw9+TM5~Rl{}zs+Hf zxMvuxz46#8n#!=J>JZtdVgT?wcZxTbKAU)5oopRl`k6dgAlw`}@u~xLoK@(0lA<%`zxYB>Z3xTBPeTk2|((mWLO7YnjBm+`UC>3&H&JnA*KDG@^Ds-{Dm=zN-LJwvSk>5Jb^2@F)qyqX;VRZ z?OrM%=A{G4u~8_AzhoUs%h0NN;X)WDVxJTvXu^UP8CM;`rw++si5c6h(!sGfCWQSq zEB@s(7KnAvG^PS-`DVxdh36loKmBIs&4}JACEWwdS+f+nR`7gIU+hS3T@bWxh4_9p zm}wDK2i|2tld3Zld6({6*~otOCB-5anm7DUZ{RlSoM6u?)2W+(naAk?KG{ zjJw8dua+3}6rOel=}Jsz@6gWnyP?<7^aju6j4rXO<7TZK_)0nptnT|tx(FP0n(b7u zytO<%4p{gLP-N2h@2g&}dvre3&k+P)m~CI2?Tt`Jfe_plrqQTIb!SrhMa3{lL*HXw z)Zc@cqxW?iXPb*>o1l-^>!?4wAbQOg+6bvm^!m>><<2%m9NjRIS!^JyCxW>sN4H;}}Ndd;xk3u))EW6k4T@S1*OzyGc){`SBdkd^dd zIHcSxwx1nJ&5r`^_=hKn;EzNq7e@RfpFV->yyaZC$}BFDMDC@$#{>slxcS__Lbcmh z>wc*P_)ux!H13uj3)iM8b*KJ_#G6~EecYzvD*jUYj*7Js|MIwyF}{l^;-$})Xr770 zF>*UQ18bi1ZT6%T#B>QYGGW{rj?Wa?sPbQ@RW|mn!J_U1@#a!n-y$0UxpxcgJWsdH z7w;bh?A2X<|r`|IrXN*wXv$_AS6_!O$^g>TuK}ekN!-ypnJEnjnW)6h2 z53gT5hFycIH%&2|G}s#H=>yS&HKqf#rwC#I>-LAcg|o1Pn=9p5v5K1=3y_DKt(u0e zmJXoL#4v$Ct(oZiZ(0fOUn4d)-yjgF?=O$>|C8PDAH0;PiJJwvq>Y8W`Trr=#Hq+B zfw7=`P1M)+)Bb`J^v?3`=ScEi@lFggM=yp(cmcRKnV(Z`4u}4m0B5=Tk4OS;Ma_I@ z)ZN^<`@2B-V%tlG7Rc!tMv_!d5XV(kqtjq;XhbMwXx*zQvwEc4SHB;sR`U+ELTR=E z^U)#m5~+o;AZV*Ux$&1OZI&U+Qdb{MZy+nBxlleDfIn4siyj+2Y3oiVHEReoVT3>F z@4xFaAs$np5;3*AFM(98nzVkl9h4m7W*N`&!EL^{0Q5k>IBGJ%|;oFU} z7ZxZ!8-2BvW#0Rgd^J)Q{NBxZ<<%$4M*$Y z-{cl;nEwGf^uL&3{~5IZS|{>SuU!`-UX(Vc6!`)X=(4w(PY7SimhaoaiF z-fs5&*sb9LnK|f<8nB&Bp=m=7<@t7NH+;80bC;eF&`h%!a z%=BbC<9}d_g#*?7;}1)Y{${EGN7jj6oRR5#36=x2lk_<})tSmZD6Tc{Mt@m8(r-e) zfH&Hzxsi=0a;F_N39j}u4_yh@E3qUKB`+T5*nON)4gxlpypm{0OrOw_h#Um7t}4`c zJ?iZCX%}cOoYa}qJ#Ml$B+6|vDbQ9pW5 zCL<0PM;iED3%E^Gr^55<#~OL#EcwGcMw+gVtMk$1(Jn!A8 zQk!bWmNjrIMeW;kQ!Whccls6QW>ntr%EIp`4ym8#3X}w}GI_OZUluFnog{C1 zqYxYWDpLkPZ9h`RdvMCry})iEk-(sUB>pmH;E^umm_CYk7uY=Scv;6Ok&1squgq*? z`{vt%zp$BCnQ(w3@Y?nQ^Sr{H;51djvi&yMJYw%DI0NdU-P_9)a8IAw0bobsMIObs&gL0vc*nd=jqH||~VX1-a zg7N<=iD7Pz>*olz16zfthy4a5f5?q_fYS=l?_*qhK|6CnYSS23>wUd*`p8Y{>FzAt zr>8S5s(2n{sJ(rbe>yS8?V6Z(v2eAS+~cLJW_FJpah%X=$U#4lRaH(M*xer20dWSc zcA%hEyR=_^H$`V_EY%iUVybCI*s9v(0#SM#qG{(mHsJreb97YeXdCpK?bn0^0z&gY zuDw#OP9Dx`?k4X4HJ8)0w%yP*FofC^QWO9Vi>eT^G(Xfgi!qe%z{MBX6}~TL+UphC zZk6YtNqdebcaRMu zzwA~YBp-SI+mQ*6VMzXN4x$K)0^fg*;yxe;HUudR!%P`O-ro*_4n_`{iSdI%ST{%> z#L&`tvl2ro{-|t8+TTbpNkPftzUs_87c>Q@WyHPCls22EF15y%jR+LSod?rZH=gn# z1;{>%Q|mkvXL;!2R~>(uPLDpej<5UQpJjrE+qz{#X> z#x6iUoo!MkV3l+}lU{+32+g>0fQL9|!t#)YM<^xj$XgJ5R&lgBm5TYyMF^n{Ep7C| z4ieYiek==*C<(CQFNi*S?=Fkbfo6x?Dv+Ff*Uc^(Wde0QoUEJQFxFX>>Q;708`?N5 zjwr@6@`GDedLfz@TxEfM`Bz$+tVA928f(r{TzHYFL<1hAM`fk@)SIaVwH4lS2v4p0 z()8qpLHk@tkyb)!s)WC|)qNtM6d?`MA$UP<1B? z)?|7S0Vo`KthPKTMP%y?uH2S1EB6^P9h4oQXIKXC!D|4OIow95vuqVP($zyn@S~Pu zO^IqPG^*VmC_+nOZRg|-Xdk9iC#u;K{I(1hWKW2orvHL3BKWiXBtl-zr?;`K?&Pk( z1F&kHj4s2=`slLAhB+))5z!Y#{p7l37KuNW9~So-f?OU<4>kA;Zb%ftELXq&s|$~6 zSEKpF5MP1s+Fpuub&ooloQ~z9rM@oTnrBmo>cX=@ob_biB{J`-CCk-~NRe;Fnwd{~ z!0mQI{P4pnk^<0egQT)ZpFh-q9g}I|V83LrIQU0&JwU67pe;LH0^dN=i9$)j8v{T( zWGo)W9UGlk$Sf%mB8ZxdF+wA+oLQP!oLHV%bPKbW&bd95gSn6Ctr51m7Yow>)Iog~ zCJz0|`CE@u`yxAy(^)n8I4ogM0_+|rd>Ns;XNt1@Wi*LUY<@c(xSijMLw`AW>CiR& z)aV$VyiM+C5C_>^{qLPYMw_(}b#sHV`@ORWnp2F}vw*KMr$6u42cb8}T_L!Wh<^t7 zZk%@wI5Nr3N&hD5jq{!#%I;m zpy~WQi%EjnGxeQ6@iHSZ)fJ0PLdtU{V6;WR@)c*m>M$~xCDIy3O47jfmbFpoHQoFo zGB>s#V;4s$$R=~&A%OU*Pw|t6JkeWtM8g7{{aJf``|@j7*fe)jNz+a zjsJ!QscZODV7R(M+dW3;1p`}PxX$rTEB^qpmY>lQJX0!A&w!9%Yrze4BiqX#DoJk6 zT#R@yUT)4Fhz0*{f7WIkg9r}8#}vF95dsN`FZqduw9=SIRB6H|qz)8;kF?`9H))Ch zVma0Y&hQmsen+{j0^oaY33q&V4;dc8cL;AK|V*dEhvuQo@M(tUnM5hPF*ZYP-bi>9&0;p%^!LJ~Y1k5T>__`eh`% zD&g*pz3z|M`RrAH74NPeq0zB8Ct~R4=;0;a$Q_Jux|IzzGu!b8>N{z%6*0HJBOi*< zG-{P2IlZ$jspaSrfBXj(7ke^^qN6=IFt@u$(bFgl^GVC1Fxo zMsFR--iXECsALUbnaC4#ea;NP`(28@7OiOd;RC-p%eUq#IHc)@v^mLP&tx=c=s%$1 z-^B6?pEJ4JKG>Hi{6Zn=Q2I;}wnzLWYr}+>z*~JwjQW0xw0Uia^6$SXQhMw~1(~6P zfE4kAfYAMq`^f(ewf&!+BrnU$Sbcb7WcOt%A~%eJyfg`2AqA4c&dIPg|)pK~~a@omphNp|I8N6U8Fn|0e>m_S( z*Dd+#uiL5^2=he0x^`$=c@VUdnJZrkU#7jeD^-eu{2xJw*kB+~}&=Lw++!Iq4u<-OBxltN1za^&yq{SNLtZ`t{-r}RPCEw|xvnfn* zvP=#Up!;R6O%Ca!KgdsUHT4heP(HIYB}DyHxN4iA4f8<-yV zhvv_(4Q&;zuz-bf+v=L0vH;(Fe1WtyjQAcbo;2Y#)}eJ2>L%ywH8s>u=nAkKCIrT8Z4JE2 zW^|{GR+SAdidNY*Gb;3vt$Kzg{I8>*3rn{?f~vqTZ5@SBAw#YU<5?ro zV{41WmFVMMStm0@fz`WB<5*We9ywdtQ6hf@-$OX$)poHunv8g@cxmlLU$J3YD(V{q z89UNaGOM+M4=c0dzT20=G zlLjBd&>YA5J203)v^CT*;LtcAwzNTSqDBzu;KtL_JK7?9iD!olGXy_dyUF>v{A6F4 z$6$bMfrcIexF_(zjz#ZUqsF!{xriG{bWap5%1Fw@P z3;w#cVup#WOV$)v2AnVoGVS@{AU9z?6 zWo*+M>fpgH7&IWXGPp4QGRS34qPVIn7c>#=)})v$xiU#=NOOo@m90vVztg4hNX{b5 zV=xihPGd`NM1Gpw%=UMf*htPot*JTxwP9GUjN?^jr%7asxH4y^T%Tn+YIhj|yQ z175@B4%^!3_fzI4v*;$W1NVc?VJ4m}yhH_A;vk6|ihkL?rS5v#4)nl9d>MQQYM`-* zUE))Rvs$5t;tw=a`<(i-ViW^h%eoa+r4LF6H5&NPdEc(^1;hox3~@r@>k^%C zG55Sw$Xuuk%YAR5Ytbfo>#C~MQ*MK_;9Z+qcR9=z)niYu=|UkcYQ%KS`Q2{5#jI%U zitCfBv^6_5?={-7J!o>TE&CIjY{zT^{L8NG1Ig|uOVwufq7O^nQLIhQB2XSt~*M?uCCh{+oznJj?bdi9RB5!VoXpPs&88e3%{(Jl7=n9q=Pk~l#>7Tx4nx1wPH<0i_-lPVH6Y3 zGk#A-fNwHi+IsU^b+bIqwzu`AY(ojaZzK6dJDGlRKx|2K-NJLPWce;j%?}tFHG~=g zlO0KFG4h0KYng+qu}G^S-aJ_<*Zg2ewj~tg<9QTDHv}cqX7ey3T*%|SV$QEp~;^qLy|%wADxL{!5Ta6 zOi7lB!G=3-j*&7iKf;VVX-<%GCr`MGA>`v{EhR(OF5UfWaf#Dij;v(QKhty z@0Op)nlfjNiAs=xOj(zwU2oE0sj^fBmSQ1$nFV^i0cZp^gz771_N$F2)(dipv?ns0z-Gym80 zRZwxRB?Whh;ORf|&z<=IT9$S@gQev9cnf}Tf5o`)I&h0;#Rd+2HY0%(<_w-lTPzS< z2-A1)tucKE2fHzlzdt;671kg1I0mve?7j@lNb=1!xS`O$tpAe63FVb`LJQs>@z@Ts zH~#(!Y*+YAGT5ouzq!9nxmROvlX{o&mN1nI&Y$X70c=;|%`y0<$iJaKhsFujo9@^F z%&DSVY%eeM2K_Z)q6;D*=spzeru;LpA6YFxd{2r-i1PL@wE*Q+X2K65Ao_k0Oi0Y9 zp?_92KymMsrtimXOzJ<1Te(yttXIs52DneW<5kFj(EA*)J_(<~YF}b||5U%!_WITW(GOy!*HJQ+Jz;ajJ5u_`Qx$^Mg8Hal zg+|XlBLDd%_V&C<8}0c|wT#mHP5mAv@GHG>6FgZr6EvC~HoWq`vPgjZy}L>Dv1VrE zcV(6E_u3^$0I6kE*D_)8+9g7O$TES*kG^SC)sMbeszD%q^HAO|*CIjC zueNb?{aM?l;Dy$&_V*~BU+L}-cY08BVh8oVsnO?oB2LWGv>UMPS-Yf&>U=KE_%kM4 z(HcQ+cQD5P%JU;1&<8jB*T^I9a2#Hx`DM{5UugHkH*V)Q8s!j~79$eoBT|-bT^-t0 z@c)!X%+5t5EJvg)-{LuN2f>?~kYRD&s19b>0u?r#qw#tr@f}ABE!)(VFa2vcw?g1K z_Gd0wc1sYM79zH7Uj-ewOSi8XFC2xc5t&vZ7ME@f9lWDBw=@v@iV@pvf#etmpFL;M*n;9=`NddohMt#<^ce=+Bl8sh9iM1~!( zXX$o-;}*`LT^Mn8H9~12!mnnZ(&5$Ip*;c5aXCV1KH{T#AIafW-J!hzPf!D2Pyzo> zL&WTSgqAH3eCd|g;nm&2yAaQ?0kNP65m^<;Wec>j1%@u)=55^4II#Ypac(IlFc7iHahSt$}te`=%V9 zJ)Hi%ocyYY|B4VBmLsHSOp;3xjS3MHG=Vl7x8LJ~!;xEq*svHeTD>p0aVxQL%gw6u{Vh6%-z$rsUmu}m4b-v&vMt?aZQOEr*I_D76nccM zTr<()ZMeY`NJ`!WC0`q_ofT_$68?&l!RoY^|IIu;qKM@Qm~UZTA8{YC*c@=@9zMW` zRHN~06RQT=cidmkt?!%1Y$JL7zUbn<`prGP&mPmoyS04a9@(XxyYI|R?&%<~q2f19`Bl_;T%B;(^-?GalTt2Y--G^>R<0kz*bR|Jb-7 zNBZe(E$)NG`0;FQ9)LxDXm4%q_hP-cv=dy#A`}U&y|ud^jD_s%oj43mNMwKa zBNCp0=;{_F2A+@+;Qb3I#=z+6ojEKK!{=LP%tHhZ8xf!@shBhn3*w9Ws1Km~VXt5lN-<@*y5crN=+MPlKi8>0LdnMvyP* zv*MYF_Yb&Iz#J-gVOK=g0RlG`&YW8tT6IL4slXWVc7&!a&lrw*^evpu7>RfUw~4*ZQs_F&+&)X zo+JR(D~ZpAX+7*?%)mQnE3PleFIL^PAxVi7U&1_wCCi?Jc8t?ZaNUufk}nq1yrL<4 z%gX-83qJlhqZzhO|C$^T`*YIv2o6y4&LXq`<&%GbWx6ST9&hJ)^bP1Y1zWYV zN?Z(!M+&Jq0qZRXh=8oYX&yk<#B>K>Ju63QtUM>@!Mqus>vYl*k1HW{x_*mamUFSg z$2|aW+~J*ZvcrGb`06vj+;1b@5q=qP2k8mZpp}%W6{jV6$;22oyJ<9 zIz16xzZ#g90Ia9vkgQ(~PY(lh`ll%X>p3}ffc3~6Ig4f{u1)i1VlE(Hy&z}O+zo^) zA!RyvD|YPUhvVS3TLE?TZcW;=?UCA!N7Ei zd2?nC)#Qn^V?Jq4NxM(Aef-IZ4S**iht9%{o=YiX+GUGhjC0iOL4G~Ae_8{;laymM zenRe;&ybVS;S+DKxPQ_C;7Q9l9Y0}rtdD={{jA%I>4`xA*IXz#4T60j!Hf^_=f?9D zA&U(%Gr^z_LbC>Af-qrhnah%xgCgNZO7F*=gR@fU1RHD&=FRy5_9Bcy6prK#rWmxk zFYXPm*?;Pc<_}phm+nuCrX98J%_j2-Mqi?Ix@rGH4|70&2XH>c=qwTVGN2BMSx*U+K1f1@=!%;%%9l z_d7@iwr}G=;KxNdSFk|-VXfYCEW!H2fz@wG2BQ~;Zk*Eu=81C(R6G=I-)#r|R)PbD zjv%c$Y#}4#&kmA}z~5%x3GzGo!zkei4H6wcBu6BzyXBcp~V3yb0&Y$od~6I zzgyh5^xoybASV61Jvl8n|LY6T-FCP=zE$bh9S*1fcb|Q#Rr=Rq4&ne0Ld3qV!P`hW zu)t2u0i$|16obooXM;G#)$Poqjo9(}(Rugl0rl0Kwe?owuJ+y`_EoOTd~;(-RWwV= zV`EKKq7(9`!PkcEDw(X$?a4oJIUPG824|VFr?ke1odbUZ|L-i1Zllz1?QRf|!tX4P zZ^;A@Cs!*bGdCv>S2GKy|5q=@-NMbCN!-cH@jr?ik~a1hTCO(k7Oww0_M^J4h#`U@ zz_BO>T!RCIk}?L((IW!JNmZQ3K%khjB0!tLGUn>!6IgqA-xs6@RLhOBKnY(K zD*FrLNeF?wk`NQC`m=Y(>14`zo2h&Y_oaP~(-K9O4N5TNp{C?>`fwe=PpRk4!`59m zEW=59@*Vcrz`47Uw9lL|8kk?T!t14%UGu5J2B&ZJ1~Fh8@{O`n6SG zOqQr?3wo(VH8Z0bx-I(vHz!7zRfaAU46)6o6>}0@13GPpxZ2Ty`Wr}BjXOWw&Ls5Y zEG*vV_@JFEgZvqH3kb9sBAPs;l&qfsE56Mn{MV^^Wz|}Ytu{Dk4awxU$wjcLln&M= z{ocoeRP%~#vY#78g=VRz9htesBy-OB8U=%#$}yhc8tt})cpOmmg{p;jMtC)kyx=b^ zmc|6vU>w*8#>S%Io&Us0f~%X`vZkGQISV?ki=n7m*%lt|7Xp5YlGNw!!h~)w@RfOL zn3Zuu&QkwW{f&*WBn&91GJAs zqfIcaWVjeHBPYHF+dj~#%00HuQmZ9)Un{KGNX<=`fzSC-VZwIS-3TS(A4*XRmAs&i zcvsVSgt?mvbts|i;Q~rEi}^%BgE-I5e)wZsu*}C0?Y!)R(#w|=yp`1Ah$8{L2gV3S z4qPInIYuY2;wvHyxe4t->j-p*b`+lFM|K>xisd z()`z4h|{qN!dOPFzufrmsGMT&i+~G&(IF%ouDGLX z(=Oopya4uJgygTDVD z0fUAmm`V_XAey*m4)&mrgd-SnZSO~=mx3c01{m(`(@VkI8}mr+q0%QD1>-};FW*rI zAM($IDS(Z_=k5(edAIbNX%o>oqfL$z<%Xz1DjsH>gIP7^(l}#HuG{&w%^HolNm2RK&vB%TR-W z(qTl$F~!BQ2H2yo&A4{-!%Sj=X#ry4Vw+;&P znQyWHzB}fa31VmZJ_GE=jH72cZ5I10@$7I4d@$9lTLJpQ2AFMMcU=k#1d$ zT!@NSAFFkOFK65T?f!E_-s&O;{YW4QPiae=8BOZUpv`?Idhf#cCp(T)gVT5^>D}`k zzpF&H_kd?J1^Uzvf^v76$9Uy(3MKNs9WcJ=@GauXGAu{2GbgDOmQ~9OJ<=xgrChwJ z%tiDn?G-;-5lS^QLKirAD-xXRDsia=B)72y1WqzJGA>_AOoTdiHJH#;tU6A93Ots> zsT;~S220x~CEay$fNS^_wLk}qjR?};CPV;m->pHErF&<-q84+i&&yH zPJFpU`-BH+_{JDg$Kkt!bi9H$!`QbHVM&XsRpQm-yIV;!uNlxld+9Pc1f2~XPjN7$nj2C&qv0nX(QMz9E!2OMHpzpM9Z*^fV)0- z9{ysZyMA{H&#MBCmMi3{bl|wUL*h~q2>(ECnxFL4FK0g7bwY`fEh60fq;mf zSESy{VW9&*m>_2FjS$EOEQCiXGIos`-o=0vE1^NGFYn^v2l%N|&g4A{1v2I#DuKMX2rL)FLWffPaS1kf(1x!9Db)VP2V z>jrw>=2njYq7ObZ0bI5!TGmPU+<+P70{2mXGdZ7T@-}PC9TN`m54)W{O3d-2i1;Dk ziEhjz@}x{Uxs_t;NkSOIr`+dKjM4t8`xquA6TZF9^LIM!&*TO9mHED;>1i^c$-k*A zg(ht^UWJd~%UR~5UUFiMh$O;+Xt7bJ?pLLm##Lt0abacxMV!vQ9(NihIbHP zu-Kg)Dp$0@Y@RnROr^RdfBT%i;%TrE!ljv)h8cCiRniI=~kvUw#?GaHt zTZGxlG+z5qh_ztC!3bo{G2MuWoNF9~BJG0w#14UkFp5HkEc2S@KdZ6CLR3*>O<)x* zD8?C#;^-KP|;0aYWt6O~@X4xvAErY1ks%ofy1~rFP@UbPc1bVqI z(vhHynR8!SK#Xz0k-FIyQ1=!U;RC?jpaben9{Lkrn9ZI?(JG{=blAF-iNqht=xjr~ z!4sofbQgZOr@to7ta8E#o9m6vqzg~>?|$NZC@{b_XYq>!F%;PehRF$!HNv9SW(<|S zs^Ti&i`!`(jxBY*m9l};FsINC{f$muYXQ&I44+H-kY%BLLednCBrYaW-c3$fYL%gH zc|eW)tDrLr3vvO#n8)({%c2^5{6{oN{ICB7;QU^=BR+1HQKBh(ME+hcwZ6TV_X%;; z;l{-FQzMKu?drm&AC4F8w4%~b4Y%_bfv@n2IVEerUUHE>VOMYgsscT{vl+Y<1ncZ%85mmJbV4Uw36JY>QO} z=Ap8`PYmg5Di1bWwim{Y2**z8bGXMlEu}py^0^B-1ux_uqO+FZHztTwZDuOIlyu*< zty;6vO?$IU=T?-OHe1nOg(to~l?&U%%E;`nFaa5hWKyLNkVxbr(FX#z1@;jHC`pRo zaGBso;rVH~;@5S5r>vnRd>bc_9h&4#Wl6CP;p)a4${g4!GF$9cwYYRTvf4)~bXVj3 zb?5;%1kYIc3K@uBc_CF2ik78@ly%(n4DO!L**EQQEF@>k_4d$>7?K4N~!V zL*)dYTAp^z3qMP*bb;XFi&nvWiFX3OWRIEj=9otw&*o*^wC2f2tS$}D3ss|((~KWI z04xT}@~jP=sy}&L)KIQ>@~s=w_udnaoO+%X$9JheI=n62F_l=9Q;wCI@XmRb{$iP{ zW~Z8P3^yz5rI}FpYw9HtCMnGFpT&l_jB zFsFt3m^-Ig9`37q9<#Nv)iJmM%foe?_ACE!IZn&q=K5v9(qi)b>;QBo2|KUDoN-+)1#S4btNXKDB=T)JBGM z>&!M!{Nb6dRZ7iDYuEg>_0rGI*`DcNOP&6{Vkv89{a}*;<~%_qHx1DNARiP@BDA;0 zuN*Upmge0OHkm=^2oXnu< zGOmv1S2$SI*h7GwQ4em$d1U7ALXTHtIgx%iQOvZn?~O06T1VQp&pBbVKat6KGtj)c zOKvKZlZ-KMsb=j~4vA6UgGJ+4fn-eIL&I!W4-rxerjofe$HYn8qp7ZfplGi}7qu|f z4k@2-$bs0@*mH%IRNsSxtuKXS1TR60t?F-wK&NG<8PK3*rWj~}o04u6gRD>A!^3RX z47pU_^M%c?22)DeJEy%xfOS+3wvxT2$MpUUF{=`cPvKn;$FCG}TGJ0t?p*}eEggbg z(=SKvT?N-IACghiPe<-u2G=bclB2$732Rsf)+T+6hv{7h(N^7mN$%YP*DVslRo$OM z?%fR6EfMm4)d8(r0dj|NfKPod4{fU+ERb=aOMQ=t+`A3#vkc-!CHO`5RuHpYEaau8 zADaBN5YAsZ1i7YvX3NUd3R~){p5QQv5hvjUC&6RDn}5`M&~gc{Rin$;E554VTaqI*GFIEUdi=UH(kcVn+;gjf5wS7c&kwBdT>5C%I@xF^%sc z`Qwd@rWjW0hEnTF1W$7+ljvC=8T){D<}3(Nlh@FXcY4~mq5*oT@6ou!fvD)g5W1+3 zzvsUCjW)bQUEA{opKq2g9Ph_z@7@ON_!H-x|Dnmf+k?;O+=qzW*%un) zPOM+c)lc!x->#l8Xz?EI+z~*fUnGR6b#VjKczc?_R6rPpWBHHp!NT>Ukq8CTlIPHz;$krRYDbTZzG;7W*z-E$e z#kh5>1M;GZb@NOg;>RyX4e!4!EgJq@L=+^{ucus=*B}J>UB7K??f2NcZ}3Xy-SYDt z${Tqn67Drb@*U(00*p7-YhUb@%|Lbq-)T_lmPKRaa^(CL`+#SU{}A#O;tNg@ZydH@ zaQBt>PzSDHV7G2^`ZU$ylDA~KP)-q2V~J&?)Wkn$ZTrlXz4NDIfgOHqrN{dgqJnRo z;3raL-E!SD^J?E4<*lU=rGxw7GqK@=8{Khz{W{AQ?Q_TTWrNr2ao0M0e!Ril*&|O) zAi9Hllk`2c0Bx7ldGWx4?~NeI2DLUhK4O6#U2OeMi4dqCHlKgJ!L9wIX@yc-=_D2X z`7fn!?9BysE@$?tW!rPi z%F2o1Gld`5&Db`1#yle0o`|m>%)1CxY_S4odOp?QVavYfVuWAx@3X~5l;p~M&j1Il0-&N?HQkid4@{p=8&2=k*MZ-bFvqWAcwEY*7g-ArT!g)Z_}{y)t0 zMcG8Ju%>R;#64Rz`^aISz=gI%Vwq-vkrYI zY(6qEi!V@(;ueQ02D7mr%jYDh%PwvaE>rLV0 ztGOWNXUz-rF&|p^|9Q(|@qJ1%mEm%TSa~#eR4iC!OLxR(^V#LNHZ6d`_v+AU@{i~o z2Zb8<@;K!5!i`^gW0e>PCO85G2PeI-RGo@(KgJS2cufpXF4Cm zATZ>xM_?fuJ}Zo3SzkIPS+5&_+w=b3Ut?1v{iTqEi^m{xRgOqOeB?Ebfj|Wjyge8f zUBXRiqB!iJjnEdMzv|Mw@f3Y(*Zj`E>e~wVlMG$ZWms{trq3pz0Kpcs(fOh{U2vQ& z#-t@ZObYW2NqURdq|u8vOjK4i0h+9R+|xkOmTRD-a=^%Np&rf;%+^pJB87JPsD;BT zg(pOZ`C!5i8Z}SIL@K?qwdeDFW%SKE7zY6!?T{bY>)syE?|zk(N-slS+MUG z0o+^->%W7Ca_CYmq=%q3Rm$|QI-v8PcK#tQ^*|djAke@ktjGorVWp{d_x=6btyE#= zLh{YQGim-vyUmNHASjurRNlU95Gv2OLS{#o> za}Z1#eNx@^eZ_7&U&$DrDCV3`{wiQB%9z|LubJ17+fS=&Wi1MNlK7L*shHIzsN(N0 zwQ}(1U6I>rEv3GyXjznw{2g#Cf9bALT-?WcMXT7O?m1-P>s?ceK3vtxTPjb$jSrbo zvumm-EyPPZ)st=b{arfjH#KMq#vm$ciY_;Qi1T}`uQnR%Y+njma={gNK-E!-FxSsxcy15AilRkuol)6igrGu+CC5^Tl zll9gU5y#m@bz_v}TOGDl9YJK-Rdx2a9vWQEx{Ru}mAw*##N zpM342!tQZMY&xviE@ZG=8eh9=v^w;bZhLIjmsp&xka{N^+f1@(G`No1`1W{XU(>qg0VBGjn8RkIvp10aZI8g1Z4bQE%2ol{KS`@$Lc z&Wt)*bBr!iKH%jpS3~udXOjA^-h0X2bO%yds}DD|X_dIXkPdEh{Gp46s(mXliH7OW zDYka^$jcBOhb}eX5dZv}CqM(H0)o>wJ1JMhr63yS7s9M$HQ{6SCz3-_uf(Cb<>j8@5uJ+I`zAXDLZpv@$F}BD>j9=`6}`O zVTyK5d^nA^w3BGcwQV}IxewTDrbN|(5JiQ+#5!N3XIDg|CUh!Av)pry`o=8bOZ42a z_@_J1mF^T`ty}i*I`rj1;%CYc5|}$cKIP%dj>D6~5DNW~5Jk}-VL5J>!N?YNM#UYz zGLhk@g3fTx0EP14&$sQg^x}1cxj*i(=qYT4IwB3Op?`>yvUe^ygztm{Rnf{#)cQ&a zx5%06Po29dO>0)pH!0KOU8CCin+k-SFRD|PfBgwG!$qQO%xoX;S>R;3_+<|fC$NA2 zB8FSk;n{GaAFVD!$BX5$IRc~AFA7{cTv6%(QowWvIO&+q zM5b(+Pe;i?A|%!XOVN^)B3CANq22hYT({HR(HxT_@{D|sB{IoAWZb>b$Z#>!T1V9y z(;bS=aM3BaDYkPkMplMF)smZ)5+<1uVKD%@A-ljB`7T`aZ$OHFbD&=~#H_=Z$)d=U zoN*XwxHAK1Y|JK6Y7XR-U}dXVb+BaXADG2AKa@a0`rUFD)=zJ0--)^PG`++DZEjRL zq(?iBG>oerTD&279vb~kX%Ou8oT^r|EgWo<>R&(+(!1Eyr|hQCk5_*RXJYhEg^1i14OK^^qPJ_`kwRL73lMS#HmlIV>kRzzI}WCavuM;{LFv9 z6@?ug&FoG8%Z+c=g#GHNYyS*r++rJ?9*{-DnPjCF`TbL5C?dEFMQNZ03}Y@XXILT1ZpkPx$68(R_jZK`UL)B>LFT3CKbty|mAf$o5^7H!3e5 z>3y?)vY(+@?|^Wwo07g>ua`Hv_S=-cTFC8`yB+Fh4`Ognxqn@SyRCwYyFwW6^1Dyq z*RRZI*Rb!UeP2K(^$k_vC)#sk-*I`O}- z-nSbXLG))``5qJq&KRjb!5j%Hf1(*kTYtp=5U2fA{DX3ktV*048&v$y;le|Y7+qXCYI4ggk?_VB*N{Ar z^MjNyI)vQcL2cnA2stcv@tHG>3|h;K_%l#s9@I#5$z-ks*ObuA)4>Hbv3x#mP#o4G z`3a6N8zdp!VR&(jR!|%|yH5T-WcKbLk86Q$Hd(+C?c&8CZ#zJmYCPBL_Sm%DJxb)x zZ`IVP6-N7qWj+C8qEIv>18S2hQYtL3+MHF8_SeS-vKpl+vA%SnSj|GpR%86sTG-~9 zpleE~5|ei!yxKKI#6W{uv6iMWbNK@|!YCbq`qv=Q!3&f?w@j2 zJ@xBOFjZw#Eovg#nj=+iYc42iUgTvM4vW=Mxu2`1?50@DmwAg({kv3;DT!gGZ=aBf z?!;il9H5o5gXSEehn2LM%z3Zcq{8=Hqt1tZeLEyu9d0t>A7+Vj^2jd2s#`)=K|05> zBFSsQ*t=oS+`vo3Jk+j##TxGi#a-mZypSB6x)Ytf%86}q!J-7Wk3Ma2=|KLlpB336 zre0|%o@n{^5GCW*(?g{y`q7GNPG(& zhDv$%Y6|Li)Z7hhg{DbQnlHi=O+xU@Hkst?fWCpLVp067@k6;)1UA{bs7qSDF!cG)Zf`E0e$L*qxp=8=!Mdd}m`+}jLW^ygVa zym*Ofa>at$sfaTuqBDR2lH}zDsANv*-eosy38}C$tO+PgJzGi?&Sb*80m&h|A~v2PMRA|Q z+!E_mjnb)hM;tRr_-KE^E;S+W8BVVjfOuO}bBY+twz_JPVJ;odkrr?ufXZb$K|`0g zHot1D)I?v5@7;(?L%SuV153suLe`MdEE!uyh$*55Mze(-4az1VG&5+)B`u$9+!5od zbd5g6%-NFOqTQ0%fa!Pl^8?%u{e)&NdsGA-;H6cux;j`yzwR?<|2Y)FGEKh9=h4*Z=ep=vtIMT-kR>*XbwqnGv2%E`$ajto(*mE*UznPitdDHU@v@X|1?IaTjZ%> zrvssoOV^+l;I1WpRrsdn{f$p`T^O150iqExZTc$Lu;^ud<`A@z80f8=>{Bn$@2Ir60mqhO# zf|%Hm81C@)Aqjo!&?VuCb(z_+d-}^Hj*AUif$$Be>j`(Y7rhw01R4F}59hlCislAL znvN#BYAiOmMt76-Id5+E7xO7DOak;t?sPKcY^3ZJSF zN?C>xW=k5Mg~kCR1m4s>eFihzg9=@M{Wc}S7M=@a1;Yd?ZCFO~eku8V3-!|>tafux(GbYUalrYD=-et z_Hr|pK;U*)IY$U33*f`0F%cH2;`=`SAd@~pH_~P9WAe<0bQ;KkB_?|;RbS_iO zjdLjK;KZNsr&hh>Cb+gj(?d*CwbT5{Fhs`lSeEv+1y`+e*ASJlkk?qi{N+%JySxd8 z?#$lH!E`4V@?o$-*<4c{sjM4eWSt4yxfnYCLy!MxmwAo6y+w*AwwoS=)gWZ{djinKx6*I0`F)t+J>Z9t-1X1fcAJ9n7&Z z$SH{)$vLv{R}&#g*~COMh@#bTZ?mo`_}a5)%xm66!1Um==ApT`FV>qO+Wa#r$5uLjp?1yi3G`)2gn1%R*oB z_t1%Eb*YNeb)RbpB^Y9{YVIP{Aijul9Yyoj&S_aWOMaog<;NS@Gv74+m)jNmxgE9f zb9JP#@LA^FO=0`{x>=&bu>o;F;16AH1dki3<}^pDD_||Q$3BtF&o!vOM&wLeTwc9z zf@Ph1H+*c4m%x6(HjT@`(OT0V@7vusAg*8|+3X8jUG}x5HqQxt7s2U>8+e}KGEN6P<_gGxn z@jS-ha^f*P6K9C)^3jLA*9 z0I|&mG-R2x9Dj$Jq{X&i?zL(|d`JP7X(0C!9sE&zfQrZ|sEch3Pq!-`>+??vMNZ9~fzDURnwb+<{g&HKDIx+Y= zM{u8z%a3O_a<3V)B-%Xp#pmS`CXA5;}(s zKFpj{#gy2!vUQ8$HgJ|DVLv|~S2+o0EhZER}Ge|ml zHC1F?FeQw(FxXI-$OWXO>FPVgZQ4zMB;O+uyq$H&OZL2WAB6j!u%f+bKv`eTv;$n|`;1#J^`W|7q=c02nJ1Uo9~5RNaqnXh}Ip*m)j6u&YNEv`-H zN`jI_hyb-fnf}v5n*+5gNLDba7zX(KU!|Fw~~zv<}9`= zz2Ix`T<6!`N*$zVxfC?6hdFR{Gm}T*SJu*MQe}0u?Wqlcq4*vm^m_p31x9X`V8Pq% z$m;ugkH~lLRPWaD+NB2`#{TZjt=MpAbj3JrRYSNlW=zDiFkH(aS$pi+T_rpt+W~sr zsI}Fgm#zTZr=U_`CO4wbTvTd3fzY6ISL_0at7^bPQx4pw48dYvRm@6oy$tiRDYglu%Qqb6!qpnCBh}aF2@cii3Z`X6wrBRAWLqw*csq7C;&Jf?ubx#6%gsQxt+ivc@@niOl?HZZ zV*`nf&22sO!{4%JZ=d))$6iQ@+;3qvSrFB%)ccwX z>GspqAast|^IRiVz=Q1|RZb_!V^;Ke;0~OJAA0Q6D^xd!IC0~S(u+Sgu>i#@`CBrL z%6Kh-DA*xHg>s5gtTPs2NtRq;axA-g`|lB&%u~lhTD)3*2}#=7d9lMz)ygihq`$3} z4Y!bTsEir3)|MTXdAP<}3=5RRc$C)_g60k@wI0?m9;8c=zzC93ll+Z!k-de94N(h<_I2_ z`NEJ{hTmfI$4GKR3!-}fb!6T6vL+Zj|4I@`Ha4Ke?>SMg9uUS-)xm?OdfU|DE8N;x zM05Qvy3=969w?EYL#h=aJo_gFpJBOgM1X6%7}jQWb^?TXhq5LAK^`4gTP{oT4_zT49DR^0fdK(l+Q zJY%Pbr0vN8F^PCQ-z#49-}*oQN0XnKV^Zz}^0#l|7iguQOS_N8?0AZY{58WDY?eSOzpGUjmlfJ>!a{#+c1h4sexf| z>#!35@&4tNrw+|838SL6wz}5uQ7w1lPQb3$<$B7LvOSPL!0y@UTHx6C{L}Z#Ok-mT z0KGeX<8U2|-f$vCrUE7QA$LEc>Z{)<=(jnE?2g`k%z}Rc4_=Yc>Wa!adlA-!@hW`^!IwR!1OBL*aYstbR7<(bTQn-_4UHOtMBeW`cvKb z1PXc96I{c+habEZHXVLtO=+ONln$-k-mYi(?I+;(_f~9TAX#Ai;VychLb1^&*-iT5 zeJ}VY6~n9UE_`6`METRRuwiY4CIJrw4`h4S0VT4KCOAz{NFKkizVHiNd1C%g#r!-{ z;bCXh0rw;Y#d6=&@pNb5U&H3G+#BW5t32JzpqmiE;_H4?R$MbI6h?MPTLPd_AvBJ8)l>*J=ixg4k|9rH zVKNE7I}3n@TMMKH7jQ}qfn9S`PJFhQ#?bP`Kj>cjiDB> zi%u9wO7|Kf$TbG$_VYO}7j+TW#HJ2mGqqt&d>byxJ zC5D4ZhH~br3EiM~)e`%9LjyDIcR`zh4Z{qI2Pf_$h(}Wzg<+%%)iU8?%%;RTe|`R% z(cr*gJy^0iqV+OJ>+jk5+|jJ7YZJeT7Qhq4ep<&iK?1C4ze{vt&Ap(eRyrH5Cy>D4 zc;{8JRfKC}Xcq&lwMB6@H?r6C5-g)*(!twVwF)L-WHrhYmYpk16)KwI7}ZbFI#ly1 zlb2<@hO<~Q@1MgcgVDvVS<_fT1QI*bQLhYP#M=Zg6fB)7V%~UcaO)j7{jiH_!nxG#C{fptso_NWbY}pV&n&5FxRh|VhCYG>`h;@|n%*9>hF?4E+QORtkn8E&Lz7%F zzU+{fE16yeK#mpTo#C}4EwTYtCythbPnO%o+oAwrGIOmU2S-NCjNuQYMzM}1pQy!U zcI=JOvh>bY!$o(py~!08!vyAVSf^`EyRnnSPn;Bi4UHpA*G>^WPrh};LN-mcVu1XG z(a-07qz;whPRCwpkA>DW;}S1ch2v~O3-aef4)I$f`eeSr{^;~rx(UX02B)s@$=gkg zxNcdz1iqaO>VYBujcE2#`iaVYRMBPr402%uvgE4-lmI?85Fk8M`U&7iyQPq+=KcF| zf@!9F{Nqg1sw8IZpVT81+bp>AOj4r#T{h5NkrDKhBe9ws~u^*Sn4 zwB?PPw0oJDe^C7~X)z^8@|2~fGi&UQgKRUWqFKO|MIdR2Ow@>Mpr2+drk7NjspOmmt=ntEfUiV0okl4Z zS4&;(cVLQLb-vDyE;p?$4Y+%q*6}f$w5<3?dDV=KjWpr4 zFG2&f%e`g{*s&a0jF}GYuTHEooLo zNDRdhRx5~On)puNtu?Z54WuO#0twUtj09Up1 zMp$TFo$=O14+`?`Kch_IL0YUV+JWMa@;BI>6HT9LJL~n!IDT;DmA))zBTNc5I2rGy zbqG4myC=l@i;a^A6_qjHBbc+Mt6|7B0hA55n%MpC-~3uOO||eF%(6`~oxisWPuyr3 z>o=G}Wzu#1;<3Y?^l*ug@?EM5i!6oSXg9f?A^FX-+Us?V;H{c`@5Zp36U>n+O-J1RIo!_m? zshSNB&Ze=z*ISlQbGkW+Z9B}ZAKd4pbYo#%IK}?qD5PNCd}QK)cz3?-BgbLsjw=f1w<}+yb zr4s6XhkAE3qP_w$Es+jvJ!AFW)xmc%fSvj3(?Jg*QxbSwhkC;x<+8!92>;^-_b}n& z7o>pQo8&`a>P;FuUi$JO#L;z|qp65Ec>p1hvW_sJzc5~+*qXG?DULdr8eJiZ`3RTtH&15?L%i{cZ%j|Y#ZdhqQm>$7;ncif@`o)%Hqy;_mHjpS zsAhWdWTLYC>e;TpNj9yep{zfE?xVCLs-_RrW->}QL`zLwq-0@OP|`-TcspbL_6Dy%P)4san-F!I zn3kc`|HdB|dOMSyDK-}p*joy@>e^>?;HABunT`v~++uWqU`Llnc28q>mPtQr=)I$W{++RIw6@EV3$7RvJL4bH z>}_jK7rQo~rv1Dw5!l~>`;Mr^d_iH#IhNG+#kT40EZk2ul~x;N+|b}Cb6C9ULW>3F6} zm!eu8#LZa0UHuLGE9pe7I!4W1ChlLgFYOX~1oSd02BgB&ljJye5Nl^L(WzVE38!1s za?nIfn$E$+JT`L5Qo_h@uX<_y5~(DM_0=^)28#O5FnfcRu&>Um?BkR+S+#2Gx``>- z!P+Snc8NVr7DDNiOibOY_UpSgx8jLy^m2{)HPpeXO~}fGe&1ClqB$ND$}LRY3)vzk zKZT6TsXTEGo`rt6$NiYsTtg(&RMwi>SX4Wvd)kUNsj=H>$j2Lg78+N(1a}$rF*yIE=+3n}X zC;%5vi;$KT;h;2uvt~)&DCc-j-mRr`Vr((Ss~Pk?(jFjOQ05OZI~j4#8WQ)!q`SdV z2eMU-9BYb#$EyBzV~3SyaNy^b`M5l#fs(#2+ksyYKLx1$Yn3$*a41 zK|O#aiCg0++piW^+_qkiwZd(G{Iu1!>_lASaWTj_+St|)0=IX4C*b1Q?q`VGG3wm^ zzIjGJXeTe^&ON%zc#Lr2tp9s!MtpT&H`XV6<;Dm9k=J1)c!m%3rx72SFCK_`eD1mU z;={l94v)kwG?X->0Qx%_S*mB^G{*rp+ZJ@#WK4?05Ud z7gx1VH3!gKI^4|wp2eawOA3NX3e+Msj`vYwkw3He!j zXRpUEJpq9x=US=f7?Sq>Jt|7z`p@j01?`>h&%>xZ;Ry)5D%Avo^k0L?5^&V1bJW9m zY=1i~o1Bqj)rd+#6R;Jk{$HAc#+Rmmsz#Hm6ng_$1IpS9TFkrFN0>((y7olO)8{Yf zI?+vIdnk5$reH-KTc&eMM-Q`T)AlG#npwyZAryxa5I-3rOA}xl7P!a!J{eK_Nce+&eQOAY8>>W%MWceQ zZ!`k$L|0(RUn=K7U{4-fwrZ%bhd+?^c`$t3`6Pf|1j3OPwIkN!` zKV_+u%4hff<1MAVnGnj^hBgEjIPS;lIvPO+k%bcb+@Qa!4$ksB0y#o+C*QE)dhc(Z z&jHWa$p0`uOKz_1{XeC>w-r5A_86=_wFe#e%LZ(2pR2=mycC05Io|d62tz#t%7%U5 zKJ#yS28c2KmEBNIbOcK2Q61K;_V1d?)h1Kqibp ze6c87Tbwma9#0BqTIYK4A{ynW&4%aEDE_DkQ`O^cB_6tBIPvcoYTlMVybk-lD=^gP zZfPo%*rf`!(|0voLkenX@aU^aYy}Y2*k!lDPH}5aq{PYC@y3r9l%gbPc(tL>iK}q%s?D<_E3@l)E2yxGZnJS@9QKC-)}%`(OWQ&Uo*?#(# zZe=8RQEu!_8DHatCJprRmCx6*|L{o`-EmmRP+4OiTTI!T)-82#Bk}4LQ_ZA%*B~;- z!?>rPX@fQ9#M&4D@`}qEw5Sv(T@;NRMEY*hK0ZOr+|{9Pc;@C%2r6MQril;jN#@i> zj1gl&?9nuv2@$0o8vrZ>DI7f~wjD|aD{^&w*cPK_K!IhG_CA{l-F}rW8#;-8Ts4l8 zs;96wH?*#ogkbdnb0a{6mCkAeJs)X*u2K6g)H8+7w%Qv9lx1ZPzl&L(Ot%ItqtjM6 z$t-F&FQu%CVT>B*;Wli7=z?1>o^LskMjSO3g(sR574=yWg%Uh}1#FJ}@+r)=U`@twySiFDE}?8H??sA>lntZ{#2czJY_u<9?KwPCheHGTOmEP<&C zGUUKWLqmC5D=1zb6mYq~E5)D(X7cgZpZw+!q~pKoaZh1PSIUsnvL$}Z#D~O453-U{ zp)l_Us(P>!S+9)Ed5wO}A^Fui{1Pv?9LRFU#bx?&D^Yr~NP}8&>~ZEwR1Kh!*28lm zV|=CMsahUFuUwanEAX5+h}>GGY@D_D(TPKYd4)ic7#2f*^KEp-C|J0ZJRKU9K96!x zibiDD@!h1ODzYgv+xMHiwe4T6N**ZQSgG)(mCe;L2)%jKILUqb%Gfmfk2)!8Gk57! z6M55QZml?xeqM|}!3w1uO`M|B-$ZBDgTS(v=OKCZsQs(2nWuiEEW(&t;*AlI1SaQ8 zH3=FpDHYtE{DM#@Gna3jZ&HCCiVo zY!nuXnWoVCsg*k8gY?{pOi($Nuxm%U{T_Zq*fKddSgDOli9CxocY7$EJMF8iv)$F(E11$3Cz>G8cAU_6GJ(|1F2p~RLP@qoK{D%g>` z)QYb}wtqDsrDx|%FmJ1_E#5qUBoPmgEXMyaIVeV0vFI)+z{Mi}^9{RMEYJ;KPD~w1l9BUEX(vDarlxo?EYY0sX$n z*9j+H=)@Sl+OzqVGkx27=$RRNSYS;P@jiO#r$d#w9gjrGg}DaNuISlp=hP&34pXjH8jpIq!@JxBI1U@}cuL_i0}w(WKyc7&o~YJf+p?gYy*i zzbYyQdZ5h}%(E+VXw(r*^pln3_6)Cn*03z(T6;31n*F<`qBVZGbkIFlE}@$^1^6(t zjHsJ7dk^UlO|z&q^gv%+i=c);W3l~FewDjNli8Jj54jh#%6>i0_Zgyn=b%d(ir#E3 zjUY`}+}yqZSJcfYKI!^qhVwK&Gihn9O9CUb#W1Vl z=u^@-x{eglQt7pcybP*Gx}fL0Nwj@KaR4ebadH$*t-=pGkj>JUyT z7EdK>W1>regiwkGOIf&R=|VbRrdq&1(5$Vc&nudy*Vd@^VB@S&d0}4e{?5`PJ^|oV)df~6Hp!o>QQcjI0TN|&PQpmPsMwUVTJwu& z#DBcdzDyxRHA}N{325Zbye7J1e&JvvFXf8tUMO%(dzRBO_%ebKYkQMDw67SWhl?P7YIaZtg6ajaHyVMfQ#$P!qfTYa;zS zv6;BmU%8y|$oq9KU40(zaU&VM(_2}8t2FI|DO0r`V^|cMwyLp~sKUgVR+lv2(9YF= z6!{-JEiONEH)2sfCKy{2Z)w}R0al36KK^h?SAS1rQYn-rq$sx(MC9B0-DHrGS-A)2 zJ(c~@SF;&$J?R>VzYjXWw`hKL8SZ~=W^$smIG^MAqxWW;xCgsy54PSd3_A27L&x8Ld znbw8Jn?NTEwPuMx^txet?`98nb9A@=HEJiQSv{bA&>HCx=@(bFx=WddX2)qm2H3Tu zm3Ms8GCt}QmkT-m?#ferx)mGs$vvI^;#zQF(9*xNFMtqR!mKzR>+3&*k*fE*&FzTf zq^Dagr%&VT@qXMJbEC$@u?s!6=7{Eipn(eV$YWj)^ghG}2(lZIM@{3|aui#k0n34` z_0doyx_7G9C-WWQo~1vki$Ts5kza80q`!Xqh@kIZR4Oz7?DD=T2~pZ#9plp8f$gEU zT1R$BJ+H*k=pvOE_=!}y+3dnqn9_UMtA1Fk-69T(vX^F&6M1@YJ$i?Ca@>_ykx~{{ zDq;xUY4Fnn0?X4!n$U>LNz&z1A%@WRbnUTRmAeFb4 zz_Pard&$sM=E-%?pDx1O8IhiftadGOi|Aw~U=jPbLxitFdb9V#Wy<5RlH-Yzg-fsY zhbp;VfQ>cs5%$eTOzO zjYjz6%l?YpydW#3bWW+B4pSQrtt|tf>sTfldjGn9ytcBvhda0ZDJZOaOMqL5F4?kX z0xb6ex=V{bMa;z7NvOKgMcczf4te=sD+c`53M5_mpGzw)gPYHsb04QY;OkZ!^+{!| zX^ZZr?tW!EesH?hxgW=6^7=#_Vbs z+c@pr1_}E^$$mUWbZsmUGqL>>K}m(5)*8uh7j~Z-eOQS{XM#oJThS{J0{-!Ch{x_O zcD+63C1OU!*p1LEQZ4Q@(1dkE#@h%~ z>QLD{|D|W~wg59Ve{X3^^xbuK}0$88~;y|mHmIFkRY&p&l zpe7TfM_!=kh>>ybzWl|p%0AENzUMZGSKqZO{+ds)k1kHZsgDPumN$L~IcxvMm>DOo(wVdjfYZYs`mR-UAB0Bpo0de66tn9q)QkpY#-f@Ay+MDR7 z>`%HGhx*c`ov8~1Ps8jh-8nOkJ95=mZ&nF!Uc4J0tl9g5KV>#+0jy8Rr@A!qmYiV= zr)iV6n^3uSWF^JD7aDt>n^Xod_w1YT(7R^7l!kmyOU%-ed%{=vMRqf>HLVQ&NdInm zTG!%C`~`n&A1Ak{^M^R}*KS)}X*)OR#r6$)hL9b&xP6Ov&RsBH(eG=0nKa9+(2E?s zA+&586Ts)Ihlfk;EZuYB?=N1E@PN+|Lr&Gq+!|&5e9A*`DDwbe-fDk6E zQY-o!SHs~(J&!M+8EuGmEuHQA{r^?Cvh#86@%+QHtaaIn4geCWB`Cjv_wA7?f^ z1NSFJ1z$1s6F)i(4vnwOd~@xNj1g;p{=+sb^ub4}!x|8K((_F2wSE7XRmXh}{sdQ) z`3~`wCjJKVjZ=^D*D%FjoZc^BV(}|oO#A->CjPHD@}IawwS6L{uGd!PxSSLv zEOP|&7@f!u64H2KF)yn>-#CAVgd4H8|AL})*`FdL>ggjjtVR}79l}Dj1#Ja!C|cF) z(RH}$*q*m+)zs8z%h+uxpDnj+ED0QMr;n4T8!qSeh7mvc$GgmU%zX0qxEvph&Jsg2 z2j+l`q2&+u%(@DIx!v56#I(=YOq<;KK*`&G^-(JN+W~5nLLgx2b9&Uu?ej-%!>tQu zuOdh${WCMjz)L9z{r1@dvesvw*rDthIlY(0qN^DAwSUqQ<)PYjK3ogR!S3z1V)BoE zQhS%D?9~7T27M}npfN4Fa3X~&xGRAQw1TRj9om0YKr+k#Pytqe8i)(?lkE6iZ}@W} zQ#^qFT45CnoLHhLQIw)IRrlZsdXg$$I!d}i+Kbi;bHV}&ph~M)t{C?5tV*j~uDLC! zMWa-%n$Iej^jgXOvpBHfOvCCAcH;@Z7I78eg%&a4A)gjf6_0WdzKfmUx|}@-tRR6l zHu1@FBxz!+?q61^*{MhZn?!Lvty&p7V{Yr8a?8MjRFS`dIB`KZDbvNNOx zL(h7(on4_sqntgrde_Wfw^*?n+XDa|ibdNLvD;3L7M+%gmUW2DNYQ4FE61C^^DZT8 z@W<9>aX(r#R!JW;%{7pJ0#M{9y<04pw2dW)DLldlrA#;uNR147o4HUMadJ@6$_W^$ zGaijrS&GG{qnEJw>3qo|_e=&X0dkglWvqBn&8o}kAgL;|j4XMZmjJ}icoe9n6BYp? z)`yZXG4>{T2g^9IhcKz6GC**89{K$^LG1}k0ro)!>=r*KU1(s|^eEYPBf3jl4)P-%o$(WL<>D2s7$@x_m zv!~aOh;L^nQROULCTD;bMfo6}A3>nCIx_I!Svq;UvG46-Dk>TSyM|<=w_{jxyhU)a zybnt2H||)SB*LGMw&~Q8t@6sh?1)g}NgbBH7{l zn2tb24^!+4#g%p*qOBz0G@ecwX(<{gE0SCeYMlWnAyHwN75954lMnMhh$)ASIwgVG4SWM($dGJntm0O|8yULpR@gRjjhQy%R*U;##>r&j#ZzN z4pp~utsbKTc4;~ct#GC#aBfLuOs)P75AosH-x&E;vA3+qpFb%N zq=2k3lE7`qpQ1u#S)|e^!2oV09&Har?tlN2HVV8P4%HG#yZ{qS?}vp{=Dp$1LUkIR zv=Lnbin9*-C_5n-7*>UwYj{VkKvT`hYxK9k&q1ALmM? z#O2~!x;~aZfS5yRdtmD_I`kU~A5j&`IG7mk8<`yVghYpa!4XufeNkrHR4Iu7R~msy z_m8rD- zz8q5N)^O?hKS^5THk-WG;hFN#^lK+d*=?yT=2# zb$6PF)OWX_Sjp2AuMCluEYjjpF>2C=`%_$oTeDnOmM11NzT;gMhjXk;!p0Kif3SAM zGxw|vrf8lTJ@5|bmyWh^M(uttUxbN(Uy#%%=Zj}Olkpy>#eb-sUun;9dYoFCcC@Jo zasv#<$Q~gehEBuyXuBqyZE+-sEem_g7LK06me(m*-($Ex9!PUw<1!+p5NKpcD8S!E z^xWI)IU5@7;|bWh%SFff?zB2d-5~yHS6YLN=GKv&!4+8KWT+NjF+*x_PZw`TrK6kO z!txfmyu5%JXw!udNKxj(BTk!5bE&sn**}t~G4KPLb1t!8uwbX$W?=;C=B;V!p>p7f zZc29))ly=#vb%PY@aRt1%oMxn%ZQ#$94OCVO|crYKxOGk;EccC7pqm#Tz}Uh&Y%hG zjd1&;CeS>5+Et(c^eNbC{Wm@StKVyCRNF7%RZ^bcvW`Sv_1OFX9q))*l#iDQ_V&9yw%Zj^zBe=IX(9iM zrAbVPhPRBwS5D(*S7OpP&GO?J&kwF?mQBCSf9R|zFg^2yH)Dm0;#IRo;MHwhk$ql9 zis9JSvLT~@9gU|p9j~(N0Wy6yVxV2n2asG@R7~RL!6g;EJZFyyV<00M@wNxmWBh{7 z_D~2}uQ$AB%0HtqW89-@O*UWljy1SsnzJ|)7D9CNSZ`F_GanZ{%xO^br}~s^Zo6%p z2r=|wve36z?o_9Lg5r39pz7}E(0!swcl02Lb&GNaPP{NSCV#m5lx<|~`1tXi`dnjB z?;tF6dK2Sjde++OLIIwUG1An8bjkYf;TfFfz>%)yVMyPV2-`Pbe~F6=^q5b>;;0Ti zjI6aup?!h*(i$;F@J^atv1$8n7vkf{oye&@TD+q~7|PL5sZ2r|*T+bbu_5o@Htbu+ zs@g1TO>nM8kj}Zxpg%jmfWNj>3v5v4^CgiBgzMP)_OJp|FPM-nPRN^Q(VAErG4c%` zawjN{;m4=>*zBd^Kh~o*AEBl}$LB0UM?zpfOWS#T-@XcO-s^4Lz~nX3!QB;(#lt&G z&DnarBtsm#5g0mwgc0=XOB8F9*4yxM4^yKX0!5cTp6lBdAvL@=bs2%^r+4pYEkXb9 zyfgf^zUxPy5w|{K`bX^En7wcoYK9AbEHdBV7jB(R;i}nnA%n;0cnkOJBwsT@{nhvk z`3lxto8~gUAyURWH4j5eXmCOtN=}10GdE9(#cDy`=W!SMVXh#H2@e+5lLw#dQRaqi zt_iMJn2Gau{Zx+bIj)hMj_OlQgHVA7%>}0(5bJ}Qc9|;VT|-~SkMLu+v+LvZ+Vxra zuQT?xQ-7q6-h>K{rO?|c>|JsBihRw@%**u8PKLr&9|oA_h)S?vZ!O(GKLN~W!(-`q z4-@`gVguUOV@@`pFpi6?YN!ur>L>Ou=O|o5w1fl-Y~$CZxwNt9^I(q-GWZQHhO+qP}nwsp(4?Yf0q)-Bi6i|!Zwx}#@$IwJEIoXDMfuf5K< z%-(uMTX8dV`715pp+p~XrV<{SVKS$>Qcz8aX99Ex#q;}Nwy5Z}SsRzQ{pw3!Q;j5J zHH_v?O&Qu~I4z~Ss4`CHxC0$EXLI*vI#<>tA?*1Z%`Md_ z+hEsR4%=(M{hoI2stFbxJbmX~2Nl=X1Rh-sL>p*iyOboRm^#N{1{Q}jR9nsrVPv@r zS#TwK4D<15uA1C!S3L)JZwcslqgF~GT6fqcPTf;q;fQ@uWCxPyY`Pj!$15~x9!gEk zH5Z9UN_7P$sYR{5yklJ(ZnX9`;Y5~HY?GrV7YRna0xTY328}K1ZwT+YVupz$+zIZ! zk*FL^!C0Zt)(2D!$CU2zQKZKj>hhrX-wNuBEPTM(B&@DR_M_lzXs9izl;8>~2I(-? zz@gy=jn5_h-1=e19EuxuO{jgEQ~HrTc&JO+T;plQ)odbnvV*m#g1siYN5BXcxB)tC z@^;X(ySa{|cW{!b`m}?h^c$tTM)S12RrW5qJ*zM8M|!R(+T8csQdsm}l+YHggoZ7j zPUu8>9L5AaKnLKqT_NOTN|Yxtw%lp>r@1~gQR zaH=2K!A_v;))|vd3`p6LIA}dcx&hX?qg!MAbCl?EXypa#;ufiHKwIXOo2I-`Lkzhg zsjMi_%z%|vAVRG$u?S)bcHWXY%MxGf+_GiC5W@xP>XAyu3t#dL;twvIjRQr;E+ZB@ zx0z9LF)%tYR=`!(>;FT5dh7z zS1LT^q`J>3GMf8y{Lmvxn&)1r0+>o^hgASm8aRn@PmO%eV+snZoWvruAw!&6%c8X* ze=-SJrJz^hI7zKinp0+V0-RNoQy4j^nN{K=qFnOp_*9`M7<4^2eBXK6@MfxF*b{GT zSiNT99fwwbMDNj=14sSPFb)d8m;o>z0^FDp>D{wEq*ijF6K?*mV}N*R-PI!)-U$Yk z@+d=itF(OcjQ(jNG&|MW0Ri68wOe!(So{%W+_J3{bl$MCfL78 zcrj+4xdTM_f$OzH?O-zv>0W2_=QAyy0jov1P z#j~n_w#>8FdM~1PDBOLB?Lzg~?j^m-GDG~y7WAXtq~mOJ87k@*5dTH>`7WLpmEu8V znHi^CEMwrZ@xJQH)9kn7cHD%kQKpa1Fj-e!lOad|94O7JD2y5M%9;cfFaOwISo$^9 zW*r_4fdwT z0pgA}$sE}3Iv|dK;R}$$(`;Bz57(;qRF&BpH&;+HIOX`d{-CIaO|=LitTQu1y;tM? zpFr(dT+dXP9Kp?gEIvjDGw=HL(+(X3Nc4o3i9Dq0xTzm#nAUnFg1x(aJXe(Q z$HBOOEG7#I3P@#xXV2@OEvm9HyS01iND>^2iN^i9j+%)l6Sr?o+?D2lISq75^H>1a zD6C2>*Sc*AY-%ECpi#WqdE|<$K;^@53$~R$SrvS+0^2Kr$JRmeXjAV8txy<9nwj!b zKxZqdE*R@twJ3Z9S9=Kf(#E~v*2H|Y2oQM_IBN6`_I-`8%_D8A)AqLqa|UB>YA<1M zfafsh7ex7M;G9@C znkD(>7*jm=%ld`8)*pGQk56(TR?l3!1*sVFy^+z==M4BQ?GBNOe6jpt?OU(j;i^Dl z97_(Um=*dTRAq^8|B|Epk4hj^A=>Hy2ms*llh4Bazp4cP2x$?qbT&40GWj{_7*KCGdR@ufoq!2W!RYU}uXmpA|q85pr&Twv~wQjbV!L`P+z10$x#RB}9xTraq zH7SVg?1OjC)aQ$jH+VyMEsl}~W22eT&M+9EbBzybE`rjERy@NBgpMSITMGT0xO*E+ z_u#XK(ltojtrwAsBR`&;D7zH$@9cr#8_+>sfrp)m56G#IW+kb~Bf zGXoT^MJx#1PGDP6C2_TM;qdb;Fv1l-#%scLe*z)ctjQ4$ET z@05f#{NnXEjP!1qX(LvlgE3Qgifd6kOA{FzB)BhEv_h0AjlA3XT4-;I+=vEV$&2u9 zggkTT(=>(GB}7z=5BU$KFP30t{HcXwyL@Ixxix)3`U$Tr<2YsoQz2N*y8AtXJai6Z zGesQe7G%!frFs4vnIOH%41bK5?9Fsi8PYFdQyAyWM^=E)FwG4p&(k*O`vSiKsxt(i zq5nhK{l`JBV&>Wt{GcNPe=uik|Eq&kv2Zdq{P#0VRnxXXQN{S0-8JiiNokw!DqW!k zrMXHIt!WR6K$$;uN(NF3HRbZ&gv*_!aSjYZ7h=hHG4Q#CG?wu=50Ljw7o;`Y1V%f#N>@+lsC_o0D&_zbmptGwAl*+o^Qp2il%soiPJ)5k(8)n6kqnCa{<5@t9@JQk;zlU=tG@d<|76DQjF2XVYY9owM$~sIjL@RNKR1b znF0eoG)cl(CH0*EkotT)U|84Gk`s3(m=1GdS4;{G5pZ@RWZ1GqP;PBa=QagZvgFtj%Qc57-XEn2KUI2iHP+H_(J*aHG=0l(*{Dtt zt2cStWaZX5$5#f{@{>+#Fqv2(rylj$6o54+?sUOB&(FMqpDO3x_zr=E>xVFyPMo$aYR*?;Ao#TjImeZvcID^VH9cTlY|6(I?P6N;=SIYoZ;m>w z7*6+&CnNAg29QhfEZi+bnnPEhAHOX`mJd#08;dvOr=T*NLb#=~M&$_@njZ(Ph=i!f z{fR-88J2Q8)gMH|plgy0lEor#F?m~Hz|QrsL2(Kb!Tu&>R7aKr1NDlHCj-fPT<{VK zF2OA=vJph{RSDzMS^&BpBIXdeMZo)ep#1`24w*M{%J+fkzi^HE6vgz*k7fYtEEx~w z1JVj>-56wd0=@wVe~~^Wz7Z|o0GE%nI^U4na`_IF_LhF)VvQrh{+6U~ zWQimE^cFboNW3Q^pFxgI{s8^{SiL8HFXG+ZC!9Z&`~~=Qg9Xiql|$T5r2!1hI9A3? zR%B;@>ND(*0Lt8a+poY)8W}uadAuDF!0{R=_F`nhRSDQGl&J_YT6G&4%=Wa+#8HCF z@TwdUW&0P9-+01Tiu{m7zcUhss#5|_{Eqg*MnI||t;_OxEGHc^_Gv3#u>W(-6|MOz z4EKYU#^N2y6qcHiM_Dm8Cu}v=Do9H|doAxd^!AjOAERw*ZKGwN!Y z?oMvpM`$F8BBPBtC86);6*78)F^|E(Xe=PKCrc6-6os{i!N6F3C=U>v6t)f!{v9Y6 zw(bZCom7*K3Z1{0BB9Ig8KNbh%d4xInpRKCS`n-nk9iTQ7mftHUKJ(tn02`>k-w@) zNF%l1ZE>m3zR$=^9J6(3Tgq-`ngW%W#8^9#k?J<&KKi`ZbvFMbRVpuAk4f5T$A!vi zqvgC#Q8A~G^luf;I8yRJH3)gAk@vZ26&Oo`nPh2C=P!EQ)pdvaLr-+w<>s(3u#G(B zbc|<&G@6HRHzwyyS(;m+#Qqr*;g4Kcg(l?7>eM0bE2|KvPyfjao$Gn;-uz{*m2+Or zJZn{-eAARX-pnTA>xmC3Q8g09(z<%u`AbwND&aXnSZ5cbTTX9~NbQspCS-75A62i{ zYY_sK6=yP)nKe=yjE}t&D^OV-;ND8%h-E~g>~IUOXbY+*>LOK^U!qg=ti|3q+z2Ne z6L)}{45H}p3-XbOc!7WrL2Q%9+PC>dZ0^Kh{D;%R zw#xm5eJnbJ(N%kx@vb7jLi^Ym;^w6UZroZ_7x+|0VyU>Q&T0pgSBVPComgmD0lJJd~r?@m)`^C{q zyi>{}9x80=9~ghRPTC<3iAQ|@mwqnc6eKbGXGC8G0{~$8U(}ZW)Xk}CJEMrAe0jM~ zOw$QNBtuIWWl&t0Nj6dJ5(EgDkaCS$uqpN+a5X10bY*IqnX#(9p3y7hH_%8;Qc>VF zAh}j1QTZz9f1rLLJ^jgq1#G73%X!FMI$iaBbNPNAgXahGz>xzK=13YN$eTW*!{ zoVH$?qK9=`SU|=HDH$>(D-QXup#vP~~my*UH{QnAjWuNP*#vG={3d%ou4Dy1u8e z^q6nCe(tZ^mF7hY&*^jSJYG!5buE2rTISOLt4>o7Ub$;3(hRNlV|yqMaRS>P*aF`e ztoL_w*c&LOE^QeqgV7a`Fj#b2>+zV42-5tCw#*YHw|Ki_ls4GQKxM@pi!G9qu9T;J zng8WI5un2P*S^!PT|)^C`Mdrbh*x`ST_yIz9Ok-D*XuovTyz`R=DL`|P2ICF$js*y z%0tjIO*Uc!O1W5mxUe##4{getJ_&~0d9=6Odu zAz)QODK~h2uaaOF*4bOxGg+CjcLIkH&Rf46&v_l&lIy%jAGTEZp-&DM9ph}jN+IY4|tcqTMa;P`S?ppDogV#;F1V5xqb^)EYu?Cx9IruIZ`cWCZQSeKnJv5M?hG-bbV8E9_V;EqsT zS{HM9n9T0_!A*g9r%TS|!Mv&UPC(_z-{hE%S95!+%UH#FLk+UQeYBn4X2|j1kMNyu zk(jyzfgo8>*RuP3p!gE|euFI~Psa#o916XVzeK1Sb8a6qsMdwOFuD2!;QNm0oqib2 zsB#BXvxnAwV(Mq^$ftL(y!FnvcJtq4K9lL={G(icg4CS5NpCh0aCZvKF=_)CWF9rr z%ju385o4QtA27_6Zyk44RLv{b?i^eug*l|DTWj-`W4F zlFrEDKkJ9>;1ocAonT!RviJ79d(Ao z8IN6c22EkrU0RHo!m6R_M;vs?KU0j#T(|pWVDLvE`PGuL8GVq3Xh;034w!KzPwe>l z))eL!BI!{Mu*_UtD9fZ7%i{1*QZp4yFDL=yo1m& zVpDRJh@Vv;?g=r zORuK4t5m0c%TcnE@=j64RuyNC%oANRU1}8PcUVV7wdja*?(0R$NwaOp?_e-rd6B)T zU_@A<4XuiS1Y0Esx---i8tqGazyKrXoq7?UO9#>~J@_b=#FtTTADI$@MpmXet5Mdz zT_(r`+Y1mGtiO5zm;+ChSr#6pm^mnV@QwIv_7h#t_tc_dbwrZ_>mOLd?qR&Bz5a0s z={fR(2DMBL#g^E7!3|r!_Et$|BE@As?L37peZ}KvFk$C+0CVCPWau!Af3ELEt5V{} zdVw7JL3{7My~RqiSr!JqW3Zip7EZ@eI_V@LN9Cv-ql962vGYVvK25%+Zfp&fFkbKZ zL{!Oc%%BNl=CAkMxWW%-F_fqIP@d&RDmbfyZ#y}wTY8YhChVUqh%Kx}W41&c+H`So zGtJn`Vb`mK2$RFHFnb8A;Hz;tNK1}a=V>G6=@@ZzRPJ2VNw&9@wUaF^6YbQP9JPri zdk(mnbMh`Kx@u##r9;)j@(atG-G3Lwr9(Y!737tYm5W>QrtsB4 zP|i#9M*~07FCnPA2dg=+AKh`~RUA!l0Bhhr~3nzQfpLqS0cI zRv`zGBAQahAlfg-IAECzsoxy-W&ykLxj@vI=!@a^YY0jcDT%sdqS4QLJz#DkX`wcX zd~mu9Qne+pVPksXZL-OKYN9|0d2=e0{Fn;D*YwC*xF>S`OwV`im zU|reZzikk9ZDHz|ho9STiQ69n^xANK2)$5a58hmId=dBzi`{1A4kEL~n6hE1(MD6G zH6Y(8A7J`v>+%x5YQ}`K>JD(qAdEWrwNfG%f}KV2jNrXJFQ%8(r}wp=Z3?{f2 z%3>z{Y{ZMQu~vfNF2$g{DJr22h57pn88XzGw&H`A`{V{;4h#or4Dk*54*(7b4*x5; zDd)6&&-F)hMEt3G|Iha3-zFv*dt*bJe<+U1{{o^;RnnG6Rz&!kb=wMU1xm|4DGH*n zt=yr~Lx3qmkjyIJDIf^}Z{D$Ublf2A*0$#t^#`Eu%b*~!dfZ|E4!QXPyyMocAzKB< zpUuf+-kbJecJBM|_=fB^-JUNruEO5wNC<$k=%{$eOCu^Ljt^QkV?klnSyVtebM&2Z z!Dqu+d!E+SCTQ+5=3|6idu)q+qHyTB0u5ZI9dj-c4IJ3syZ#6Z=(=3P-0r^cc<%je zHv@N_&B`uE{$QUGNPKl9&gyj>0(7Fvzs^=OZx5Dc%QDSS#r}hK9UAv&IDIqYjngG; zb=|7o0*rhNqu-3D?X!}|7kJLdIKsA`v8cyP%(1*&JozRr>$LmwT||lf0cH`9U#{rGL9 zrfdCo0`lZAcd8MJ#93R~X%aYhRPygqer+i z%2bQeRE;7*CW@im?uq;<TBuYTT;z4}|&(|LIPqXLC=cOd2GnfEx)kpeBxs2#q0ZcMydU ztT0o^cmiZHBvkDR6=?gWm18g(0(yqU` zVgK?RykC#^Ugv3^_jTv#$6Tkq$2~uM8{z^(-fWh-&N6A zB^&Hd)$$!Xs-jaDFFmBcq`7)-%Jy&g@9nGjl>>V0u!ZW!#`!ots^y<{ zSR%A?Ub1cVQ)AfockGmJvbnoSJ@(z_xL)eB-`zev^*N8N zJ{zYc_S=v6Nm9(`(_GdvyCy_Ry(C!`RkFj`SQ&4!(d1U)YV4!gNGl74(L}KmS)#GR zrx`NIBy*B7&lW_A_~wUDWMgMtZ(YY2WQsaW=@V>pddQ}enQH3zxeF~WhAfQaO$=aC zyDc8BBy8+S70EYf3u!t!Yvaq`7SVChE24jrHCzqu-2afNGFTN)Kt_u27*+xG7L=h6 zJKnv$S-3XQ>CuO#;>d1ZS{Qk<1d8q;&(_DWjdRX3gA19FA4OL9h*%N&+$*{^m6+&H zBqi!mx+0MsaK|L&ohY5M5jUx1zHE=*kI!qA^r0;xyFRrVa8y%c;qf(EbG@U@M&zYi zs_{XC)$3^igGaNIRvRfwR?Adc_I0DnS*>Yi#}6%_4R#QDeKC{;R7&akSe#6^oHr)z zHk7nA`6=p{2Rd`mYW4b{u>t6kAe!qz;_g!=j*e28z)n?t)`;+6;-l+#vFPy^B!krK zYv9B#OAP&Sg;h<=!g{oUy%Rx#VxMHLw~8P^7hXGi#WY79L&oVWTYXwMR!9c%1OhXl zlDRQAQ*J7RyiSe~OEX&En@BHs`nd5_dFXag(+M}Ou+9jjl}#QqASqh86M=neb<)oh z8{weaRe^7P5@~6qObby0?jqYk)NiR!%n}+MAGT=na^w;-+OyZ*TO-enzSuXL>~wLK zUl-jYz7&eph9i(aehkZ!XyWbp%w+?XJpD50J`a+@o06O^O?NRpkHWXIEeu-m+&%Q5 z;j)&b#TjieQ*AvbstZLnv|x_n-hvFQnKG`Z0!CWLCW1Vde0^v>P_{EiHonf}w;?dO zp2V%TmZACx6jSaF*%gNh5K(TWv~*)40@kY+6rco|pi>)&=d|sa@KnOOS!QFpt7|as z(pgB5%4F`Q@ODXW!3!>hu}pHKuYLa^ zW0uhZkakg%eSLy1cL&USond{7uWWZu5g#LG$S>C!cJ|087@ES$ApqL-+ROnF-1XYd z0sh+ZmT`M(e|LLqzmEkRBfZp%u_GVn-kq&<;Ik6Xdmj)C{@556Z+K)}WiRvSI0Y%V zuFM*SF7;t@o!l}wv&&VlxTun@jDS)>^A`_Nb@h2OgI;ryybS3lLkrz0;XUK>{t*F` z62PzCxVWMu>yBAs7`%xwY!^&jyZQRFHJLFtS`URyH^3|yI74loDEWZ>Iw1!?GzQi) zw9TNPU($3|^SLhZ1LRH^bi?GBJX!LiuXh;1@`cR@p(|#MTjZEG#&34`x&9`%8g=uY zIRi(p8Y)_bB)xpmM6Qgvli4} z^f4kQxN57GR_OnfaN-_5Szt@-XzMhYHC`P0Y&XHx$2fB(P8TsY^O;de&G7U%xeeDO zp|W%9&~C$O_&HU%(br`tDH7eFfNq!_>C8$mlLC@IAHJgAH=R}0R_WnLRxGYS(o(6B zm?F_k2USbec=E_jbgj=fMv9n#de~OD7$|^~P$gyt_7yQ=j#Sk}9M{IN*BDUEpxENw zNv3K_q$;JsQ>m_+pY72O(P08NsmZi>2Tn3=tW%Yl&=_ zwANVjVdW@ZQb?#3pVZ8=b%!g~)Q{-(L{rDJ*`Q3Qk-N;5AbY=k30LfL;f}(?PVAIX z6M<#qI#J~^p_3!3m3E=&w?3Zy~@kJ8bOAX$^NNXrmpFyqmtuFZ~~81 znq46Km-r8mOvQ``u{6Az=KOqEFgF>tCV)6bbFE;eh8f)mA2 zBTVSIMW~{=pOhTFos64Nvn8RobLqoj)Tf;FmsBQ{c!)nVg^^?y)YA!=4o`23jRQ32 zrfBC1-RKdgVB{ZTrZV@FqEHoBL#%TZVZ|2QbPW?a!c`;a&iU__CS4VUO`$gym&r20^&LA_t!gy!oIURxhu*%QHR$6G>NX752@WpBZHfpY!ru};Bx z1%Q-JCp`YLfG76F0_zm8Sbr4{K24ObVwaPLb^{*7CPVXf+7h@gp^Zun=C^usyXKN* zct8C7<*1)*3XKQZlIOj#pSoB~*!96;Av)WXZ#)IH`|%uFmGX%pVXy&DyWG0i&r)5C z%{j_}fAOECKj!3e1c#q9Zi*?ai}wrL`@oT^519 zugB%u6qBC`dZ9g@_P^5A76(6SzlE_i2x@btYjFhRqAajo%fUO@&%ZB_;R$4ShS(iB zbs=~6=7ulf@|A6?G6d%@1gS9+psN>TdO`R{ z7fbe(SjlF6NkKv%=$i4dtIsDn5OeGKZ8ZJ8s4&WSN@E1s^}$%!@t zlA+o;YamBJA4}&~FmkcL9>jUj12=UF{%~^dIb$dfp20{01s0r_dk_To5ojQ= z2<=8BLz7Vme`frKQnwNgeoN4@^s15<{A{^9<4u#XL4Odwt9Yf}(N#R6>fU5Ecc5G4 zo4t1gjP^|kDZQUwdn{i4VoLpL`p(MK(BJd<5qhZXFhUI|FVcN5J_lU)OhBOzqSFi0 zu?fCW4_K!+24xRew<{R%3%cVC0MH$v@ELLN-Z*5PA3!~yxZ;-p#W%FW6DrV&c2`8E zTC5ge; z)4v6-{7e1TTDohQV5%(Ylle=oa;?(pH}!H>DVe(1U7prbuHKSu?M7dctRFFpdQiSO2wGus2!% zrQ$aOi-E~WM4v(KEMnJeBCv|nlKEy|UgWuDIp3p3HA`(-sN`G`%3$t5oq8kFxccIp zpz$ktCv5;<8(~t_b78OX!tLEV{2qldp&Y5$Ts4n5p*uKiyoS7ODZx|Fy?;qc*nCR} zG%!fu+KdYRH#pR>gq8sTJ?XrOZfbgS6+q?Vs{x-CO6^M2!V<7xc+@vq9!U#K`Tiwjm+zvuTgKG6J&&&;46 z7dUwAK?&>xdp)@OuiyeUbW!%rZtXyOJ`npCrG!1OV~@cBOtvhEZVE6z$hl(iOPOC8 ztA3AJV%`XCzC-Iy$j@{6C0!qupT&Q`@DBQymV2;Y9h{z%mhAgx$<*jxTXF<>OZA#352#_h%D@U zP!I0^IWJvSdcDk?n+D@L@(Bxo{id~_6VAdUQyK%bn+|pv9T05|_{_QPte?vBA;I%& zSQex*;D`c_PF2#3RSFD}<+VXms1#h~jwA5TymSBP-zt{!p~Jt`ETeeKEJ^f9iDjRxP*5gzQ7`NiL2ek_ccCT4 z%FyU}_Kj1ud~o~k-j;E3tF!jk_xggn<|uG=`eNgRm#6HJ*`>~?XsOYMrfdbS4X-LR zDHb%LlXU;c@zsKZwis7ruaX0czLzVu_+yE_A8C;*F2nWoA+B*R2$nu|TzxAmK*9KK|wkWPRq*p$(bp>Cyoz=P&6-_-`E}wbRy!l}$ESh#BxIB{kQ6fg8v zW+mH6t>io!X-xvN0JLNayjOe@1L8_`e-KWcl$OfEdKGfDRmtZhYWmu>_2Fjy*^BWr zrs>8Kzd*pk&m*(fC$_*SAKB#%+{qTD3a08Kb*32K!&FDnp={pzK)AU@d~w8E(ky-nsCVFIS1Lz@7y@6D0dqXuK{_KJ0;c{`is4JanskNBc88 zUf>-v10U8=xq%POD0z@xrEl1uCw|A?ucT9py<5!9U!Hl-tog(SxP^|b4R=O{r(Os9 zrU{KWOlm@-pb3tICN)65uxILlez0e2L4LevzffPpRfXlStW|}%=(>aK(orEkd3Lm; zqK^LFTg7!TsiwxXdUbZ3U$wlf&J&a23q6~uvU;8iLwERWZvoZe9Ix^BwCK~;2( z$8}YNS4HEnWNs{no|e`xDl0dPqL=Z5sFWMTDl=r#2NHZT z?7rgxDXwP&4)qHB78)k@Xg2{zB!H#nll_33Njj$YSaYDHb&w=`N(JjfNt$%UyKJF1 zMBd@$%_na9iZCR!g!B}}LX8-nP=qZ4IO4#f6J2s36eVJc8i{0-hb3LII5KCEjL&fx z^NfsuYEh7XyjddFBPLy{DvP>CRJ;T~m@p$TuDjF{-y4{zqwR|aT`I~;Ir7k*^Xg~2 zKRCt(8F|ae*UdbY33x3$=Nul{lpBKbRmyII#Q3V^mqpI|>A$U%En0sNus!~D_u9ac z&Dr+E8o9Cw!cZ` z1y-MswJnf#AIQv+sI@C-?4c-VLy9x9R%mKjY;i-Uvj^wl($1;(J|LH?Dpr>^t3BYr z9&Nl?7In_`kCyR-!><;!#x<#aM0M|k*ZmLCW#I3!qfIxiP3m*24t>NrH1;9RD1`%A za!p=ULyAwR^ix^!ju#+W$7SQZ76N*NZ#P7TT8VR?&|j)2iNBJ}=`I-^QT3p|R=0JaH?I4-@S9-sc3@X*^LF4@ zc8z&iBlZ^5XSD_V5O2Z--;keU1zX8Rz`X=)3wn;oSIF)2)`x0b1b*`1Blu^|j^w_S z*S`}F@k(aBJB3&tJRJGwP-=P9c>-8EbFGKr^r+mNf?uH7Bh6oY?nso5mn7o3UybHh z1Kc<*)PvkwJ<`^q#$LJR*Mj>1A7u;nqQ0&U)%wJF#b_wfs_@RG}xgw^JPAHH%)PYkqn(^+Ox z!XHiUIbSE2b#_za!jH~%tic3`b3y(Rt;{M(I@ohTUbpry4S4U1OOqtrNk57|4H=si zb<2BBe^$JZYA~`24Uu$yq5tP44Qyn5p!JV6KH-Oh@)LLa-=@U;`;tc7$==oB-^~?j z+RDi07=CP!HW1NLAo9a(9x#L$E#R~owLwxg0#wUvTG7%?!>J9}?AY+FBY2ksna^eE zdab(*OPJ;q#FFJQu3|S{D^p)_&sFTLbM4p!LREUl+&z2myf+Vd&r>(wUvB{YdfRXY z;BVLsuwy1T@cq%qM$80ZAu-8-<7enYTd)#F3N>NF7bzOBQy%02tQ@!n&k->TU_H^y zOuNtqylO#@BmFJQ(SkxA)sB&G23w4qSNJy)EzA6a~PdU+s z7Hotp-XZ;2z9h+wEkc0?PvEY??eLNi;(3)Dj$t)#(=lSik~{NZQOZYItW|NR6p&;y zEm_>fT3zevA$;#eazI;2WvQ{{&}Iu#)_0Jt2Igc?cZ%t!kW)0jCyFSmH+;(sEiAR! zVIjMTBIC?=upPILM#R<@La>4K2OzZ{nuzO=RbX(s(^l_+a&z3o^k8}^bz5j=8qkF= z5rwOx>$2~LD@hd!ZPfSD8a_j1B&OYTxy-R*G@vbM$v>7~NW+4utn+}#KKmnrJ$29x z?dsr8@Emmo$>}K11X9YYp(JwTsMaHOq1=cEUFsmxf^f=AFrZ{aP>w^NO&gm8wyx$} zr7#G_`FaL{>JX_gMM2daR0l^*orv2?u{VlEdD9Uaq04rRAhyibXB;#JSasBI5$(ob zGzQ2s%x=9D}0U%whax9l}O=cttm(UTkO zO#Mhah~?}Xj5up)EuJlFHRh>q5BF<0Dl7}=%bUC8j;9@2$8=1`#;>a^W#cy9Qq0gG z>rg=U7Di}QsS-8S5~-0O3&$r1^)L0pwf|Nf?Vh^&q;?apLASAqy0cDI*##Mr&6>Tj zxJvoRE&J#(Ga+>mO{8vIU1^Y3k?1^{yG=BO{6G;J#%*4`SCph@@eZB=rBh3?)H65FalUsLg*sgx+QoRopSD?GDz!M{<(&cbP}*bmc`l3g zK2&^Xj^SM%bO5^I4D~F+-2t^3aktIuY;!sr%+IJJ&q`$&pGJQD&SYSldDolWflg31 zeE~P_L&7q0hDe#mh~5n^x81`@LCQjFAX7z5X>@Y~4aWEwwk|3OZQHVBzP@#8NXKwF zQstUmcJP6%M>g~y`7{e(0ZdPQWH)`vA>FK&hUJSYyDr{!56n|0@XG_|AG`?>f`A*v zo9pLC@!o!7*i;+r+8E#jL2t-|YX#AkUf*A&Gc< zU)#2Kvia*I(JXH}#S9ZH(=wWqFpm2{56q4q*bSWj0PpW#hSTZ2q7bGNJFU^iNMm~Y zUy>VyHY3_J@qB7}{D@!?4oL@c_l6k5t}qY5-dOF7QYk2Xr~3Ka9P!;XBbXH#;#uQZ zeu8NJ2Si_mU&wtdL?gg04cVl(Vae;j96@+mPYA~3aEoo}?K+w0>=q{oPdr4esYUD2 z{8aAM(gzG1T|2k9ccO^6Zi{!=gOX)s$)1reVQ2_)s^M;wC8jO$9EcyzfLltrrZ)PT z_30b5XtEn6hKvR3=@+euwHkzySacI$RydW9vx?xAH~jy(TqCq<&kg)oLk@mQ_W!U` zS2lHW`=^;cRQbmZB8b7e1g)LcdO{{DA~hmS-|uu6hJm!?L1+o09Q4*<3$C&4HgSy> z>p!k82@(naRu;)W`7+aBtKJnDo@@U*`zGgMCUb+||JOG_Lxd_S)%9aBzWYdma-z7P zC}OiwhB70(ZfPtiXf#wBhEbia_Z)-DE;}4-?*wnJ5ae|&lLZ;=$c1I^HG_Yew8d76W*s(bFxFcRGL6s4 zjP`Rbm}Zl0&DCo<-6zW(ea0PnzGExxIKk_=Q0{P@!nRL0ZJ?N9POk~ZRdal+FM;Np zvg!j&LllHwn z#^TO{Rl{)`EHn?u>JIT<_2WzY?4_FDKX~c}O9{eiLx8L>Y6+^2dP5j^6rN>VI!0HzksnjThKtP{-9~Jfg}s2*RvrG8Z^x^x$+^Aa`Cb$OnNNwP zjE1BlV5L#QD4|wwaTLXf$^o`Up+}5_;WNepF(hu8V@3c$ym8V!nc}p8h#3h?aR=0R zW`dy;SqKpezHnAif@Zokf$mGxxIGCpN^yAvB=4lp`8X-5ZDLnW@l#L=SF!B7($PH) z%-UIYzw0*+m#88t`mk;nU#1S^{ID+;nO@S~P7=Iagq|D%f4n~QJ~E;0yfcjX1^1jv zS4iY;)7&tn7=;15|1Mc+(sP#gydTDPkaslWh$#i=a}!^kf?4FUg>KOZVig z8jxXT-b2Q&?Y0-Eu^D8NE_=aL+}^^)cEY%}O0%-XD_v zf7`VDn>R|>(8k8-$71qtZHsDLFVvs_LWnsl*%xY1YHcbT-fCJA0R-hRc!v%h;oWrT zwx|yqG=6_L573^IW4$20xK!Nj zh0WsS6}9iN&oWX!*$&K>e0js)QH17k(I&g4Mm8w$l+wtMrp*h?gTv{u z4*Id7q`$SLx(b@LrGMHPXJ)ZDr#t6D-*}MVZ|h(0L(TSmv`^siEa)gIcr1)psK#ow zQwTVR zt8NO8;Z}|nyo;;w`s3r;(3@Rre}3}#DyFIcr!syx@{x(oHGf82FRnq$VD0Cd?=&I= z?o2e?PS6fdc3uA}TS0Xw+qwO=N4%@U?SAp$TUOptW&zCWr+ej$bKCNqMT-kpr3Rk+ zE7e_GJlb0rS2C#|W`=TZiWOB@+>~qaKuGAA&LDpC+23p(bOs3)e-s^B@=$E&WI%$s zOM>H?Q?_?qJ8sy>Do=zpA9A>wA^E}Nj^6>(k44ATa;b!rjCa-44XPnUHwT|fJxW>? z5r@sWI}lmjQvNaUZ~xf*?u8U@*>_s%6SZetOk|BU+T1pj+_|(OLuQBTaNj+2kF0P) z4`z|{Ba+!((YsN_Bj~;p=lm8Q{gh~I{#jwz@v02{{iY}4T`Oy~E1gn}YQsdc?g)=X zTXYGhQ$1zeHe;>cM_{e@Oe9(1Hm-5R)o-dPO_ysMRSQs+T2_84^A~jTyCL-H6ry*$ zz51sM!?yMD2?3;tXWL$U+AH7gcPYp&BCcSNF^FwhAW=AuA5ph{s}$Ou{j$O@rp9{6 za`U2Q!sGKQQUbbh!U9b(e6Hu^qZn zZ9tZ6^ySB@=#Ftg_Rt0ga>1iwz=vlF$iRrQwZx(Iuyz;&GJZEP$bk2cRp$PfLiN)p z&?uo)0+CNe1O63#@w5;hUz#3a>Kzz*{`lSa8JGx)@w@k?MqOV?ec+9q!mKmJFqOHr zK!OER$ok>rz`HnG3e!;H?x>5B>B8&jK9Yv=Ia`?f1@zW>skUy-SYnl{wB7=<>}>~^g#8huf9l&XTC^NO*!D_DtL z#zM+YDH?+t>h~7rISb*+%~f2~M>~?F0>ct?Z~31zupE3W6NI~J>SL@VQ(2^-QhjYr zV0PhyYDSr?8o7iJmD!Y|DmdbisO1J;z7_QPSYBK`sZ1Cxq?B(-Q{GasJi%6~GDuG1 z^##KQ+rHQgi_Ed){-k?5N_~H5mn?o3^Jina&*_D=G~FvPogy2s`G=f38&%Id8P$Jc z^3XUV4s&Pq4b3aJYy$}W=Zl}E*P6P7YUup+9p<=q(7UV=70j`rvstQ9V=IcHQXcQ4 zUWmZdRPTu2`gY+970jP07A_A7d}^)A7ZrJ2VR{LMm+d;fzAKk$!Qse;?F-c7NB zYA#fbI_EV}O+!ZAg;fVH3$&FbEWce6TAua`#y+}k(7-J|(Q1EYzwD|7r5}nUBQGw} zJ}55nS^Gs>!G8rw?VjD@$rVhel;s#_l=}$b?RHZl!2w9F|C?%BG%;z-TMb7On#^pvb$9dvoPZuNogNUg}y=B+X#a+acROlz!t&v$tl z;hCYO17)5c%GrLv%2z5SpkGG=!#E6le*X6142{5GDkYdm4IvR}lC_0mm4?#$yFPbz zbe*Lg&V7o0-J>RDr*NvV$5A~k-CFsd0m+H_(XbyA&%57m`ed~zUsk5XrCVL)cw*8W zn`;^#S=vX0X_(9BO&RM>;?0)jofsJy>|?z3qP=)3wje+>hfMmLrr+?YBl^Jo$NP#` zSAw)F0t@5?q5P|JCjoHQW4cJA2GG#g8UNx`6G1_T`^TB>AJ&tgX`p68sQ+2c8UEpSP+K>Kp~SU(A>uxz-cZd8VdtVPdj`G;PKq)0uiEk5T;%U#8HGb{K^dtw5lXg zr~oAtN|j9kR|fqC3^Uyl3p|au)|eHQz+p@LT8BNrX+AWtCKTJS3xI+30KqKSAQJS* zyCcZXz`n_WGcmQ3dh$S(GVsx41HqL+cTz-T+D2H06NtefBuWsnmPyYa<(C3l9XNY9 zTg%+Vh(tR)ndpoU3?=pjt4Ex0Us!nF}pD6*~^fb>=Z_`<7K!-%S6<~b-|jq6SNjmplsloIo#00ZpOf6YRpEKLtu7 z@$9LT5X!Gp{-)_jB<$WaHL7?^aNgeTU=JiL0uoHvcyMLVBZ0Z+Bf%crli>aMG{Uyo zM&c##Zvj0NN^6#gA69);1hQRZ8a(v20Xsu}1{gDiLAOBjL4vLeC4_7w5-2=9?Xu=Q zUFg7y7nnU~ds^Q{WHM`Wg13eLaJ#bcGqA8b&=*R=#V!o`X)7MY5DFDol;s?ntotB~ zP+wnUTda3`w!6g$g;L(d+DGB=-+*8gsRy07`N+`L)*889FoA6Y`3`2ghtQsRK&O+5 z!`(xye)6OdFs?i>t~OgwaAnX96ZulPH-O;K@h{aR60olo0PD|!UIObVa{HlS0L|f= z7!onihj-tF7xX-j1^wnK0v`?Ak9>`dY}gu?o^}B+Y73=UudQP%%%H0u)@L5ytT+eK+|a$r*t4dOA4 z8HJ%yW?sREi6hc@7&rWAicK?UeKA1KQfhzD7@&5m@ckR#!}HnIeSGlp;|{9kYmG!xAi%JrW(oC*J{hQqY9;>+Z> zZo_xJIZ*4($WWGP`N#F}on;OcZOxC09M#Xgn}@daSVbB&ISJCDaBj=l8+^QPa-l6g zPG#)e${ zZ~EU*839=dQ4u9&S{YH7I3DOhdK8gY{vRPxT%?+EaW<_qG%E2Co>Dm&W;&J#!9P7V z;P*~Fr-L1B@#V97z z?Gm4mdCaCi3-Vy7E)8FtAV@MSEb0CCWfYr_eJ2&8ASl(@#`_}Wjs=AcpMhUhb5(}0 z8N9!gKDc5M!T+o60RPeUe-#tbzqZ}U#L?Bl$i#{6zwrN*)f)pT6#8Er>fejt-{LI| zTn%WQ9IR=D9W7i<9HnMvmnUneX{Y8VB_$+RoG2!!rD%ZuTLS<9p8ub+K>n6$WM}i= z_5NSPKa~6rgpJ4FYW@Wm^#7Fv|G#jS#)d}!4Tb>l{|lBJ1&UewtMo)*005f*3l?zt zD+Ff?J6ll$3u_Z&5qBdK`+vOB8d)1SImIZ-$Zhf?_+%A37*2@+14=?C0}()?AUhNn z7M6z#{RXTQ*QT_&BB6G?TEa*D*61NtN!al6Q(o5S0x<_3Of`ElHQT|Sy{g;Y^#fQF zmKn;13q8fsJrg(L4FkoEa9#@VD@3TVHBSi3??ckId=l9%HoWV>;y=NCe+B=6n=;tOseGTj4>!>^R1 zFQ164O6brQu?H-2!)Sw#($}Q9G}})dXID~hm(Edox4N~|(8d6$O0boNg8deOO9uSP za*7$6iFO6<*e!Y2;a_0{I;v9X@2B{&!U%V*`3=XLgwh|zhboAZ-?1OpYGa^vjlc75NU6 zAsg4<@4XrU7YN5GE8~Py2=yv;34AuhO7D)a8+ptxd5(UgK0sax z+!`HS@{7e)?HHnZHLN%f3i^`Twxd*0)~vUmtmFTWz5l~R_$QIH4*r^k`d>34{=X(7 zXkcw%Yh}cR@V&?Hr%g~AMksYE(37MrS2n9kFN=Q#PsKEb)T`vBMD3Xz}qZXB; z-BnyWxf=@@zF(+-Q=pK1DCK+oH23rI`|%xAKbB%Bct3bQnVu%bv+Hrj0yWwV#ET|* z_fAHuPfNF2EfSh;wQWJNEPC>F!Q?oL6*c55-WxmmcyMW-k8hmO$H%)J^W&OEanN|4 zT*pvjrK4R|OZ(td{x5#Q;jo6?YG@c5V6JjnHh z??IIA_O~(JL0t|*0DYtbf}1EL!GJ-rLosnK^{7I3oP9U&|CSMALLGxFC;))T-;T-r zZ)9ZR|5$Q zA}wRSu3f1{$6@xQIM6EjQJ=8trJ~g0_z|z9jO$}vD#pJ6L9xNKw7-GAmZV;D6mO&9 zIm2LGMaEPhTT#(ylwP4E(v^>nD@6C~{&NzJwALJ3@88Ey@UgC_702Ih$61E1&8*N6 zn2@ENicY`Up4y;NgOp?tLnBn->7nqS*fu$W;fEVNUvni*lLkx}G2 zj#M@jl?FVCrXe*d3oEef@Z>!}q4K~zo#@J~+It2P<-U$Vh3+!VA}kYAl_VZ- zA$>mCNRn1e#U!;GrBZ;Pz&4Q`Qsej&E$gBr(2%pzASL#kiPn;a)FYs!qD4Fs#!dbEd!nDzGmb~en{Q^-HV&xRpV--7yvN0GS?_R8AgzeqxU=@8YW!=0DtliY zVo)31ER`X^JEB@C`R>GT+^tB*P!&C^A+xCj>GtEkc7hd)_w9hkj0@pV*%AZUB&=6d}6d%(ez@_K1FX(=Bg zS?uLYW5>#F%_JL0o%g&O$^2g0y8g;xpdgp@&?O{ToeWX-+BcC?1>?Ayh1&&}jp<(X zYj|<)YjlW`lekczLpOwpv6S<61uYa0+(*vNaHoq5B&n&%Yii-sg$_bNNLgZs+?hK< zabX+zASfEt`bF@ks_$E#Jmi`4UmThzdva{bgy~-Sl>Xl>~!ZjgWC zH9CX3+QU{#v}YN!`lY5k*!c8b42Twp$9)wK0h~M#y6nTNhP+=731bBh%cj}+!bu$h zV{V8gxibb3c1AV2gPfWjb6ugDodNL;Q1F#35!3EiK3`t1*7@Xza9fYNmK@=Y+Tnrw z28ZqH@3>mN$5kopRhAAj)&9uM2}9?Yi-G&>2J!mVmWY>qa$gp^!8S8Sqf6{zeE&p* z!;LmT@-dd85I$K!=|szvx`mGAke~MH)5!(V^5HQ?HTgvAxHsXAYM)N)j#AMAb8z)r zFL^boQCzw`#_8sQncvcVv|}$o(c-AIb6ZwIHtqJ4l5&=pyk$5E`#24ZLBm@MZcdTj02TkqPdH@$H zzlD`*HYk@=tyG#1z-#2CfItgAgv`G7&)7LR5BbLOVwo=3W3TgPIlP>ln%1S64y7G$ zI!+ILa$h}mA9K6t3Pb5a?o4n^*vYb>8#~C& zbQ7o5oV%&@^hT)&yj6x)nY$~E=z3|>dPuYE%->2w?JU}fA-%PR+yvcuf^S3ZIf8E? z&wwM66Y%WVtcCLT%(MJce_u&zVmit5KS3v_pB|i)=hQ3WQfx|3_NJhzZ=$w|W{Qn6 zl_gD+frB4RcRf;Dp+eZo6eGR325fAAUYBzb@9mnvW&(}qL?o~CurlhGentlnixujq zZi(YDEgd%(H;k z3d&f4>u6xkWrfvrP^W?eSPyK;!JWvpTRNyZJCa|J zhFu>5DoFNVjXJNYISd{pfwT~@<=R-G7!xcCrNKpnFt#R=nUS(;qAs4K1hdp}nECZR zG4(>lpQJb;BK#bSZsv$fQ+J(x-)uJZ(y5vJd%}%9r+zx8xCmBUtV2>?$Ce%r+tpj$ zR3R3T=5RTz86$LV-6AR=;3}E4jFa=o*nRGzH9f3?AS2us!Bcx%tAw{KscV)&no05r z@9d%Wj*PnFmw66*Lc+WrYhF@9^o0z*(y^gxbtgv|bzhvKc^-+#d{e6@a@;+&g{vnu zDx0-OHF=}B&nnj8{YFy!DKquq4sn}^Js%?? zvyl)8b^}E)zVMyUyCXyxQ9FDV5e6`*E=vr7Q3F#B>nM*t;+0@mvvYbR#UisaNg&%D zY0J%ayTMQ@f-lN|iZ-%)erAOhF4KaL5s~Rc>`06 zoR$n}Di5#>(Dix^Y{SLXTy)CR;B@evDhS``=9KA)1T_O=CUXg-lRQ#4-T?2D@La$Q z#LHoSvk*4O3N>*iqO>7pAa*OErl%=(#%l7#g`B-ON+Ea-$I>#dV8<`y)i0*UW{FDX9_6_y?jXDrqq#)@62Kg}NEI*5wJ@Gz(cp$>M`( zY$et2>}i)@aogNP(4F|FHClKBUSmwH<4CxyM-DMsMTZYyHxn`9R${pXE(tfYVsC$n z%9_$U1!^*semxHBri}ShzEOX*R8BY*6YFuD2&N=GY51OBF^(Gh^{mG9?l-%r;%#UU zU6%d27;!;a`m7yN`-AqS1hK@XEq0f=@ddDn3ejj2gkJ+;L=~y7CN)2Ezr8k? zVWOdAzR#^JCkO@Fz6{7c!otft=>&jHy!F9t|H*B?ZM-`~xBLx7o62%Dm|}#@gH}lv z0F83z3eG<6#+OIp;crHtM$rF)2!B#E%w2kS(e$a)jf7qY!gZHFNHrh}btKf%?TB+^ z%6nYN|Gi1xejy0DoL?X<)(DNWsIue)uQootX(2sBLwY?&V=ndvBPWp8P(-zdnApVK zipJH-JK@JC_Od`p2Rn9Q7eRs>BUP315u%0|gSNv@+!>At|DrpSh0og93d-FJr- zSu~Pc5&0NuW_mv*Jz`TcLIz#V6DZ8DgDBnqwyM!Cmx(L;2=aiZ;un zNhjZij=3LoHX`-L?pHQtj_1Y_cSzt&0e(0IQ{hafb8U+A)ueq)a^BtTjXtT;+`L1&9$(>Kqk zFHg1jn^B~lV9Oqv1PGZ;;X=$BY0`1MZ*rOM@mFd`xQVd0Izj5RKy|8~ylkMYTO_}H z?rWeG$BW;L^n1vuH@MEHfVZ@VGD#mH&I>xC;*}OpMvJ$q>9*i{0!6YL+lri_h)Fs} zbGt%mQXB;vLqtjp6QLJEmW zH9_1R$fv1<56l>D<0o!KRPs_vOz$XHlDZ3tm_MJ>v>rFR2(2vQBXd@a2={O7lRX$? zhhf&(@h!gikqluGse0};^$R*!X+swed!&@Kh7J;E%xRhe^OWSOjf5%@s?`ahq_??! z$7@@uH4SX@`N<(SDPT2>EJaQY0n3mp6|Pxakj-(dg@ISg7uR;$>j9)zKazqzhvVIj z7oM9wG3eVOq(8?Oe)_OKBGbUP70r3B4Zl!Od;pgVOZFy9;x*)mNZk0TFY_ ztmHT}yb{v{S5`3YiK8+@C92n3B~{v_)Hi-{t+%NJNl$yq*5!bf-asoz*OQPVDO96P z*2_}A8cW4MYY!2AlLG>yaEPEoiw_KzCq<=YYg?;)Dp$ky+zu+1E_#kOG#d%lSvJI_a(9PlbfOq-+BtP!^waydDrt=;Tz-aOchS)i86 zgjYgwadj>JW}j;7KvmtY^xdgs0*NeEn3oFp5Z~K}FK_HJ;1acyhw~76?s6$+*X*jl ztgy`8wD@?b&MwbP7u;UPNeHD_kZ|M{NuaJqC~HtHZcxZB5I38rzL!*aauxRFM7%O{ulBg;4k^W z9>179^VhLng$4j%`}YesQAax)X*(kWXFEsY|4b!p?OmMzG7=^RHve4KrKs8{VXL6{ zzL+M3*lZBWlhf2Rgl3`#E1OfvZz6$UVM%T-DMu=^83dG!({59f&zzmHx8%8SUZ1@& zUV!t37r7LRa4pzz7X2B@+jqa2W(`K*Pa5BDI?d%d^_ZF5{(7ISvjX6}D~${~s~Z6v zerN1YOM7Q5H-s4S=1>a?4nzb!RVf#*#25*|ioUOjqNLq-gjLk`2(i*th*z~&5dqd! znGbhBU8Qe;t}{p!%T%`48Ms7xF+sQ1V#|qA9k7R)lup0TPD%I`BYt=6>@=E@vX>*r z;UOkyLqucackzB;#nTzw3(8FYf6374v3aivtA3uBcf=ZJ_ zB*W7-QNpsh_gbrXlE20C5Kn)Ko}FxTsi_;tXOP*+6Tb)rnq%GR8jiPh6_j2cWM}g1 zk;~;c-%1pefH*V2WS7tqh9nKgXq@P*M3b~iu>l!^jD%8ypy$ZW%!*jX7{55sM$BB7 zM&LrB0VSuNJSWVZuoow(EELDWBZIW3Gwgc|n6K9yF6D1QgmM-T*49{Bk_gd5sXejHt4Xqt;qiLCCF$+5_hnz7il zBf zCwOoZJ{t#VdPy76T$v7~8FPoVg^4rFC_Q;KSKg85R>WjixUrGbXMb9Ci9(ZAN;aqg zL+15vMoH5`e!_du**R2Z92=C^lCZIre~qD<0b#$(C{2J)YDdYgc5~Ri?NUTX(i815F2Br(H>2hm|OLxtjwxt1?K-Rc>> zH{Zp%rYx`EAv=lVt`IX1DVqyQZx+z-Z=OE1bG&^OgCyZ+&I@%g#L}W58KO}b=O&Iq zPoX&|c_xvwU0JqR4Ere3+0|XkTx8B~m5QMPl`*igX{s77NL4U%lM@j!Dduq<&65-h*c&D7N4bnP z*)zB1$7y=?dV_7{n{$E8Z#1vx3L*Jy$pGkbnYRV?_z-t;%(i@m3EO23S_F6Sl4LSQ z8e=Us7wn--hW@jP=>CfQW0WpJAaCgZA0-YoJXscYDv)_2I_6?{_FQuMZPRsUMhVyYv##)F8yWK+*%RJ{f@GkPQ6dLb{{@d zv&MM+%=!G!k?sv~ZypSIZd9whmh9`Wd`m+=m+bqnd}~AX+~)(qm+HsDc&}&%gU-~z z;X4{;!wT9r!@};R*j_#nySg3^{+(s$_-_&7mQ4D~8DntJ$HRrkCRe=Aw+xx@wHWf6>^A?x}Vu{dZ zuB?TlEa2S6zJ1{6gd7kmti_xoE_$%dbAIBy5bg^3mEgW5PJ10)swgT+-_3=28A<9T z$Kshr%IVd4u!X%+&+-vt?jpyzqOpx2RdVV?CDzKiv0h{gXGJ9BXve6?lXGrLM8jTC zKr^qhy`06_)#PdAWu@ivLcOrOEx|fclM|tOnKNphRv^rrcM(0xrlvHg?#)!ueQs`5 zW`I2G)#*-v8gbe~gxGj6kXbFCJm%yoM`+V5wgE~q+R9qQg)22obl;qyd?~C*?~?ES z929@=vr5t6PTeD4-~IFkCDMyB)Yt;#V^Ns10b>(B5;K}xt4g$9=-lkH)WMn=U9tO8 z`gti@SMqaKbfvVpIB!5s0UTj$?L>`tJ=In={3gEQjYi|MgLkaUY_h2=XBRQAzaOx$ zy1+4+7(t88>P^HxH%0@w2q@&_8$G-kV*{k8>f(rpEmwSb7?C@zMR*@8+(>1aany`Q zv`%H8Oc@0ugL$qQnRhk)i%Ge&aY~UbwOn^QX(mt=kgPP!dAoM$atjsGQuPDcYP5(QCsWMYJqVwu|_H<-a;G08>6BzaU=qtv4Xtj5Ui z5g*wTAG4|v=}mR1eqv5e#R=M4S)yK!o{+Ka>2q4!=*b4nB<9W{iJ~5k>DA8Yb||X8 z@e$RiwwYGyBSj?2ckZkvMJGDNQamSTGR0Cv3&6AoA!NVQqn+^&Neh{c^h6!{LT0f- z93H(uk$@K-2vOMlsGzWyuuVYL*C|b7Q&eIeCP_y0c*gQr_s})?|(4bSTDL z_SB0Z#>$KWK@4cp6ujHWn%k-z2=%}@siT1bOxh(3_OU(M!F2NW*g&E zo12)jHjHz1>|G1lr#p8I=@IL3fY!wnYhP=DskoZAQhdFU)h~7>ScT?~`O;8V3}5H+ zeQN86D6wwedx-?CFJDZ;5nIfQGy}%1xM}keXeSE~2}aCom5y~9z`p2sq=DZ9Od)!K zj0J~(uzXzq@N~{FzC+9ZqLq@ zv7N~wR$HKF?uJH<^m}e zMk!50(#89+!gAd{hV8T~y5=>lG{!d650eycq)N~E98tVuEZzXS&xfjCzvDLRlh&I% zdJB9lq}mI59XuwXC=Y3&>8vz+A~`#oIH}`9YzbaR6c5r!6fej6_9^*l$KW3^s&yr~ z5(11ANa(!Eb%nkeP4MJKF{~M^4^9@Xva~V@VL)FklFUE?SEQQ4U)P#` zIY5TPmUgO$a%zgjC35mHt*nP|I7!^fx!E6obQ6AT) zY`hy*>^K>(CN-O5oWHRpnpvD!DAK^4=GlxW=j`6F6|IH~`cm)N+G_LlT8N0w9tr6o zu_(IsW=#K6eBAjiNlNEoTni>e6m(HuW_Vf&lT9WnRU4$du#Eb|XC#$|Cx*>;{#YA_ zrO%J5GhRHX*-z>FzE5h7JM0{E36p}C<^Iq|>tB6DU}^J5 z*R*)ERsF=A6&9Nkw|P!mNPZe)W z&j?&deVX<#vY za-h2rN?O{c(-u6LrQ577`9%=E7+EnS>{eb9d|5vWD$&6Aze{_WCK=6G`%iUD=dOcg zIEC@pwZ5)%JK&A>)x2@~xdFwJp4mUvw|mnyJFWwVVL7v~FYi&hT?J^t<~~&N#6Lvx z+@+@R0o(%LU8{+$be6;a_`)Dw2{5>Aec+za?S>U#zZj+)X6jtTa(K$C5py}jOp}$* zUJTt~I}GrGh_e)qVmdyQx5JZMK1c+z)W%;Th=ywWV0b`B3dy!mYP3aZ&3F$gSho3x z5glC(o%secm*+_W*vYT5JsU)~bm*k%=ncCn6!c(JB|APDWh;&iwVaZA?RpLkkd5LG zzGFH(cYh-%--XH7>=Z>W3VMo0#@D_qWp84#_P`@Uxjy8P7t_L@D+kc7hrF++#W}Ee zM^_!ch~`STfvz^8 z+sYQVN9lpK`n#%K_9q&4DM+k~RZPQ(iNsV$4=Zqv^rU`WG*v%i+B7F#XVF*7RBVE{P zGAP~qmz7zXhieo?*=}Le?t}w!cG#nht<(Etfh^u|a)7pLmbNHmhWlb_dKL5?P44OA zCu^_KV^xvJ(l)~o zbH0<(@(H-KIu#oamb*W}IQ`&l9z!>e+j+9?C7Z!bmSC$0LDT{in^I zDNMOdRVWV(E+2M{V{*#HxDGgWM;NjYZGk$cqzN7l)9>_C|MBCL_$quBAQyo?R3YF; zr(f$a2RiB6hnui!zuodn#gF^_3;9IC4axePEVbRxQeF-AOWcrA=)_?IV0;~xGM$2$ zCpD3ybx4Ox9k%2;gPbRb$Or1qdw2CIeWNhlQCQrg3%CF9v|Njb%(d#cz{1hc6>8X=ng=?0R09o->`T3&D@nl4`4CF+AyZZK~e)qS!Q>s6m->%mTcW}${)g=Pkei>eBD_wwE z-ea%Fe$8(cX&#V4sAUA`O!nJWPXt@5=vQ!<40cn>r@iZ76sTkXw0MG#DtV-!=8@XS z;|H%*pUrN}YnXtZQi{b64NEQqqytu4S#YY&Zo*hXVk z>?YyobL=YP4ASqYC)`U5k+4xdYPUq@E}-_=?h1LTead{GA3AqO?aAYmjMM70+SaaT7(A<7I7NRom# zi7xCeUM-JdCWn)Sp^q=o$auG-ts=s6&Z0^(yTa#X8K`1_tuke(8_XGpX-Ig4q?sOx z-Ijc-S5EO~)}Y=L?JswIw?L+ZFBMa(0qe%sxP?o07CC#(~GJ z!hK_?n~-{_wbr*^NghCDg^ZXKtPtC;gSf2c0G5oT2-I?&%_O6x>1awn3QuCJD~uZ`M-Z2>$Ato;YAmsP+`Wo+J|Ngf(pgYU)Cm(giiW4ZzZ4 zonN!3Ev!+t!9TRrOB%OR!AV_0E)ES_3C%HHRH;=EfPt}f@cBD~s#LXJGT;JRFzkL5R?ZAAU zs9B?GLtNl;2!6bLFj`5|34XMdbV!3q%TtK_q!6sOqIl56M>=dD&bG6VSjEufkTdcX5GSp5d`(h`JiDmxGhd?l3DA5 z>UU?dY5*ODbj`$}is`r+v%IG9K6iaBG9#z}$BNr%;IGu$j>A*WA;AEU-~pCk)x#9O zU?rA$$anfH!x?Y!3p8SETn<{~sz6z;0#0a$a$CHLMl75}_>H|_CynMvi6%-q3)Y?U z-aH3iE?yHUz!P$rX+>f5G??G1ag4XzGq-bO=@faxARbUA56q?$OzCuC4avKpRL305 zj9 z(g2zDbpiG4X9mq`U4>)%(lr7yjTKm0KnNTL1r3WDun6{Pa#9xw(@j}@rQ(31NNJr< zjbX;oUOgxnA;DpbFma8A``rzj00m9ZaT{tPAFLac8{~XV__>HEnH0!}YP|MV=)QFl{>| zyJ_mO_2_U4by5SxvlT~*iz>Sez+6>)0o7?utp=h)3q4sYNZo~!N>!bFp`0-%T`>^< z_)F7SbmSar%t)~I6DqM%%V5*Tf0sD}#F9*kM0Cb}aV-7?9dsY1OdCtS4##-Rr4)M|OHc6yLx17^dfb=(0|X_Fi~ zj<%ErI;8Ttn^23dj=q8Hcc1pK+7?df5BtN(Pe$^m zonZf0q%VZ54Zior5Ju%U<1Llr+AqC?-BDcDSBMffM_R@{Su*LZs1{&eiIyM_8UY2> zl0xfEP2*5?-^cxdxO?Q!0LvS4%9Ls2z15p+ZjR+Ya447Cq+YOYnTK)>^TT<2!qr2V z{d|D`n^uZb_(c=`ce@B6Jpcgqzll7!n3|e6{*z5=(SY_&T6N)jU0iImo*V_jUSHz} z(D2m1*HI2cF}FWBWG zk>z5OW^0v3s!#=6_;ogy ztdMi%G@s=u2}e_g?>NryFfQ+YtdHyNjl=H?-0zFb?<+0HSD>$Xz78i@if=zoZ}YtG z{ngI>)eiTG>jNKrc_GWylPb(t?vGU&ANyI{6D$5B8CQ={ncMrP*UIEB;r(fU`Rn@; zJT?ArK5QZ`Be+tAq@YqJCeMrzzUnW7Ndwo^AuYI{-z{gJ5R2LL(+_V%yQ5H7Qzm91 zuBu1+N$L#vmnU)KTLy4xG7j}fsuNmDNs>GJc6i@04)#?V86v&mZI0ksqm=Gd3j?K1 zm~gB~IzXyx)U;XC_)gYSm-(I_F*zz6<|K~}{L8GWMn)~sP+gj=))v>dHn-~wU6xW> zdaIVA)jPFg5#mA9fj25zU)S4eFSTn2w`Uh;EDoL+$F8sM-;Kac zT$sl&(YBA^M4QN57#v_Pq=7X>o2{Tm(alww11I9lc#^?|h@$UZ!1uND_Jqxx^zBsX z{Z}#3)lotT@`e;dQLmLNl`hd!lZ8S8>91jg12^;g0s7T!^a!EFzwvQlf>%Ke34Ulp zPKIOUv*%I%=sUaL-0i%v?00a5fq|V~U}R!u_`?l#;|jWQKT$|G!h{9^0x)}o*qb}M z2Pa?)eQ^P=f}Ml{CtN#uAvMSwbD^ve6%EzgL8)qcA2r(RyA!h$i@cBT?3icC8yy=3 z3gOtInZWII5n^B*e5t#Ey!t!bAtdr_D^`tc65MGbq+odHa*kc?S@(7U`C804HUfm)^~;|N@ncs4^)Jx z9-tP*n9f8%vqzGftoK$)_blS!ZuYo;N~RK5q2eH9vz?0VHoi{m2|3frQy7}si75=X zh6dmB=RuTt$PGI=gHR3do?XX<9?1NS-K3Vx8CvZ?;n2;s!Gk5rQ4e!w&|E-x;nI(l zN_!kRZ!@pZ^X9P`jHQgd5-P`DK}+*KwIjI3y6U}O6F|iS0eFBH-i&(C*gnq;@y6NJyTdNKKv+s zx6ZNbjJ_jp(M6mAOp0f4lpz(-{PumXxViilpJ}-el(IKSva$BF%9*kaQJQ7K#k>^K z`HUd(tM&UZ#E*Gov%;H#d3}a-{SO~gFmgncP~FF*5VwHS^N7kA3x@^Owc~>5g~NjB zPkUx7`#I&tQE}ZI9ND%c8wZ8-kZflRua%LDENj{_Q)aeLnp304l_E;U1m~BB*sx*s z(J~P`N}aGpRn^g_MM<1Ft;lxvpT(>{C*63McMDi*%`N=>7 z2RS3pY><2;5QE`*=jKuDVzz5*%rE_D- z)NL{PISKZqW20^B#HcFQI#w&%8K&STr`xTIC$I#q{6p}$#vxlj(#d59RnOL;7Cqx7 zByCKv3NTlKO?0Vgt*wBp9wCb8z{GxlT|^zk&HfmG^4!&?p1v_LhQNOHcq}k zLxh3>LMHMa1739O9>_k^M{&~1R)PreODYAXu`B4|eZQ;jhm*asq$i7)ATyxC_!|;I z?cdPS)=o=jo1Qj*Yjd^E=E7{bvbDqdr9LTrE`I|CA3O?dAQ4JSb2Qdl)5J+wjwNGL zD+f*cxXc<0F;&nI}XVBOlKID#*`vomJ@uCyc+y<2Ff<)w*o0hFgUnr9(05Je zHr9xpIoUFqJwxE$bxc#pWm1=*ZKo*~(P{ryVAD|CfyfxZ)rqTmaG*?^_7N*DSGC(^ z5mj2jClRwzfF!N1Lw#JqrwU+^jWMU;&*mH$ zLGb=T>F$Mv{)A?a-Hu{_pXc?=eSuy{4Ggh7;xd~S>|pP7SaHY8R`IY;eGw;}6@;Dz z=E@0Pk&EK)M}$Yp1^4p@<8{Kn2pVrvnVk#v-X}SPKrP>JNM?;ZsTnz1cNt4$ygvZ^ z4)K&qvrEAhBUgh{S9}TV$!e2nAtm4hRZ}~c6MZ#Dob(hv1jK$K3gYV@XjMN#s6_Ie2HS5q0gL;aZb`k zs}cam*MlJ})!DxUhXpO%1%`FSC54Ax&DKiTPB}2roZP=o!JDIw3sr^XwjGsw?MOS zqzwqzlYKtL`KlsB&_W(+t745oW;Mo0>c=x_EE+~?`hHBEr1Nz`M0Oi5Ei-hpJc4=` zUCrR(e()4^1R}*kQ6oYa(HC^;HvfZH?k<9gp&OalD+4UT{b6ctpC@2z59F|&tP1SN zfI|AXtYjsaLd&*f$n(TESig#Jzy`z8E{{o3JUiZ^Mm}Y6He1AHOzEpTuSJL17^xCJ zek<2>l>!sBFU#RY(0t$9?Zn*EXFiIV>5)m>5nph03P$1~Ij*BYWIZ8#w^=RlLAXsr z=JtELGf)jy4UUzuVf6IzKui3VPm-0XwZp;E&rV*eVCe^Rn`n6l*od1phwz4b1ACf# zOYqikRw?_y>A~ zBSJGHrPi1u)MS|=p`(Fko9gxZ^UOD*0TV;SpNYYgeewZz2946}wrEH)!PmJd!Wo;b z=ePgwQlzQSk1`@p`3BcK3HekHE-WT!_r2W`g(zdFC&}+(;#>dUcDvH=y z61di_fF*kOt@8IT@e^$XZzE#M_Q^jN(%FX~w4b@(6tcsJ@yqcc%b3(F@c8Yl<%?n zToOCT6^5r(+{~gXWQ>Fh!TV7ZaWn-$uAqgBf+f{4rU&K8mATv7G~(ebRa@9T&+m)@@beSx$5LIy8v zQdUtrPEDVd(dIZ;a-tlP9#h50pev8}3)?F``^q450npu>#*9``0pbK5v2jzd-n*$T4E%8`gAo-A9tu*xIVM#+awrMd4krlx(t zcq;FtD|5i|&QJ3E>NhyGQ2L6~=LsS^v0Nd16lf`W1)e-#$Rb zCF08}irCD-N7WyU|9Py${;VZ(EW5Jw?F^$$KhG&U+aC&=R;@6QjGI=UHL^^NZ^Z6} zHq;aJ_Q&ftj5=i;plaSJiUlU0XZ>Tp=RmxSs>!w_nQ%4+PnB<|%_3)vd8Gkfe-^Y#s^ zfmtn+s&FQid$ls zMmOpSlYKET3o(}c-yer03EPdkdC8k%ClUdfk=Pxof+e(%+BbRy~U~2jS zHs8UzW^K~uwq0X;mP-4(t|gvqy*Rz`e-qSz-lY-LZOTKWE|O@H?bQ`avGCC>be0QU zmg?H1*qbH6Np>uf&5%ns$42C(d0cuOgxT+WfP0D%%i#OqcSVUb|0MiC&SaR^G{I&hk&RSkI|hpD>p1vBe9WbLj3j>hZ}QVbM|U7e?nTvRLD3 z;xAa?$}Fxda@zp6SbR6@Zkj`!gN+P;6>Ic~H{DQ={{c?9|vp z?VHHrgS~KQRne*QJQGXl8pEYfkU3*^e&Rx>r5KSDWjEpTszX4O}&!WF8 zPe;qQa^bc=jV-?9fXq_yb~P=%lESeb@*k2hKQ$>JTh)+!4b(u>hNZ=KFP(e08f`e; z8{mst6L7xP==sWsoZM!ugr_k77gpl$Yi6;}K!Qx&kVz^B4gT{t&ri-Cg8A-WbgD7k z?U_;|f6OBeA{o7U2Tq(GCzLE@Qk1hOD_X6&274fG4Kk~F_)Ru~l#6(Tpdx|$+R^0ji2g(CgcA6%Rg`b*cZ1+{{Kk3 z#~{gqaBuKE&1p{Cw!7N4ZQHgzZQHhO+qP}ne&_DJ`)YS1Hg+TG!>P=wZ4L>85nl=F`LYaR@IU089{!10%RfPYu~26d(@Y zPdMv=5&ughK8=l0zf46_5@kiR%K}=WNGVELt`?Dx+QM49ba}nvxm?v&+onm?xPJ^ORxE#>8_`RC(gbi@@89H4>ul^XNmZ8kWgeD{~qCof#Le4k&L z>u_YiZE$88Vd+a57k9|e{goM4b;y>>tv|-=b2;EgNjF=`FHP1 zVJ}e^D7V2JY*U??rXqPW4>HnYnQe4)l=%iSZ-?`wI!#6T$mF$J7YA|$>ZxUcb>2e3 zogE=|)bB!>*&1$Ci%T=>EF76eu!9SksZ_aD%t$iS;OXn%Lr8ha?P8K<1-bZ!u?b+? z&2ogRh*F^Lui=*qmIHaqsJPpV*f}`SpoSU8BIyM*d8pYvTDx!~OLxH5V4m)C&vJzn z2+&{~t=9Zs>U~dr^f+O57pd=dTz%4;%zI*N^xCzJ`B=$YnLS*dZr8)davk~VXySne zn4Z&ou+42iF04&l6E5`c5GH zoGQ+hq>oEbzfYdwj@UE+m#y&g;g@%J_1QRzZMwUn zGuQ?ojVZeph_y!Ia@~dI&g}|~RSJtJkTqJ!Ieeea-N^fxQJjg)=n;#@hLHNy2(i@- z*8-`mmIWQDE2D934fejg7lj0uhfR+r>OZ`;7=rCk_-&6?My(-pwpUH3vC1 zw=lyi#VbkvWllmgjn}PBvi7VQhYzdl!#tAyRXB-B5fIg>Q%RqEanM{=i=rrc!dV$F zhkS+r1RXpM_I3U896TA87Y5$NW|4s8N{chQ=hiy?KOL4f85+xtESL?+%yaXXcfxxt z?dr8v+P72T?M&8Fknzrv0F^A3Vp6&o5rGlRk4!USL<<(HvZ}5oj*o|axy}OSIidCQ z3KHk1B_5rz2ufAL2DoV^Tr4;o_PeM_TNY|cT2yQ6B7Upi!>2#fCjE#ougHy?3?c>B zKVzj}Jo%dFP|f56v=Xeij$!^Pgk7}T788HvTIk`kvNUSeV3SsC5*+tVnKw!k>D-=QHIU4BdrgN%(} z%;>pT$V`PAbu+QgrBh0dFl!V(Cp%MkIY>h(ym&&ql`n-dt#HCfYd4O9qnk+4*(%ur z2TdX>nubAogoHtRq=-Rq#F#;G1cgCzg!Fcwe2T!3(dU9elX7V-l29;)OaeNWJiBs2 zt4!ISQ+Py%U3nx*p@dO2_f*t)jktmQm``g1U7BePYXfRXr>KvXU3%nK*@}G&(?Y~weZvi8N)k$|GNXqCj+YV{92*+$|@Cv2mq0HDZO&=2xX*6g}bG)ls1EFiD z+S^rmQc=r*yW!d4z&b{dPDTSK57om*qm;NpOlPqpILgYB+A>amA&(jpHERtto0>nu zRu>0$)uFb>DzIg_vt*Vkg5y)f$6Zvg zB1n@$rS;d%Oa)g{6QC*z&{`FLkqM*~*HJ>W%g*pRWXQIJ$;skw8i=)Tk5`u+yPI4p zw~J$@HS~|BaidU~tYAn`%Rw`uoGJ^J+gkOn=~yB?*^M9DuOE`9?K@^o)$`SuGnVvfhMOkDN8vO3SBi~>|Ea)x_fux8@CmrgZ>_j zf2-<%zAhNYi|KX?4PC!L{d~kBiNNy^9)7*%mLbQ`NE`czbd8pyX+9xVn4p?1N`XeD zm!-)w!Wwx42b!-+JO^BEjjRuOxa2Oj;UU^x1{6by@@+tv>K*d50w;a!!X@4WkioY? zSJS#JVY9Fg$iLxx`Hj=QCSNm8s|`7DIVBUc(u29D`T=M98&vZ1nwW#Y56fi+(W`}s zn+Y-#rUtn%ISvUSL29(3idZsZM9gUj%B0UJRAP%nu;XQJLQ@BQzzR^gA_uIvEL$uS z??3W}-j#ENa`AtS22AGFqL5fU!b9QrKy!1(bZ^hPKPo$_(CMoTvPJKq^WTz|?J50& z4+#<1rpp|tIkCUo$h7AHt`ya0EVs+!H^PsBtBuAVU+Mxxg3hpnO4W~=Q*tva<1?yr zvNs2mcsB2?*ISdTQrc-S&?+gYPSGN>yCl^eZTb;f*49p#pKj<>quY8`Jszkj$dRqLMbf4GUHQXjssYmBl+JOGwk=_>>4EhWx6 ze#$+jOE;QNJ5}!>72mVvy!GcXRqv(coOi7Ts+UgHOvLs*YmRAMIqBRnYaL^kC~i~N zO&EABMn0QH7$#)-E>uP>DyvmsA+xS)K8dK$oPX^V|jzH{_bYS_$ zKiOwy$E%qjaZ{un$uXwdj=#85Jsa$Bp!z1&cGHF12Wk6*HwFUCPMFR`O6#t`bz3K0d6w)7$0=>cXbARRgNuV1wQbc4dElWbjlZ+*2!$YVW3IJK_nD9NG4;QSuMSqg~U#4q?`YBYgIk=cp1()zsv?M2Q1|4!n6>eB?c!Fmkj_SEuOYOsUto zQtMe@M+gG!0^~6W;|GEFga5vYfi&%_Lz&P}bdQ|JB~3m9KkgWK|M_nMtZO{*{&xWV z0HD01?UU3!KKfYFpYl1$tyw9W(j~cFVoN(UzWqRo&NB^2m!MY_@-~J%X@y>Gn~Be7 zD)e)SWz+(?(8BwVD&~tgbF~4(H9$l4Vd;=bV+BC(icxiQ0Krv+901$%SWCyp zjj@CcV&@VR9ui7l8En#@v=!H<`f;Pf>a`eiPfTdjR08*7CDSrTB{UNn8t3haET=?9 z{&X99?8<9^dxrfX4ue-pO#RE8E{`7d8~m>~^aC*hcS{KJ)r;3qyZdU|;|7b4K8yS* zpZuZisJY>)tg?K(`!#(Aw{U9r0E0fV5{iUO5*bcj3j6m}JGAN51f?8KId;l2KG!fu zNi>rZWL6FBzH}_ysetTsv@Rwb??x|}MJRy4MNpiEZRAS0eY{HWnMNDGeY<@ZUF{il zZBpA`+e|!+aVR-5Xnj zktH0UWXKcQ zk~pcJ%yrwZRN`TnP03D4olztyE~6Dq>R9Ern~;H_Im)P9?Q-Z>R?aq%=X7-K|(()vN5N7f)q2ndQFDT;$6+BB%rn)5S2IkKL-hlgb~G;vOfe@OQ5L)L%-Pac!)L?wf3Lg*YL+n;zzAt9+iz zzA6Q$(^LgXg2J`k;@XaL`7a)KQP}XT!-QoBlHmGE|Eey*d{v74wc- z{tld-rR!c)YdYGa)ueUp<^Y(3BD3zTnO@|AqWmf499f3cS#rqM$Z3J(4R1 z6{;cTGfqOJtA0;WKWCW%iZ-b$nxXdC?4J0Lnrv7Eee>d4ko(%*6HpqSkyls9-4o#8 z!aK5twXlvPmK|rqXtV%$k+kGy;~xek2G!%LCj9^*0C~63}uFB(p16tzWjLNXy+6} zfot@}rww-fY>$wr3U9^CC0rL>7!O?#Pt9OUQN7ld^U$?|EQRjQ(;8PcNzBRU0oeU3 zw|l1$ZVfuux-zLCr}%xU`9rGtjw_>m%v%P6CNE>9SkofTDTBs2oD&w!(57J{vLjtu zjv3%3&fPb_T?hPOK-UO&A$IB=w%#Y9@<(9VHsOiW=xaO0Ya%1>x!d=@o1DLa{v$y< zEK)2H`=>@pV*aP}`9H+X|3lIgaCb81cW}^m{~saRf9X*+&z@}rv7~_{YX+>1>iq)n z3cTqO1b&M{w@HC=h}K&Bhk0niYr^(1%#g2(vs)$`jjTB4=5ZvQ>Tp+44O+%?yWCA znA|uW1W5~AiW-i$=T~#nZkWLtt;(*)iz20R;$$OSJLWX8#nG6Aw)Qs2!jGf9wo~!T zSYVk=FxX&Q=)#hMj|NQYh*Bt`j6Wi!!fLzS9J)s5Ql{b3MwrdSVfC5Y;Corw%XZTb zW5^)Zg~PiG>hlBwf783j(&tRWS)N9cb%;b2h)52P!nKSpv#^dtYq3}sQ^y+~q%}W5 zo0|PjUsJLf4OiE$-pMe4hqbhY&k!%FggI<~UkK_dk_ui(^XUm*cgkZ-U<{9J;}u04 zJ<7*4mzhi+c0nFwuyg;!VC2-ojze;N$YNL2f0H>&7EdfhX6)Ur&fM+xZ`yuLRVT+Z zJjfF9W5mr)Dpis))!={;!DYC&j%K0H<4s}Sc(;ws>gd>@PGlIuRd76|^gsdA56X{2 zv#IqnuX1o|Z5~2;_&}y9&X_S~$ZGqfC*l=qDm4<$rrh%I7LXv_kWntIOWDU`c0HDG zV3eE6ny;!K(7;*SF5_3dN`6i{R}SZ9tuiG}X(@S{+SAyic3^2WN7nmv)!DW z*C?hRCY9Av>kLj439nZjun0~}FLb1d&Sq)*(=Kf&hJK2A0$3YG;DKt0 z_%6-ROv?t*wpg(b6hXL_L;7O^U36z(Yyfvv-xAqx~5++98{5eXw^s%w7Rfozb|< z0aq9HW4lNK8l^0=<&Rtc)1gEsA;*HjMU|5dTgIRg4n0@R0Z6O#NY<+g5Z&o%Z;P|j zzA(F z<#r2b`oaxo2T5^zw$_GXLlDHNQq&P>XN5itnuB&fJ{m#l41LHL2ji1(gw3avD24*| zX{F5v?U}NuYJ0uDLtT)o`_MMn=(DGr1!6s6tX}m5bA@ZoKDL=Q)H8?GZQkde&{In5 zY%If*=xuC>N30P7U0X|v+$;|Za?R5XflUh&qI9){tP zNah$KPkAdQ&NlE8edstcNOsdHXkV>7Ajmow9*EbxxAT#4#^HJG-4W>V{b#M6alrah zwJF*6-t9HqGT_K!+0e|WE!q}B?$@83iF72@JZ9Th1WMY6Cg7F^EgNU+;6Ix1!z!El zV0FO-koLXhVYTVX2Yb_LpN_$xIfPzVIVfJ>={33eJ`;&hS1rX}qfl)UaPkBotE0R{ zm>Oy?_ibrCf8zaN+A=^vgK|+A<`_j;t%lkn9yYL*0w`@}qp2)3=f>w`0y)P-2s80H z@p53}AGNnbUvOR<%Z>+!LsyXQrlkfLQ^c8xfL;K{aNn>tq9`uvr&SEW0=9Ceu&)3f z1AFUU(Xo|*Hs-_4aWNSY*8@YA0yxcK%CS=%(9V;+C#m*BDUQQRgu14nWE zwLp=h*&_J++LLKcjq1Y^WqI57Fv{Q+z4yTS+n0{Vrs9#3HCQcA9r>y-SHMP)Te9@z_tR&59$XntJ$(4G zf}DO!n-1}!WFSX}QR#=Bo47iSqp5SWTn)nc6N%sxm1xgoTfaYjO97GJo5}K)N%yF` zBGZF$`dj$GBz+LJqDeFb<49tf;rJxI@o_4{111bL;DPLp!ZXA6Z)b2*8 z)0#Qb+~5v?b1MLb)J!O`etj`U-d(L*XXw6-x~Q3P@r1_W11Y2#AxXb5vNS>{LJ)w3^1zQH*#`r7QTuFC`M$xlk$h_$s^L+5B)gH6rk8r0geS9>z>{GhC zYu|>{V+mJ~&+xWx?Muq$bI<+TqbLlau#Ba9G;Cj^gSm32ruDW@vZ&kO zbPtM1?03#|N9YD&&(Yz|9AQt1@b_(Zrfb1#r1TeL^zFl%nc|DE7wvgB#vKAf6tm5` z@BSih!n3Z}M-A$gHA7BoGIi*R6zZ>#bvZgz0OHlgZY7j_Bq z3)K*a#9gie7ZY8UJ(pRDV|;;dWa)=yjgHSbiP;snDxwCMe>z%H`X6PD*}FP4WpN>8 zMEN4;#bpjLS3I@bx)jxKZo`ijdq3Z;5zR&E%J4yzcs1s*C5}$bZP12u7RsCd{#s7C zv*|OC`~05@ng0P$V>Z>&w*SMY+y5Em)c@B)rl7u|nX%D7UfJ2oNzvFz+So~7NZ(2S zzn~9=2?-*8WbUMruqyg)oP!U3#6F!?JNf{83}6s>{-LM}30DkGC09!Y8b;rv-q79t zKeq*gnpxzCQ~+3So2?P{m*pZIot*4nmj;|M)G7|6dddUo!OpN)>Q*LoLvl_67;k;_ zFGKFHRCYtQ!2$(SH?24nvg@Ls$DD%4<4E&Y43pX{nX@flyjz;)EnCHgE6%|ZCe?%# zmbybCUU{t(D5m63PRvhAPDEwXfgJglvg7BZyq&#@5HMp7NB#uL(As$+cfj`8Z_;z@ zC(`0^V?ayZ2_q%S)*ILjki#F{fiTc|HZTCm-?37h6thI90Fk5|{ z)r>XzjZ2o>8-w?r3HlwQIYIIx2+p!QRZNG79UA=tzmQNxVjJ|#M-3PI(T6dbe{9iU zknX7CA!t4d*HEMTF}vcZx$}^}h+)6t?5wJ~Wx0PZ=y?G56S{|p%|enZ;q{eY{(^)Z z>p_;#i?_oT?{jaBSzSp4B$KR|#W zQ})IK8C2`m36tn4Zk7kD>jrhbhEbESDG-)FYh3#cF$?6yb=0#uaenv4NAAWW+g6K( zf5{<0;&h$BGiIWgyKY@f&;{>W8X0qniq_QCP^!sAH?t zyOp(D${RPDnr(5^z(yQgp^s)&udjj0UguT(?n^BgYH30c83~j*c@m&rlmHww{|b7Z zO9D*@o%T?hwQ`NENkkKQDC6Z$g0w0&t$W!pNz!C!NfrGNz%|3uydEC)^Up44k!EFD zm^*|R;W|OZmb!}7S~aS!g*{_nX$7L#&D6Sg9B`zmfqXY*-E`{MzX}f9=jk|9;Kjx> zcwM*W8mQucAyp@qD=D4arNf1+pI_tSn-AI==NMVO(JG>{yv-Zz+L8n{mj&8`@S{*P zQo7o0CzOW{a@;pb5o?zIA9;^F!rNQ;9WSUpuF03 zH__a2%iXNc-u9WP7P8}JyznCshP;Ib+SGWU&if@{+Xz}kPvrOvjmOgy$E?2{2?Y|^ zG4j?X$q0!jy%+@Mu_I#{9?E{3H}K*R7#=es)SK{N5ttr3B4|u{NrE0!RQp6-R#s!+ zN5rl!nSX<%-_cCX<$e)K?c$i+;yS+mCGiqM$g#_k!N!^K#{xW6PTUnqh$IYF zs~2PxiV74^2#80iWh9DB@>C&Q#LtB$jadw?A2AsuX_mry(=7Ta5fD4A5SPur9|fvN zK=5A3M;!#ZEn;{eA*U5hYI6Lr43C|VF9(yM3+}W2uPaARP3~&vpPoneZxhS^|9$0% z+nCt?=Pk8J^qz0I6Hm`=bUz1?2la5zxHcy7X=DmBPc7C4*=x_z@g!BKI zh>Q7sUtq&^JmkZ5J$$q2)*nS?{OGCfF&@FYYku}6pKdC&!Ylq@YMz~R%x?ZoIQ5YK z15Nw66x2gu#?PG>Qjq00`reu+H(x8xt62kc5jQ=aEJTfbRw+*oGn7I?)F(uaS++2s z54Kdk8+IBtyC(AQrUFekcD>{wb;E)vLOuNibm9Rg#T2*?8AJ%pp7uM4$~d@HL!(gs zMjkzZpbru%^3Tu;riZ5^@#aRpD|&_DT<%S|q|D^o3ZB!NwM34Sc7Q+0$B}J_9rwoXB_^!0Sg$2Tdp^!wy(u=_e zapcRfLxm#MwAErpU@_NKTuu$)DCoa-A(kiEl>6k-tXTuI#%pOfSHo~021&2+f8~ieGR&b{|8WkC zOieS!F1ZuJ#|<@#+%m{Eo3Qc6gC1T$V)V~rOUl1FD2#P{iz~E)hYCULa?*hA^MnI* z(Y6<6g~j6~CYD8!5?wV;%A>+RbyAeM7(yRdj}nw&m;$h);JX{GL`2feY&MKQk(g;e zvm#wE(@?4LFZG2o7>%+v)L7~%ap0Z!(l$NE;Bjj_;vI<~09@WUGB>mh^+Z#bn zTh`@-VxCw=EC%LS>e0h%Vg?1X5Gcfi&CmEo%EcbBJ<8lx+a7@iR&`hc@^lj0=FLpH z+(B?=aEdM4mzyii#Z=9L&II$F6x_e`?v-AOe~SKf6)>Tm z8|8;gk;&=hcN9o$!&@-9NJLee39j|WZIVMCFIHn9h6hn zuc)xvNHMekmtR6>*~E1+(*#+DzSRfVce8Ex)9C+dDp6nylv-7S!!xJ{F*s3on~9=| z?sf5NECocEhQGof^N9?s_C|<;CMJ<28Sr@k73yf(X38`=R+b{(Kc=V;e3q8@BUZUX zo!}#;1T6DRU5eYDBS)QK4x1?M9HO6@_@d`C5fP_DNKq1^rLo+t&aVo~t8Y8B|v4b?~-4C4+ znF*CGZcjEl{|idSpMPN=pK0KoO34IW_JL?o_hw(wT_CRHAZs9^b`Ef^vr(M5sbWFg zY)XBs+P5UHaI&x=RhXgn3(`1n70d><&dA*7lsEP$t#hkMnBpohgtr2)3Q$G1w0-xvx8~m5(Ryw=cEHUC zie23dPbdsF0Nru`+;Z$_^;byOx_Qm?!_gb|N`Xr;o$WG9Ci(vS6Z;Gk>sHYG8*N|O zuEY&p_U?IrEa~uCoxWxE`rR0gPaMXe+fdHMI<1EJfJn2c9@hre=p{4xpfh>|7Cj`V zJ&dnF$^og;p2_48E%k29V^M2V=TjbR2SPuP?ON9>>2+_?>d2O>!nsZKbsv#cPOrBc z?n^<^spZ%?tyG^m8xF0Oz)Tju?h)j|EA})K_np8v-TVT(>A_gbeIfoO*AHo9t^YpK&QBb9(P%ylY0^byMVw z!rhwHfHBTcy%gBu8mLb!ibFO>^tuVT$>%;81H67Au1NF3kr+{Wh!6Rw5qqdIi{XUA zLki3{rW~~yJ;v-IRIZSkSOJ1r+q4wY3x6hcv|J=@E_*^8M1#K@bzu!~)mcO8JSz&w z+yTJfzdo*@Cm`sB^|5ftO}((q1r^&o;YHWvvY=YVRP`&3Q;q>-E_%f?dz&_JI1F6# zCw6vbvalns*wt6JYW+vT?x^V%oumCZH?(vTS-TW;_Zr-`?r|)kWtT@c!ey~m8SL&A z()7z&JS(6rGY1dv_ukRmY#!YvA}uV)Ta3o|aa{)qNFl#t05*PT>>iMBZfSu%{$pN7 zctNV-@0O`yD;SElv5%}6Q?~l_IUP@K8BhB-D&ejevNv&;FBk=QvHwn$9Ey5vdq+OJ zPIiTA>E>CTD$;HiZMsRhOOIHQlo{H0aOH}B8HuR$?10ErlFk7J$VT*h|%t+-iW!`gIOHXi(|b5{PgWOnC!LI-#(;MsMg;~|D9rh zN#Q&!vS`axH$TC<*drGG=oeQd@~scNcUEgfTVT2FqbFH_u)DOuW;JJxrlV+hCnOla zShi#RBstp8*eXTuo#YG|rHuDI?rrDBOi6N<3oZ zF0vvqCC<*0+EZ^Sj2TN1XC4Y%ruIXA{FO>~HxbgN+~+R2`U+7@D`+zB_nsQ%+8D+< z9WPa(G3umgo^8*wU_q=yk5s}ywp|C&w;_=euC6;2M8SAd^sVrs@-gP2Y$!Z-`D?Py zT9jXS4067MMfn9yIdO6dJEKiq-eDi8+?^TOy*vxpE`DauQKs(C?jb=`w2>G86kj&w zh!Qh&gEGo-IlEe^OfRCcwMF~rJVDi&h1XOgS4`DlUX)E`|H_mDLq^>v>@#*{e}cMi z(KB3|+@5ADo3W<%c#r}Y)J@1jH>3B#rBsC~`CXpHt^)L~d;}vlC(A?~un#1yv|r6G zPhN}IW%h}w*v;@K&ms(gr?K`@U)ee1rhFnxJ-M+F>9=u6ziw<49{zW^{DE$^%P0RW z+ID=K48yTS$eO0aaxeD0Rs)eO2S zzD6j9T{7HVt<`1)!W#Fs&(~HX)W+(*mAwO4Q66-t7E{QLR)Vi1;a`g7Tj(v7RQ3$d zw$hs19i#hA2b4`bnPq|&^|2xrT`Ef)iavc%qksN41%pQguOaeZ?h^bP2uS4r-|j&| zNI;PBzqSzn#c|vGUaO@RUKVItX0a}V#UfsOSCG<-14?Ik3<7F;KQn3T-8W&q-ZpzH zjDE-Z+||7myf9mz!}z+6Id{7zMG~lI&iZBID0}@M2)FxmoA|f)_sI^>@of+s(oLiu zuxip%b@a<^ck~}S=@DR_MY&l!ZBb0t`PQ=Kn8m&PdentiwKlplas%~&@L*-w96;e= zHj>N?qZavw4~;J8?;eMTj}2u`-NWjMit17^T48Co`d)wn`|V+NY_xRT3eHR%D+X$P zfZ)W(r)9P(+y$XkYdxWnzDWdu`eO^&fZN*LV3tS~r9Ujns9v&nMu#Ss-Qvfyi2})l zUG<+I+&^wrhgYvH$tmHg7?JTOVY#RG0A%D^CP3fWuUMrHc~wp<2xo+9q~o#Hc=X34 z(dJUgkrx5j9EMCEdVt`QaU!S4dE6k;lVCsAhyW36<}H8kg)>6s`!DlY>#$u1TUNX> z?bNqS{nfQSmL|*mo5bScJ#WF^FewHG9WK`@FF{qHIQ1xtYdR-{e~d*fiadvGL7UZ_ z7c-@vQ0PngVKe(J!DS2-)Ki!eVK)1%VU0m7TMPE8{XAP|?2dm%e}CV$5`v6uXj@!f zhVuDslghJj3undo6f0NM!&DX+=z(Mq%N~t?e){{-aLwMP`Gw$5p~i6L!2}ud&E~oc zv#%p7fLaRN8`H867@gEQ^lTOhnZT0_ly;F_(nVC`gVKYr0^hHox=?@rRJiiwjxNDg*}sZtl31WSjGrBxn}Io&)Z&=X3XA* z;+D7!?d>LV%`2^)pKBHW&34$wMiGh0IOl^WhgpCFJ@aZLSxUt;aM20&EXLk=2A*C} zjfJ%M&0X9s+bF~TMRJxW84RjJW{D&C_y=9Z=9wZj=>sH;?2*TB;n71NtL`S&V8gIPM7euEZGsl3kKBzbT#XfdfO&|*MiLUsM1u7 zTjvA%EJT*x;9NTLI2~YSZZOF;w~y-^toj{>h$8~E9*2mh7$!>|vBN=PF~}U^l^C-$ zHgY~e=J!^bPQ@l!A-)XyrRA0&Bdt*q_djQ?|55T*MTZQiW(ERkiv|KB{eQ9E|8qSz zc|rc;l%HPOUb@p>Ozwg8bx5YMYv;Y)DO6^9nuDfahA;_65Gn2zG}2FiC0j`593>6Mb+HwsFZ z%*=MRc2}Cv7QsD3$X9glr}n}3-j(8xF6c*d?JvK1x9qkC`MasVNB*@1>PKd8hw2j|C`SR5++SbNpGqK? zPar-B%otHcebmM7!PTfaf147BrM5Ho& z1@Xf0Q3b+@P$i@?0tHE^=3L}@f+g;@RTGX_0Lq&`G z#;LnGvm+@;ZT_Q4Le+#0%yE{XT9StxgeypI>~UCjpAov``zhhAahToWsGJnOXlX-J zLe&Hg&~cjPfo5JdL=K#Bnqilu_f&+QVy&E^o8nbl!bWuJDr8C9QinE#FYs+Cqcvfd zL=JdyA1HTN`%O8czsBAF{(d8}j~yi-)E0t6Vi!0hkJ~{c*dg{2J=7vKK%gGY8@k$G+)9AQeF{R~}SUIxrXh^pnWWEB-DGH8s8?i@#wP zj-5dC%^Q3Ocl-6#;1-AIt30@4^;zpCj_R8-G~v=L)=3zlYJ7(okVi6|jA|+vQBl0L zc5UJ8zMjJ2J-y5@<8ib9HbjzuQEH4EGod=a|M;Qp10G=L+pDMdC;%Q%TK7)zM8e#J z()5&Y9#M|AyqL16qDM^jE)PF_V*RZUlssjH$;sH|rUgV=POnf;71oeYN-KC9h;n8Pd? zAt7;*qLM;O&Y9&$1S%ulF>|%{_qPI;Jgrw1KVNk*7*6)EOUp_?RZai$GS--ds%OYd z!Ck4#8>hy)yr$sL-;w+mEU73ATiu<}YPfSBm|I+rQ^*vF-_mqsU zvZ$wKNHx=^M{Wz}S^s&T2@U}mRo3@-bTTTqxwW5%aW?77vW9Jwu4f;8J!X@h<;8W$ znu!|17Yl<6E72mcZcC-epPXmIjKSmJ#wIo_?Wyf#(v+Iz4koEcC{wHegeW5)qPPLE zr~$Ek0Ak0|!Mu|0@_H~7I{dtIdY8dMbGmi*vx#a)M;yQWqsluzhfCNtI6bC#q{ul- zKYkmEB26{^tArN-JqyWP#;`y=RcYV4|NU!X3s==x)Dnc!A3v7cWA0Uj&D%x-D-EQR z=LH;zs>1clqo)D~qH=jIQGK%xS5y|1b5iFf-_JPf=(%;{1W-B?cG?Bln*J1jW^e%; zU)jDC8Nk^#6fBGoF_MWU;2{Nnp0A3kW*P4-Mq-)G&9~nUT{pXy&kvOeom5Am_bTW^ zQ5)y8acbt&>@|Cb|7&mw*z2}He9B{M=uw}p$G=shP4a?u%w1gwQ-Tq==4~Yt<-E3PAD!N-t{ZpIQD=Wd2{H4jQ z)wEy4zCdb(zxS=LKqC|fTyj{Vls#MYWGq7CP~N-Y0*9F)=r?(2t&eM^l&gowW+)zToXhN$H8W%bHDl}AbDRGvofRwzM zNJ}5gNn5+Tt)sQC2T)SpH9IwWd^T*x3+#^$LjcX!JQP39d3xW65}#A5!+EzM*XSr^;5-L=HzOaf|J z$?*6A#o;i8Ji9Yn3IkPPOh_%$t|TWY!j*!oZftbv&f2J9pve|1WTbt$4cJ*awINw5 zfp}}-*vJ@hMcZrn>K~xFOjTosI7u9`8QvGw^{c#k(6;75lOd#K+SpvZCDM$Abc$&C zrOlt(P9D=g9-4`8mt?qDuh^hN*Nzo)9Y0I0Sm50@{4=k{kzPsJ@#xk=p+qqYq}B~%cd9EncFD}dh;txok&*@Yd4Z(m7kR0#zu z&4){cTGB8Z)6&sd6boK#^_Gm!cXlU*Mbs{AqR@8}(Rg~JGP5CCYZzQy`_+i$Vnel5s3mLS2&v<{ek=j$+qU>gkkMY9Ng2GPku<#ZAL{-{V- zYKpFcb6!bz&WXTP#Oc$90L;HO<0mfGF3QffP$cexpn!hVa@6x*PfMYsdZ$W4>@wc6 zG?hu|&&$t%04Qyabr5C>I6V0GG=$jol@9OkUXF6#h6V~RBr17bM(`~qUfy8WZ;=*F z-L=@EVFqfg+C=wSimu{n)n?{aGXRR=N)tMQSw1gUbi`CYwhThV_xcKMiLEA3{uUl0 zv~W%~6Bd*Z|6Dn;W%9wFVV*e{qb8Lxza)wDEaVc!om2RHX-a;pY?RI}Vivl44 z^)>A>!nwU{BhVVMtehdEM>Xma#BK?TuPXpi8t(z*9Uu^E=8P(r<>!;$?N5|Du6S^7 zy$lK?vfBq%JaAPOj*dG{%AjQZCGeU2&g>Yo8m@8fI7ch2Sb9g+%1v-Ee$Fa@KVN`* zASBqurU&!hO-(@v9}^i?HZzOClbjM-S@z^+(6J!uXwVxFb+uKp-cqg$P2wNG4Cscf zDRU_i|5eCim>*5*CY`$jvf%hQu5Jm1CuFXq z!Bd?T)v_Mn8Z{DCByh%7N!yC_hQt=q>JFkAI5LZx!j$^zvLr~vL1RQ2L$hygIZoc2 zjQ*kt4{p7s`#f?-f88RUr#BDT%D=BvrDl+?o#_|*C4BSwI{=XQ-=_dT0ckVZfC+a zaz*~47Vlryh{4wqcU4Gs{tgy)A~LA}{sr|I&HnT~(C&0G-Kg^^)z)QI6Xs_05peaq z`dt0@&8rQ8JXmOon#W})CYFndm|2czOxuu}xu)K#DI^5y5qW4z&a9=f(lh6Bw=CVT zI9*wfK4&R%%c^;=6_2j?nUkloeOMPIeui7j zQu%&Qr3~s##Xg7&P|>;g&)|hbl5&GF+gln=J2j8e(9fV~{i_;EPN=N%UD|7A_o>{P zLbDW#ZfvSVB)&SUxc7KyU;WtS(bVDVYn1rm@}{}hGGzmz2T@kKsD?*+y3f6#VQV;XA~ zj3~s9$|}J=Ur>UZ)p{Ss!C>N3>r>oLZ>j>S=ht$g}YB%G-37|@vn3#wN zr;x0sts*biQ7EVFI@>67n8`KqmMI?{YsO1 zYIpI<{-^_D&R=sbzWRyc!|ET7z1l6bYk%!aYok3@A?6)DAazp4Ya7^{yIk;FD}52g zs2_2C^!9a?_|B9WdiN6Pd@|kxMjFLGsv3UR9fo(6HT-V)jpij|?r+JA;guZq?4H~` zx=D5uGxpKZW{5ko+Jwf4`o2MN_;dyaFtv>`E;) znH?DOJ%gy(%4T8xQ!h8@50Hkz*?XwTvi65hMnf~?$XT4J_9~qSsEDLm}ExN@9Z=oi-NIBcE1!WY;FB;me505AbG)ap z6+%6Od@{M%t3pj2Y{MS|eCR%)XQ{+J7om$k7+0ZOqwn3GTp^24EJ2q`o?PA~ zu2XfR;;l=dKv;1(9ivoavWC&xoUF;VxXiN-+5Oyck~q#B$saWBV%f@KjtVyz5c!-=ltPg= z9&N46salV+OGTH2jZ(Xm4aHp1jeJ7nh<9?U9CvBziH8JNUV~UFF^_4Z^OfY0fKOy+ zH;?Y`1T5f-dQY;W>a#}_k&^nP_31^j5#~6Z@GKdqM7|?? z*d7_8jMZ*T)o!XCI%HEZ>%=|sMzE1@nM}X|*brtClsNF5XOKzrx!#ktwQ0an(^NOJ z?3|^1)ydw=J$c7nZsi?*X4!M~(fc?%OOBMSlxvJ`QqB_K^KtO-P~Lwt>Nz-N(M(<~ zM$YP}l#4uALhZCODV5D!k>mcSp`n~I#!S8B$2uuli2A~f^uiq|7-Nw}i)J%))QbsO zX(s@_7z6$!@-r6Q*K~>^*-&#WX}8ENsbrkfNVYHXXySGv_zEZ;4yb5~zG2&CKz3?h z(AU}6u^vu#eQb*Q*+%$U7dj}Ghh(pgQ%(%KpEv=ZC6$G*$Etv3Wxg3E*GKjj zssL*Kh{btBVVLe()2@V1ozq_`XzN>OvWFuHu*GX8jkEI(()n+NQo3b3F&g93@3uWr zGPhi5{8lFw$hBdF=rtjEIlVO}H;T+B#^E$Xtb+&UAVa3W})g`^6oEw?HlI*WMf7YN=YYQ{CjvhJv zd0ORe>&+rX`;-I!15!$L_iSdIUC*KkMTqC2T!lOBy{LrWfwjT**Nw!d)Zd^l>mG%} zRX%!e@Y~_x#(lpyck?obJh#x+&*aT20@tw;EVJo{RJxt(r2A7&32&Ux+^|>QJ?acE zk2M(B1&j0aX*bhFT$3wCl8cU6}pZ%Pt_~Dmx$%vPrR?8 zcViK?R5u8pTDf7k^U$Wtrvo`$z|H@%qjmviMeX8FC2C}SFA02hAqZ;zXQ@B|>WvxE zi&9}#&qE&~t>Cm}P*|*z}Zu7YM2DABnzp~S6=zgUM9_(clY*064Ai4bk35uztd-KaEmqZ;5VO&QZBRu zp2E)A=n6ohLLZA&gZ6r{_AbvGZC&|SVnY40$eTN}{w^Y%m^^&Y?x$B)ng^AOp+xLl zcO|a=C*2-{_F3hjdK2uq&3t68vjiF0AF`9kXB&;!8LAyvM8$`t z3vZorB%##s@M^jDjF=k^Z&NPJQ;KJo?%TM)h2(iCo#vehQFKtAreF0BRr<-Pvf&JA z0T4rUza6b7h@Xm#D}@mWxO66nJ{4<#SxG6C=Y7QE=pChu#aUL6-47bY;?MyPZ`#|M0(JX$-dD%Q&9vzZHv-Jm&65V|tqD0zCw&7N+E81{te3Qn_~1yVu68 zl%RA9GZ^zKWiMuy)2xoj&*7lukJtL)v(FH7h5L7B=L4=v#!P140iIcH(`SMh?m=mOpR5{qN|1`CO^u5-IKIj-~+YL(g(hWUN zU7q5vFri{ZrBImABaQ7(N)Zwk93msXKBNX1ORySJOmthCP zv#n66;9~X)ADH^7p%*qP*rji8Vg+ZW`lBXXZT$jok6?xVLX)9NNXYd6rsC>~B6=c% zD@_R-a2`Cc-Vqc>Rm}%w-9AT(>qhd83+L?HBe}GhKMbr7+T1ezvVU$b%LDCR59 zu&vg4F83uIG>x)yA3mIDnY8U}%U)d+>}rh~7-r?rAGjdWww)AIr+Tzv z(gKmV0XBAV$os{>Fc*&fI@F6SGl#tx4M=9y-`P;dUj#ah1{k^@tN4~_$9TS? z?2t45_3(`I=05-NAl7?N_kPVf$9nQD>H^xk z@KLONArKD|jTv&`6QA9*#t@8oa^aACIqkMxjo6q28$DUqdk?|YzG!Fr`%Wme!LVLf zS$lFjUcUeM49l(kkZfFtW10}0DQKM_lNt!m$QCZESt9kLyfoTisp{meo%5aX?~u0xSBD zz8T+>blOf5QcVI-c{a%*5y<+<(VIF(_bpqegb@hi6u>`nA1K*tEm zF~s*GIg#bfyTbEuZzlsrhi(=2rM~L3L^J3cY>;20DT4ktd_r>M}wj< zsh-rof3MA^yoI}%*0t{2PwV&`g2Ue|&JxzP*?aIUZUtC! zx4z0f8IBew=Ig4K_nG7bOxQN^%4(Hd65m6uLMrm@ix|h{L#*yi z(#7g__Ojz*Y|2;RkcU;&l1;URWh`7hkzcNb#IXHI2M9poX<(KPBa^EYlW#2W)s=W& zf3jxYbSIU|21%j_12Yt)X_gFb;s}SSR7es7QAg%-cwb4mR|EbbRbQJ+Z`TUL`xDMR z<8wP1gvP&3qH-4&XdOnMQ4z-AMhi;x%{eBZ6NC1#o_9&L3=Y%wwMciY473xO0mt*v zO@q=)0PD(l1M?zt^6ph>dP(o-g3?3?;w)n|X?Wjy4Nf3L?gA{(PI9P27~g{&3>cAS z0pdXbD&l9$Tt}C~#SU56-FJIy%|cZAWbU}Ljp&`)I*fkiFTlMcFhaAZ#R$8Sj-3sW zHrCIOK_m_kc}8HmS>$IiA!sBr$%!)@qpMW8K5)=hFRFVC(io!FLLVXC+?)sFY7lkt=@m33XkMk(?Ub>?{Io!LLu32 zY;CFj$SBv$+kg+suA$$c$EVh-um8UG;6!~D8sv^)Q2&-f$6%LM*FZqp2$5eW(?4YK z?M057PM0=e8D__bkStxFL1j6bEZIFG;4BPxAO|!3Oq(^hJ7nvhoDm7NWJB#B&E(LM z>6eM?ErqNI1_s!ehRhYl<@TU$#nmWl$~EM+FTR~v*+O9M2R0ARiuJ{v%LY}%yxzP)&I&BD<<;a4|xQky||7`2zo|22e5Oa@hm3MK>>Nm*d~YOfAL`j?M*) zZO6V=elpgW7c~jxCCyvZ*H1ogLJj6v6~De<0LPx`qZUdY19BAJ37Vz=yY)0@6k?0@ za=HJKC|=APL0x41jG@s0*-(Jk_h5Eb04SoIMelp4FDv9wWV#alfk-w@AcqNHA=1PO z?KWSY;n!pVVoP|)6+kJbSU9>hJPMKXo81a(-*Zcgr-$8I|9Z?2P^1*z(Hqs31+kjAkGRESWHGsrJ+XD1m|ywJ+)jKc zwT-MosB2|jh(9Zy!uRb%aB8VrYa5gUI;5h}pkP@8=T^SQWYVCDT9mlwH+kU?B?yy%=+U4*@JMAR?kz zLhUF9i3j`RKS0J<*Te2?!9fn_vnaV0e0$ubdEtl}@|(bVEd2Ir+`#>%aWIIqU;^pH zkMm@cAcMeI3W>Q9LJGz!J+n!D>Q781CFu@ zd&zZ8ntgMN>UoWarTJA@&G-4Lwr!bY>t;59CZ7w=vemsSlwS`5sFY5Ir&SC_@Ss31 zn}tMQR=r~zl-%}m%>UVAE1n4%W2mHdH!iG(xiD%%p#O`_0Ud;9y=yFuGi((0N!fq$ zX&R-@6VCc&y(>e5?f(mSEmej#U0~^j?7KTXLz)xX$a*Py&DHk3i$L$Ss_*K!^^Eim zWB-VcX{Qc2 zkA`O~>qa@tlBIuCT=qjFFSq$Hzr&+%PZ;rMAraT%as91~w9|Spj}=2qc2V4g7B36o z-H)@AsYyNvt{=lokk%_?n?X?5hH12dAeC!41`NaC<>81tW}QC2T6^{oP*QCDFw%ga zID>UQJniW1zD^bWAx7xu0amX5AJA;v;VTnJ_tS?;}Ce$qGJ1r>%FERQaulPLY zR0>O&K%WLV6)e-7LS3S92RVhJBncWX`oh9R;Z^06bOPF_usHBrJYr119&I&_kLV5i ztC(;0S$M1&HyI#YdWa;Uo;8jiL!H_`O8AE105!oC4USPM)LNPjft?~C;A z7r72I7&h3xi6G2!D3Ek9DgB1A2n!gIIlwSWK>-x`p+iJ|3 z@sA-*RcJEZ2%8E?jz16O;0c=-1Rp`a&p!S*Qffzo&bfPtq5{6h3I9 z8)18!|LxB4;O(3J#@jPUBus%qmhkCbq{zF15wI8ii88?<9(5MK!6oy8h|fApRG5(7 zG;xZP zcCahGcnn7n+j-o1o(z0lyWa15EW zi8{&=w$~weyk|Ra@~ZogUEhr6jelQBbdAyw{TW<)8438(>j}VP4OobFXt2N;#slko^kgmF2$P8%l zC$@TGb*&WHw|VtSF$~;rAxCUlM+7sp_Ck$2q&YleE$BXoHtrK$>0X3nGQt|g?tg6? zcKO!9pnui2&%z&a>EFPQ>2~{S6x?D_>hR3H%t$=Xe8e95kM;Gdm@V?86M)a0*BpNc zEzX!k6K^9y?l3l1Ggy8Ob|<{hiR^*B=-gI|NXnGwYsJ3INCQ8lDZ@1AyF|N)S-Z$Q zVR`n8v(jwXT{#T`I?o}QFI~YF-vg>>)|oZvjb79T&T>T43FKQ{iW;cf_J?0gGK6yY zkxOw1h4dpl?IYUsRDeMD^3mLm6y24YP9PXn@xCZ;8f`+eEYDF%Wa}PNR9rO$iWTc5i$+aBBfYCmSY+ zrR4IJgbW&3FxsyoDehmQns|+}H~<#9^Lgud-sR@nN>%1))B|8o2u-BzWF4ZT!Vd}x z)Rw9;Fw52ll_mF@)GRT!l6 zyzR`5P?wGkx#BsPTM7R#iDgL1(xash$Px+!wHpAVUoJkMv%}q~okfW-Ggh*4VG8x1 zb22Va2}w`9&#t}{^k}1W;teqIRp}X9r~261G8J zh}rza#4@mCD-qHyo6gXrFk*K4^VS6`%D>B|t34H?J6__8k zeX5tp)9^_Ky~z>lFW#I_b%QC>jm!rwD}E1Y&NvLX!O|TusVQ0JPH?G+q<z-HmA|GK@N3Se7@eEJFQaCL$&eKeoFfpf$7QqcYR@ z?SMyZ=C&*k$G->~DOzc!?g{(O#TU98l(s1j-5m}8B9+TPqap(Ksms&!R+)kQc0jH+ zQ(Bfc{pp{M#U2mXyndS9*f`;Ku$5V1(l6u* zUw@udI8mU#&*DIi&ch@$dk0&V=1r5GNB(TTzMpV*Z6I(wyD%u~2DtcKSJOl`G3a?i zQ_ebIk67o81?A;teI0edE*cdx4$DF++(V0Fjt!K#vC^VE43%!)mdYE8K(pV+eWRyRJ0gXFpTg+DW+Y(kEtp(s*;N2VE3yc-KYfxsqA|VY3Fe4 z(otMbaCt7`>Lk0e0Xw(t=Ov`QI2$rCJ|lz;2|-n6L0J3mv=N@rA{zX?@PoS67R_I@ z8P5dh1({5ciN}XS#aBe<%^Y$TpfANSs^Od4*!Ld%%CI5Hmu3oN^59@n=UEj`0>+O= zikT!0)7z}PW-+;Ew>2%VjN{AGeufY4RIRT*dBVn*hlefmaX<_AC|`soJFl|Bb=v_E)jzKHDu>0SSJhopB?f! zHoP%E292l}=GT4$2tw1{&~84L!od;=8n^DUf*IlG>a%P9F};%^vK37T=m-SQcZCTG zbrIGo9lM^j2p^pYXV5aYM;bCB9Rn)qoD z{4+sW;xufj?^pIwzFulWM9b0C{^uKWrx0IgJw`($uF<95^P798*f+U0!%aBYJ$)yo z9xS31$Dq>vjjIG-*f+5r48gd|K*hbz9l2+sp}o%Zz-hH-!4%3%OYlA{yXs0z<=EG_ zD*IO__CP&Bz@(^1WaYN%jL(P?#Obq|AkzEjSErj}Uzi@k;N~~>796?K-p;PL=UKfH zFrROU2S+XH=3e8~q$rFTZhk-T=#nHqKN@uDUW;pS>iV=!(-Olr&G)RWe^tM-=pWhg zp%mL97>fgFF(6=VlYM%lVG=W4hR#iU761i3UlZvM@jpl0^~RIr6Nhouf4d~$5Y$4B;)4V=6N2h3Rw(K{o1SX{jj+PgLo zm_B(wV_p(jOfPd22LfjWk3MGwvIba%K$);jcH^!~oCFWQ zWuG-cn9?O$xg;Im6gDXI|3eOvO{FE=n%_%y$cOOe^~)=jxUbNZeds z^RQwoq$ZEb^lY$X`H8deSg$$YiVKmXWwBdu-O07e9=qWD&7S#Hm6L~%{hLZ4c~|JP zT(z`k$dXj>H(SmY{xtDX_`_}1wQoR?JLGeV7yOyY@=ulb^a z(~)ac0i`o&qfhG)#mCyf-dx=d$;KZ^S5C3;voaj@Y>lFh9#U96fmA{!fWe$3N_oz> z0*HG+15m0q>!UOO#!e$AzqW-#%^kVs4J)hD z!nTHM2)10)-S@uwQSq4@gP3foRC~K8(5bcZdRf#1o=GFJ40P4w3zxkYhJ+R3QO zVR{7HJR$AOoG2(0cYEAGV?U&#SxzK*Jx+$uGyUzkSc!+%v?5_Ie2zSJ)jgk}_p~=NN}S z)#kP+7`@+1CA47m!nm?-nfn^Is8%{i)PVohqIt-6|Q%o zSEFeyY+Qjnr2oC>2888k!i92NoKmqA4aZhP(1Iq9?ow77-dGJUhV05q zvm7Gg96g8;`t@)x%zQ?_VrIzL#nFOQn$}Jr!Swq)1VPJscXwxVSx;qBFNQo-%7;|W z8!EMBIUWVy%HkF?Cb`syRb$RnQZTcPxkby`!p~o%KIbw-OHAIxe)ogh1PR#a1wH89 zjAMcnO{>9o8OEs5k-oJ?v&bh9(VQL&k70}ZE@2ro?m6SnFaP?LcB9j|qw!gB1g?y7 zjAdo46)?%b>KC3_^ADYiHXRAMJ<2)FJPlbp8AVt_aDZet5f%Fwje+8&vt@{QEX|VS zyfl|z_es!>%Qd%rgSl>lxv#_*W6nWHjJ|36UEA*5BE9()l43azM^Y8DzDkhZiXD5h z6(-t33kToC#1tcMmEot3zn?uYW6skAiQ`sPsmfsB5X~fc2#bDgf(mW$eWYV$ufri_10JEz z%R@f-2FlkW_r{ddHOg$uB9^LBw%{yOuF4Xu{yS-+-^(1uxM;=pn;)|>4~O%*MWza2 zm)0>VeH>~Jcq~P88Q3;9&f1tBF_!s}nAA$1qh&hz2CrPDEfC?Z9IVB+8}TW6#D+6S zccNSsX%aDbTYo3a6EnY+&KtGa1gsZ8$mfo7b@|NMiag(j%1CTC)Y zV;jRq?No3w^|VQfbvu@mAXXiErEv6=&oN1b<8jqV0bL$aaC>!US zmau(M#)|)hA&k1EdcWN8KlKMYI*mw)}w$gEw_<8@sr;; z-{gD_c1~V()wl!!+Tg>htOo47eP#Y~3rxz&)R$6wM!RO79iT3o zo~OEse1 zA*=D)5X^E*Bm0^*1K5KT--0hUx>>)MYL&^X(Vj0*DC9RW_Kn=kmueO?q9s2}<~}!1 z@z+Xr>?b0L_M~%gS3S)$h8=T;B~jze_!Ax;qn$&N(ZP+;GRN>Y3l$a+?Ye~jQQ+h{ z9Iz&f!Z@PeE;S?=NQ+iYcNcmXRH$S4nZ%9#wQTr-s&#VH(d&)7XS%v{2OC&4(~{5b zSvnPA`b_87oN~IoG(!xD@OBUMV??eRaf-i0frT#(0Yxqkq{LCx916wGL9H!?QaSWe zR${|9@D@JYN|F4e&iZcAsAMn>w)4pL{58oVvvaskZfCF&WT!x_#adaS;Qb5B`ty4r z60f18Ha{p!6uje&;G)Plu>>!BANZ`(_nEDetAZ#(aDz$bW=iEB!2V+_lu8)+FjR;B zfv?~X7x=-uAlRbh<554jdh1#Dw`r@+l-(}Ggnd3lO9S#X58?uRaT!R*jVM?D0QAJH z*s<0^p6-W#LdYU=+j|U%HXQR0CDAo>+bI+|cT5k%cj2lQ1DwC9FS z%i5a@q^Sqo{rg{#(_4-Tjw9+XUtE>Hd?EioI=-xoU0gq@TERv2;>XywJQu~bqk$*F$38!u5(k}Nd&N&TShY!9$^kJDu9=~%lW=5gy+hjT; z*9aEstg8*3NGN>uVnI>FK)Pc)n|AsF4nS12K8V2keN01`(-QvnHJ2!R3h4MxIn)Ys6AEhU;xahGf}EGw#S8 zJL>?TFHnI{qW7GThOB?`h}T_12_12ZDF0=v?7C=r>>Jptfx zfP<+gG?*S>FnDDHT4L!+*>Oi~W$Vh>na2Id+Cf5eGs)z=ee;K6nkV*>|M?^1=Pc*m1<&9K3P>J+izpf_(s+!&iPF6qfbzD-jS1>l-2X zC*mU;fA19uI21r+^5g@GW${hgF-1gS^Uc~p11YljChVvp#sc|=uB<`REc{bf+MsDx z-<%x;L_@PDbg&Q$f8UiksFvl89IOfW2;Z?ql;G~3xcbMy@amgO!ai0mV_gxbDD=!Lmr@p|VV6ltKf^pHUWUCzkA?vtJ5D zBzX#93iWZ%$E>&{JK0u)X7wa}fUA+Sn^6zOP0WSwxRa)L?2@l+yuW4xqH?B=NF-s| zc!Ov2qmWJ6b7vtWL)mx(XXB${Ox)NDL!z)*c|o)FQ8A`&{Dl~}*&|l0g^9S?6Gxbm zr9f|(LQ5cT^z3m|3JY)0tcv94UgYcwlg>eb>#rv{3&qL`rs{IW@~Sj#P6X*zuSzjn zG4i#9_=EV{zx9hw`~Wy=s;_WK>Jv2jdb+CGw#Z*i80PyY^R4DbPR#hx?a>4I8MSyE zH=8mV#^6cXT}v3VsJ!;&DyB11GYVRKSA9u%S}4cGs!bv`WxYj46%ldubkxC9Fs^Qx7*hx#W`xW<5 z+KJ?|(k^tUykhzd2h;0mTBc#mM%y<(j$>8e8 zx?Z%#M^cc&T{EO=9Lg$*wHxR#6@wG|>#B8X{p5G{2=X1Qn*lK*45WojY}u`tW2$yk}9oo+Fu$^n^D zAzsjS zv((5dmNWn0SqkQ2D8n&lA}4Yaf!amaBP3QEfje&Iozx!r&Ve>nt#S*~UQ;I^aR5#>ya7Xa$7-ZqJ%qE*V)d~3b%CIgHX@aw9JPNXCvwl+nGXEKpdk}^12mu2zj zidPA$ym5kQShEK>ShZC!$>rMWb%xU4`O%|fEW}G2w51j-`BW4+-`N zSG1w&P!mQ_l_)}4@JwAHCoAS%#IEI1of%Z>AY{O-8o^2Q8jZHz&mv9p=DE!$3 z@ermVb9&TYA0pU>%GqI696MENnSN~YqZDN-D7u7lu6azV(yBRf@#zSnV@3*Rc92Zs zqgD2#Q0_>DSRV%E^~h!UypVoxTJ~90Zu(&sb)DgXp2G@5yo-QBeeNv8kBsNfP$ z%)j@l&^VAN@G3{eo3$}_G2qWq>Y2911dc9eII-9Mj&&$H{Mz?HJ`k==BttP!M1E>| z?Wt=EWG0Xw;-WeJC_sMv7w$DU5Ko5mvBoyaP?WdPn*AB~jX&l1Q!P`?rjc^t8L4Lys7Jn1CjGNO>6FVMOIk~r z?1a6PQq7Q9!@Nt7$QDjwQXaFU1V2~D!VNx3?(2#=PB>_{V6!u$zh1mSWKCG2Mb7GX zM>FM4L8h-8+s1BC_1u%B#rvF8sB2%~$qkv|5JqSHbw^-_%!Fh%!%($B3b7fvthf9BOJ%+6m{bcAd{8CJ1dNb0F zhc8-WKkRuizUZv9N%A1WcSYsp7;S%tww~_oiWaNHE)ywx-xbm~LRp=z>xfc_NF%HAX)Cu)g6lzLyyd_p$S|cBhY1S6WX0&j} zhafFcc4$>D)pxRpW*;?SxuG^^Y}56&!1iQw3>$frG0e*7R`aWgeKl;Hg(UUJq6I=; z5rhS64mys)0YH^|KN#Dw>7clk#0#LW!=G3>crsYr$mT&dNMvamdulhwiI(zWXK$&( z#;v~PxyJApVNC2^y@ANeqJmf2Bb;G9|6q<&o6NkGjuaZf#sWDvugH9qRtq&cOioE_ zuVQcXCNX}t!yznWFg$fp#F$VM-4foev;wyP#;k62Jd$lu(5r)o zL3N5ZbstlfT|e3lkl>GAhHH!9Gl=Ubm%dUwUnz?t14?IXtdNyEJQ3Fnr?LrSAnhpo zMm(9pbebqDu3x^86tb8UGB#E?oQ_qYB%Z+XaO50O9c5;UgY|Nx;a!h%5wP{Lt>;DT z6%f(6RD8okHZ{B45$uJdEIGn`IH8*tYaq#-`WR||W3zT4LiM$dRX>7_-r0iG!7!9B zWoN3=iTY2g>Gfn;clMBK1g)uV-ak^a)zAose?rdBs?N9nc-!?4Mu>efKE!#SjR>n! zhpQQ$cgd{(D7$|`5XFh^I%-Doe{rh~22@X@e{G`N=c$&fN$cmO6>nt<-j&Q{A{AY% zvUbt-@(yENlu7C68COuYp^oqg8)vvVxv3iOmRCk|W>800K^R+$iLjD4SBuF>ksirR zYdhfpkxklPJ2@LjFiiWNP1s_()7BbDndNv>j3%~D(f_(bZJp^-%JF4VfjDu*@H&C( zvMp6K7F;G_%pezQZ}C&7z*7jeJsp%_l%h7Q2D;mKw^i+ryc$%uO>ulPrAzu!_T zKU+r=6M@BUZ|W^}{kChNg&)Joq5F5?dhVF}^-e?;x>GNvOTmIJpH3B|BwV6#exhVM zvZ_Eb8(@A!Uffbstu6Hn`#X>3VAP_RW@Q!f`*F)%TY+bc{q{@(@RY-n4<~ zg{I0rhC;LXQ`GFl#W2$@vUb!>aqLfs&glXp|GYIYn~kR=u;nP>Ir~_`-E?$4$SZU@ zN!8N1?;<7(FNd-z+lf+kn*_4vr8j5rfe@Gf< zXJgZYd>1$Ez`)5p)@&<`k@bRUmqhg0(9R(u*B>oI+^Vv#V#Xyl0T!oM^EVbHWgxkd zZqd!8wYx9b@7C)U$efT1i@3IqQHquEbBbFopUS)DGfIP*po%(cZ{4O^nh_iVfJlnq#Ym5J|M zS`8kGxU?1^wkiPd9qoI)JySi^$W=sh$_A@-$s`x{{6&s%MEXNqbIYWRel=k;U+Vcu zW)5)GS}m9Ocq1ShDk2&tg^M|2x_&p=};S(6& znUu8pgFU6Z>iF0QgdFm4Ja53MUiX?-`e6E4H){8Tl|$3&Fu$N5nMgL4{rZPZi(^=8iPHGPp$3C5?krZN+FX0^Sf0dZ~ z*$EsziVcL8zZpuIUc2v5QC>D)T^+%Y77~(eWe@F+wv=#kV8}hIR$)5IQLv-Owz}&O z+cS>Za1hVym-w3*73cW;2PGvZ zk3OyhT=CfFABbxwE}OJbm}Lw+jW9ET8F^VJD&XOMty9Yj^ zD^cS1lUd@r`c%}YGHNw&_G#9p_wUTaJY|=V1mPp?I|^B8*XlvOJxJ7*VCS981sq`Z z@7qf^Q|(Ez?L@luLL|87`(JJ1BeBE_nYUw-@qqsBo9;H??0kN9Vb?eF2{7V1a>R1J!SUr6UCS^cJN31*}k+0~M=s4Lxj8_I}{$!6`S~vl9 zmr`Kg$2-7fKi3j#BhO0l8OKxNQ;*`As=K!cC*zJR(IIdW$|$l|nls$1g|0{HiU}k) za9Lcyk?`wDG0b(@4+2G6x$XO#1?_=!o8H??(-*rS`XpY>esxhyQUfmb|cNE^mbU0TQ7&^--nhO{R0gfjw20?$p<2)5JZJ< zhL1xM?KM1`5RzPPpZZC0_@Otf3?yB;Muj`0D5O9-;2oT10t$1s*zu&=Wzd|LdI~pD7(zLnd%!GZ)F37|;|F zRa9LRMl~Ydkup(qDvcnJN^u0e$L~$LBFjv+c7*N1(VeCz#Z1jLW4~wN-Q2LOW*iV- zgk2Mwi$;Ac($YV@17o~mV1}_yd!u|ps6iE`bfqd@CBnZENq%cec?v7lmbkQ8p&umaW>botT4 z_E+iY?19v2A2P=Htv<_%aizn!jl$Q|^d-!Y^2SuGtoA>74JPbLvN3nQces!Sj4FnlJcsiJS89 zM*{tKk8q7b!XcMxKt;Xk2z_s=}7>|XUeO;$QrG%S9aKPzCZjcZ^B81>!({rLe z`_u{-jY`zk9Jn>3I;RMFw#K{Lf9E(FgSFcJ3+dj{PT&(3w3(Pba2L!N9=W|lhwa_# zSXF!wR$TP^xvqQf?x$H?-KCN77OC_cn^zIk&mfkU5=K>?^5wDGbU8fRnf*E_Nq z`wc;6!QTe;_neq8J^rfktDrVPBCW>KZgfJ#iZ;E8Ub$<013{O zRZm)_oS#htrYj1-Gb~EiB`gZ(_WL%*WBjgO>eEi*z_cLHODO$jIfwW+7Td~TNyL<~ z$_ZkoTFFQ{ZM?O0yc@^X_nY9?O-hFsqU-rbiR0(EyL{?Vk{4Ehgb-=sv1P%TugFw^ zVM6j9eFNwtao~un;LTTxbM{i=`8nV%>*I4p;O&wMIogdZi_D$1M+-|nOz3da02bSH zdm5FBA$cA$j=Ln(@4XxesgL2;I>Y^TN*JWRtj7qk`vm~~7-2L@br^5arkF&^ydq%% zelO5_9+AD#^%TDA7{zNqc!1v{O&ry{$`fV+Ci;Fu2}g@Ugdl!XNa|of8&fsP-R3bb z>+{n;f#M}W=2JQ%;b#D==ZQfm?}9X*y2nJh_#t95tY@rBM7E5F#gE%9nbUK4)npI$ z=~K!~+2&|xRS&vNah55EE}iPJl+aB~mqjJ)tPij2+i=Ge1xL6*hF z>UbKK+I3XjtAS0u{p@;4*jiZ!Ofs&iCGF#LPF^}j5*eL9B-?r3tn3t|V(62(Izc4- zIhHI?wDoclsB(@a0aQ8fB#*~g>TXrf&L>=el8{zr+LfH!7(0NIZjdpodrNrtMP`pa zyl9kZOD+LcCbKOt%yw8ud0l*;jhW0HJ$zT=3={ZS^?EOnETj#qPa>N=oXA#R(6o1I(@9wWm9c`PFARpU&&3-GuoY>8zaJKG$I#849J%ej|!j2r~Zm!FmZmk7dasd)n;{P_FHnay@=^b~kP zM>xDG#=aP>t#e}bD-Q9w-N(KFlVe|uYihL-{~qi2Dyb>G)`?uoHLO1R;@2{WKO%-L z_+N~@V{|3ZvaTI;Y}>Z&q+{E*ovhea$F^ldC7>e=6d--E*-?B1i{P1H66247s!XIf)u>UMY8c?Uwp*WTGDLdDk| z@~0U@*?C7oN7r0%%?I~w0fBJx2bHusHfxp%k`$RPk&>ku53oIJ*v{nJH7Bfkrne>c zrs(wb(*lEL+e*IO1uV9oIi^vyt7d-br(s-O3ul>=ekCWo%DGP3S?ViBc?ld^0Dgwn z8%Uc*+K2Yqm-5=D_S(1d+Q;_V*Yeuu_A>5Vg-kea7KL}WiyyS4 zfEeF@8bR{fhw|E&^xCKL+Ar&NoZ14cZ2?BMIPL6tt?hZu?Ro9(yA15REbO~X?BDyh zI1TN)Y}f-2&}?&BxzogNT$a^a<7+yk;}kauzy}&Q>bB0_Jv#19eqAgW6Et<$*Tujk z)Ve;$W%C@0JClVaA!muZClZsX0ch_Xcf=gsuP2`3^>6S_wYxG-Uhwy5&B_ZOO1clo zA$m10KFBG)ib*x!(Is`>)e{(dq>&xHw<^k_uGNxm*HK;X*U=ttcu*hjc+ehi`6A8k z^=ZzIdlgy3wu>$Nx2q|SpDC?wwyD=bwks{veRB&oUp^w;ju9x=g059rQw7Q_=9prVdN5}iHpQ*gl+$UkxUY$zamM-w%_5unzZ&{uUK|4J-qe6fz4 zIr39$itepB!Tk&^aDLTCr91XhZ3^ryw;=nOM z@uTec)mwT({Ml0w^$HP5ze_;fk(8_Ag7qaafB0@Js(vGnsyi;A+LZE5>*~9+sK`5v z==n=(gP*H6qjWe9)Z?y8T6mZ!zhHF1I;(C z={0#jYXQ)z57?$B=Z@xFp(S5%?Kdo=OY^ekT*D>byXp^AjW;a2OY>kc1{_AELIOC< z;uiLeDkKt@=%@yJkBjS+(XAHVr`W@Kce=Qb!Mhc&?;l!up8^i+5$NKwn|Pn%59{OL zFstV&Qbzfkd7sh`>u2fWd<;DL7N@&zk_&8Zz?ffrH3aTs+2 zf`Q4PN#WA+1v7z*p{v*oNo!L76_f&)dV6&7aVNqFcDM0>iL%jQWdWe=PYA zV{cmbA;(;?7?g`W1_q;BPa`dJxqO#{LZE>z|LEetI z6wYiZ=i1#AdzXhWNHZ7-2KoF*o#_-QGH@U@-lArIb(auG4qm#sg>a< z@Yd`=YK&@Lqu?Cf3cnvN4`nvmhJf7Z%vt0G9hduX=U$cr#33?A0wl&{RN{$> zGEn2OnUiS=O-=Fzqa^4wWz-VMiehNVFyc)Qpc}F_1l4|Nk4rhloovd_kc&%%^U9x% zSr_GWiC~YFlFIau#Ox5t{t{6Wl1C0$9Jj(0UFsuUfMt<{$r3H7%NojyXcErK0zFP_ zo1+0WX+hpu-jUj5R&*sUjxWVRk}39~;Fa%iViDaPCU-4p>gCz0td)yCV7O zA04COh5xuQJ&CjL6ZFOa-#2Ic(HoYJYJh3_OI|d+xZB_d9&Din66ykr0cy0k)DEPAmZ9Y-nCeEvHQ=`%e5| zcipgEzUBLyfOA*QQ%?eZH=plC+y1lZ1U)9*JJ#$!dQ6RX^=%^a$ZkM05xxv*c2Kor z`j&`HwdcocL@+wRHZSZR8bH&ga|UqTK!PspE$ZUxY2M&FI~x^9ah{xx4GEqdE{^F( zKCd(Z9i8A1?Wr(YVIrGMxJO%*C*-)hJ;>r6encm98V5Z%qixSHe<9@@2u35WPy%~G z6F0y5EUy?GI^Mi!ZyyFMa~2(1%n4^6UjqdrY51HSdrF~a?`Vgq z&VqtiX_k?H7bPiTSqxjYxBg`r2A1_8sb2=Tq^YEG*-e?*=@wz2v+}WqB zzF)_#Rrg&nk2#4eJFm!tIoI{`Q7Z?JJJbxL;jI)kPfw$4TZStabVKO&Ok&-OOh?&4 z)mzlOqn)VxTih}Lb>jt`QTFThwxv$2WslZf&uh1hoy~}2PxpPXYh6H&J44R34<^G6 zem_k2=q>Rz)W(4i9*5WV2;Ej<+n+Zwy^9ZghFc=Nv-=%W{@Bzv&pmd1zpeoe*xCoQ zJ=Gqgt~Cz4+S}=VYadlWwmp^I^Pko*uZmu-WsDDHpV z_GNoIZ_Kv!-ixmdyN2C=_#N`Zc6w9XsBNFOtv|DG9q~l8zV!_8cnj=guflI6X2=*H`kC%!s!}r85N$=?|kk8dG?4Bz>ob4OGXun&(Airs%7qeK1uarfw?TOPUzget6 z`(xBS9?v|;26iwDUIBRqg7SDNMPmpf;?fpGX<_?gTXtYJ$L5Y^R zJ2Gn=oViah^u-?i;GSBHQg0B;i@^QUE(SMJo}M@0+>~um@bFurVLu28M1tZL-gg|i zd0(jUkh~LPp?gHcA$pN6{TAytghuaexZ{r(jC{GXhhR=ke8IB^j_1q0q4e-Ro@ z-0KLdmTA&F_G=C-NKq>15-(JG0l^CbsqXry?HUQ}MW6iRN2iEyv(&eA6nq4F*8xST1VmU&>rKP)A z1A+FDYzJ03JNG6mWz$mk+X|xk+Yz1k|2QbJePc3| zPblC$hjpkB6^K84JB&ph45TRGC0RN6@!0yRxVCVX?QuHud})^G;@%rH0en_n_ls3n z1UEFAfvf@-sA3tY*ZB7_X&UG*=V0~MIeyGdXaPam>^u)z0@ynyo*IH8vU0~!5(H8* zC8~>1NFHL;G7}#&EooJkaD^n}#>Dpd0pT$N+Nj5!b*k^|{apJ#XZ=w2ek$}@P(5ih z)_WwK_6aWRXnKHUUuGpw6rH&}_#H%!J=5z%5%8OQx23(w&SBNO3l0@OfEAE+kIyUj zVGskB7};%+{aZdGeB^*_!=&qKgd9EmG?Q`R7;~v%0ao@>*SYKisi3 znt94aZgPwa4Mzu`V>D}AHOI1ury}Yag6o4VXG>K zW_4you?HavtVPgcRcSr;QL44`@tPe@66Io^JA$6O)%iZ1!De~*BfjPazUX|59eK{S z-S6);uuv_s7wlS(q+ty(HxNmR@a}LqTk3{jYr*Z~vPuIlD50iABTCHD%`7UNZJDwt z=bv>d6evbgX5r(U{*fF*;3AK<7hez+;vS?o9RyK?MH67Skbf=~4?33qC^|NsV286{ zdZ8Xg3>Xv3N}C+dL_5;9JPDeYPB$qfq=R^TG?rK<`dA!S60ErHh5#?)&u*O@4>sys zcYs1}f*tKNv~3v^X+o<;eSTKE^QEszw!u)PSGsNL%XKNzY`bVyBwFtVcUBfS#f9NTb39hI~RjD;uCiwW%KQ8 zMhJ?7OZ<^O_^Gjgy`SJTPW&W?v;yl;*`{_}wP97Qx^{LDf({=f0h=*i_^5_w<*QPD zab?h|q?O(!OdUW5twHQx{P#KH-6!8Sw|tADK>c@@ycZ>rN^Q_%3_6u{4C-6l*1LMG zccqNtp96b?wnh%w za@(c8;q5yB!;c@%00Cd!?Pmi2hB`BB_mie~KW`JidOmBDcj>u&i~Eot{qW^Q6eOuh zope9A%ZnxPh!Y3%15u*#PN#@7Hbv#oz#og7G;{LQaCuFPo&W{?!4cVib3fn-UimZnF;1zi`G|C zhpfTUyXtTz$S!$&N;79od{9S0i$ciQBhNTTkvh!D#IZ=*g@#H+*Xz_cJ1IMl+U>(}gfLfwmXr%^gO2gN3L!+X`!f`qp&zWfRX<4j5>+I+| z|M)8o_uG6C5!){JXN4J7&rVz{b8FX*R+3HYi^ZJ?Rz*dEsRO0G;!r5JJW^_Ew`}5_ z81px6GK}HtDh%5_!*(yJc^1mhAg<;=*_w$`&&>Yq2|!EY+~S3Gj$^d2yDv$Awd~at z+4K?UP<{Ceju_lx)+uV)-Ilg-oq9qkL1C`cIeE&aiXGMRD^(h}7~?>m2Gw9X2_+BM zj5J7uaqAmtxN6+9MaFiS=yf0VoOE6DV}}MDJ@GI?HM75eEz;*?+CtB&m^cyTu|4ET z*GR`;4`IbR%c~AI3Q3doh}f7cStoTfm$}enzId@BJo^T&rF8py7N;*1xUo2j!LZ~{ z(P{iW?t8{!RU33u?F*8@yOR(z_PmE4`8 z^yVU4Or^KF$GRv{U_M?X5e0^4$GR)4n_cS(7{G3s^`MM+^rofhp!e9`bz1oGhlW?M zhsY!vA~&o_YF+gZd;1s;?<(Jy_6U7rw(I(SD{EUL_70!Fre3T%%Tc@vbp>pL-Fm$f z)sC0&pZgvEblF19ZoT7nzK`+{dPnk`5SX52K>u-T-gP#*jy%`vpwYRciFhs1^cCrj zr(`?uVn4I5W6mZI@`g{LZMi~9qTV>HD;Gq38WXW8mcXW~%eulkMX5*&n-UpxU}9zI zucDK+%w5`+q%5aZXgMnN2Zp9tZ;*ap>4_p4sD{I-9ncG;@)#$Vp=q~fH!4Dv^^+?z z*_kJa6lswXwlg$%9qW}ye!5;<;wQO=svTv#Gq`!!+o>8B0WRx77w2;mB#*L7B+K&V z)|nYO!B|IlrEV{`Bl}Z3fwdI~1gCE{?<{?$9{rz!yYp{*Ky(cV(&_Be!^GOU@Tv-j zdtuAB%kf%6_@Ea*u<=ag{kN$FWX11?J>|gYo2sSih^9PzrUZuRE*ZAuq7CK_JFL{ulx09h4|=81}+iSI^?#16cbEu5&_>FH&9WCsChDFmr`2lJrN z@l_3a3ReHnS3be9dALlvz0oV2GY0XkfqBukGHLYy{#iwmV3F!)s~#QrfOQ{&p1F*T0Sg4Hj#x zLn#5ewO_`+%6M_9djjWGdZ}~Lcp*N>AGQ6`Nu{eyO2;s;RcHUBIizOV$lKE2tYt2} zIxWzaHu*9@kCU{Is|qi>W|`g-wYVf}~u(@Y%!MqSjCV~4_(lUINo2HQ@w-Se$*k%dAr;&*od}*Q=bIio zkjsT8W`f6$i!R4fPy5F!^vjGx5E>QB31hBfyJDiOQpk>>wd!OMu{=r719jS#wNlnh zhx`xgN%ltEKN~k|#zToq<@4f^(t7f_xC61^REya1SM9jugZ7-uqpS`IPdUVK<_dA<0y!S z^s$DfuHV@pjaBO`7xYobZ%x!-8Fe1)srOkd1mzxGJ>*vDV5Km5hJ^GQv-p}WL*>7dpkh~Le_$uFV$I$c2k#Xus!!MY5)UPys?&5=UojX*D8etdN7$Pi&Sx@?C}knn5Z#ur_EeOGsyFTOT5r*H4F-q?bH z8TnW0n#qsmzaTeO5M3D}_t?Tv2f#Q^y|Mx$FAP*;8XBfmjIv0Q^9#g5D8)Wa;4e+5 zWq-^JLfK&yZQc6Y!nsC_r-Zdk4bl1S&39oiTN)X+`Kf6NGhm7->4ur|27Bo1wwR|56qqFaa>vmLg-rCOF#abic~-x=P>t zxV@iL2U6Bh$Ty@7WhX6`lq{5Hp`Q+BO{7kzLbEi{V!|8Vq`VSk8l0or!rU9;!1EFT z;4?sn)?6S799l-L54+5`%XYSn&0W9N?2vh`AnC2%IS=SJw$l2J^gUq_hZ?WL25Amb z6-%3M(a`v)a565?B%y}}>(gXw1TPvp&Tj9G)DuFk&t{Uqcoo z8^t@{)uC@MC2IHBej`~-ZnIY7pgod zPVhKE$BeaRW13Zl=}Bj_{HE@*BbE}l>m8Wx@hvq+bpwsnnZQvFC2wnPWP`P5kL9nt z+0Xm#RePtXHc|Z?@K72B#Ds!H4xEGzh@2t>UMPYW!1N;CueiDPA2spaa`N^_VoC2! zpHMR9Xu%H-V1_NMrUhD*?h`@pr*hXYxeZi@Jpf!$}R%e+j7Jf$?*$I=l>C=k)nCWV&Z~J4Ehz{KG(^83J^33GTRa|P%2qFcg#DE7cxf_F3~# z^i29=3>u^hGU|^Qvl}*YV#baE3MDx;;*y{RwWcRH(kUO2v;pO+r9=k1bfQ_%TrjEY zny~W1N+?i?B#%qRDd}RmOzZo2oJ@xd&&NC+OLmg)GoNNkj3f{Crq`9*%yYKaO#1@Q zmxnW^Aj{T+5z`aE0q(BhG+9=NT@=l$+hN`M&18|H^(u85m?2DG(NSSATTf<0H_?IP zDt@|~`s$w8pAY*g^@C{DTXhh$L4X$uVUGw+|Goe`toSZW)m!&z``0uHHU6KQG*p7+ z8(BDcz%6M{@h%lZ&IrrGQDcLL9J_cIq+wiSp&qMY+z;2E!}oekWBqKLC41}CdWa70 z7+#(aUHah$z&C-{c}7O=D{8y$%v0P0U< zk6AyZVQNf9E}Byzokrxk>(s7ks#r5!N?HkHm{CUiEfD>_Q#Lc$DW?8=3P^j+;cxt z#^^3MXDCj&T``=vlqa;pQd%l=R}qsht1>&YZ7osRi@3m)C3SWjj9ETC)R8GfnGiQe z@^3KIj?-d;T^)5Tc!_gUz}0HDg?4rnt7azdtaQ%P9wq**XzIGjfZ8wCB);1f8}e=g zUVg2Ez2t8)ia=Q2zjv7)qS_O|N%`wg&0CMH%fCU3b^&s!!v-uKpqUBR%`iGNr);<> z5i*_Qpj805u1Jm4RkqiLz_4pdpx5s%CZjzsQq{E`pP5a8<%EmhomrP%t5oe%Z%FX> zw!)@|Mggs+Yt*6t;OzOv2aUp;GlJm8h#c00Ku;ukPJk!U=Y>e_^@ckEr18rf7lu|V zeKzy;rbo9c8CoYnKH?{WGu?(YnRX+BKmz94r2$Oo0##u?;>=mnB!w)A&WfmIYPuv_ z2wWqhnys@lOLqHe+myDgVQnObH)da6pLeKuYqHp`lW+{sT55?%x}2>cnh1Z^2o^yP zCByfgoXxPduE+L5xrPKg-TJzk(!_v_v+5mwTT*tl8g13xK2FT5`_J4vH7vd4#{Q9& z7mIpo+efrYmP(L&fHHsl@8#p^z;sp?wZrw9vzd^zaVMq4HV5zd=`UK&k8@mM}t|{;_ z)rY-Gm%9mCo*1V;qEx3jSz11(VQo{`sOqPErSCvEFhxHqMo;eN@MZuGW(JHCUa+^L@NvQdWSY{_jcVh%Ln{utg z$6f^|666sv|3JE}JZ=K!B%T50B$)@Mj4uIhBR1dNV*lX^v_>VZNU^S|uv!x;Ou|oH zBaBgE3}>bJicT1crUSQL;fSIJlF}537((U~K!}&5NxLddnOVieNO1?wD=9zZ8<#i8w5nys(9hkoS%)FJFU$gEL2ojO#O zsDG=ws=*pzV7`zH!c-oj3MHJ;5ta(i3;B;V9b{EDA4Qq~uw>&lwz8~6qkLzrOd6$2 zr%(w4nq;e>vh%RsXU~1z z^%6}sUI!-YrUysy%B(Kf_pAEpDX_&+00rc1B-ilSx9jP8eQQqd!$>) z$Byyge#BcN^21&)?Jq#r;c+)Gw_aT|pCQkUfLc@vb0f-G{-9G4aGxloJU4D>R=^^>uxpNbxPjh>y%uE;Y1gCMbT71-k;K7 zW-wk5Z`eEs6(;__N2+fCSkzIr`{jL$!gaHj3l_o7)VrLyXzQeiSeS{57jjovs~z78(7HJd(#82pq* zc6K=e?9O!nfeF~+4Z((3$E4s0_iWs};bRubZrY;^s)+YV5gxx9vUt_X^_2cH1xWhy z6nG=f5D)3Z>6P&Wu63MzPyLyTE2v^bO0N!nmTfE!@kP-G=Y&mq5F^fk5^}V2E*;F*5F2<+HDr#DUE>(O2el5)(`s8(OUv&?rPUF%} z&O_#oC4Y4hJr9)PMO9G>vPeN2Ut1pVQEv=}(Dg?C%g{}rB35e@;GHr=t5iwR%#}uc zL_~R1D8!m4$(mr4^gDx&`jU04FC!skmDn(;+~uF2GMPh$#LazXksbJvGTAe%8OsZj z9JyKKWf%32L~%s|tf6DAKY3>WU^{;L#_oujQ+j)&h{~^putxcm`Pq1iVONK6vY&o@ zAO&zN!%Dv+-F`dQD7qvu5D9i_(v<3^O>S_|!pAd*K`LVZJQ5_q!ZxNCs*9D%Z2toJ z&ot8iyRW}CR%Rmged)Fi0R%+wKc$g&cBaPvThXPe>5L+dcm+1R#~Nl6K8+L$l#oCe zy8(|#Vnh53n4~}Go^{Q($kEI^DP42*sPy(1L0??K0*jX9Pm&2VDb=&f{qxh$4)f=a zF!wK@KG`yiU0)=8)ZJ&|DlrGrE2h<9b#T`o923*F>;`N?C0dhK^qn;M#djG7)}2gG zbm|MJyM{lCH3%2|7#Ejt6XDFNCf(~UjAn-d3!4~NpVCKCOwpAWNZQ!;+a~5rKGBxD*WVNG4HfcH=cw*2|cHFW?e+ZW@WnL zKn^&!;!LAJnu;$k??9qWrJ2?!Zg!b9-In8alr6K1@lFDy7ig71l%4aHXv!q&Ce}-p zl|Z6TB-bfvg)x;(D|=UxwzOIxiS?%+798OE>mk<%a{4p%( z#_4wy@$o6bn9#O6m2+kZ{*#=9*(pmF+vZV%-|)gfl6G31p7uE3G?zUr8&&**95dk( zjif^>&%!L(v^PNs)hx1_-p_sx=`Cg@FRR zSsS80=-NEf)_3sQ*X*0)66q--(GUJY>HM=3=x~#aC8}>&^Es+5ouhk-+)5nY+R@bH zqi11>H5z%Ud1VMV5;8?Bc3MVL1{><|(4N!E%GL0|+L|2he(G2IPb@e-J3_6-elq#S zB(>^`E8uyzKrOO4vrx}jTYsDtl&_Q>v*yC01u7Jy+H#ZSQP_`Idnr>cly|zCORc04 z`3GUflKREgjsrVUGgXn1wL})*Je>KvMm>s@@|tmgJ@*3S-|^Q)N{TN2Yn#O6Go0<2 zIM7;O=5d(nzh!jp+KrqeE$o^59OpVekZ|+1g(&ALJGH`hVA4pm3dX_Z^Q_{xzrDu7Y`_(xdv{bW1o#CA}IOZ&E;{94!X6(`W3 zuohBny@R(qzLTTB9(Y!c7wC)Ix<`4xIApjvR~d@j&&}~G`~r2j{%_SB`Q^&r0bn4Y zpzl!R`M-ssn5m(QtCOjmy^D~Wp{0$Xk&Wqp?~5pD%daz{e#%H|3v*~t*<6S{1-4lf zc?tRpCL&@lCzuw!=swCKE z0Iu384pZc{G-wGZb>*$x=Mu4%wlv*lu3`utAQf^-$sX!g?4=0AD{Mwp!}{Roisg77 zAn~0DN;?<2xvKm%dS&8VKdG?Eey1J?1a z3WK)oV#)sNq~j38saXcICdBv0u=4AvI|YW`xDfj~6@*iw*vH(P zdgn|k+@AW3Q$LxJ7)A?wB%b$r3ZzIDc-6W&laKtgsxZ@G4Q@mVg!d!yn?;S7#{tzHr66vhC?O)T^yFPLr z?uD>s9Q&p=m>&56EM6TPLw4swCP+L8UxI0n$cuiTESAT;0R%@~B6LF!1<0Wrjl?ZK zLv=L&l&t#Teca8|{q8x*!>w@;#nGlXNjeLBZ zMld+XxmNTv535;dl_KQac8Iw%V+zG82%3ggN}M*#L4-+CFKdu+gjz0zaVs-YxAPWy zC835re$P4O+*Wj!yNn$!Z_DN3-RP4Y$Yn{bvzc#Yw0=8SmD~H@MrHoNM3s=P_Ubni z%HK?o|G$}F{1+6`|A69?9qK=z_zecl+626Ses+hLN(`^@A5T5fesv%+d zz;Rl?%pd!^ff-sPL(8+mc$yC+8 z7`D3`WoKx@nhf6b2Pmep4DVN_lQUip^N%|_w1bx@)uUGWk?9g9NeRm5^5*z8``{wSO+HvDUzk*_ z$#E!jTXR|=w(A!Haenl(b-#H|E7r*OEoWfj6%r#^oyHU{t9ymRd@HywhMO*wP;u%? zh2x^gMdKR6jgpO=_m{-$Vx|$wx)?%d<~!vGU)&vY?&P>axe7$$lZ)831v3$&l9tQ% zlywF|NCJLQt2MO0qWzICW9s5Xcd(u8g;?&@4}Up4VIanEjDUO0&A%lW%>QEJpMrteDY=o-p)VLv@+&Y=Fb4XpI2=?lo>)_qvMg*X z>svAmyn-(Cj%sfhI8`9w!&wBNnXJXDUnrYRW-q2PIqcou_m7wDfm-Hj1_m~vWvaBx zmK8=q`8OIJwuOWGr@)zQc?~t5+atRy5_%B2cNKHJ@X$sB&6S2XEl{tRRXh_pal&Ps zsJ-Zo)4L5;9Ba$IOZ~7u9CPM}j&zAY8M4l4Q1HUS*dK#k494{Wv44p@a2`Y=IeYem z0EnbYxurrPli!4Fl6@NjfLl^iHr#$a#n>Y2aTmX)e3Av{ceqasOAIQ*WWp}hOFe<` z8)&#iMKXrVcP)Pq#iI|1=D2;%AZyFVpwR0{R(ssKQ)y${7luNxn<*Fqyvv>R@nQIP z^G`;KRL+$nV!|A3S?3FMb(vTO*9gLmjBc4#-tl5mq?gCHaK7F_Fx56ETTGGlNm)W0 z)_G0RWLem#ftdLX4Z_M6^-YEB$L9CrtAz!~Jgw`-XA+jlw3p(S3TF+fpRlBIo#t?T zWT^w&V?6H8!C;r`(-wc16s>6wFsoMmvR5!kzJS}vVqc-C)aJgtrt}Nwzd>T5+lO7I z|2t)AcTZ(=kA*&!-L);H=(;uAPgjNXCYp+DcMR)J34t9;PbR+i-|k_0*^odQzVBgz ze*8OU49h?J$jZ{zD2k|`c3T|jYY(EBZKnXW%Kpf>bBOLq2vAFxbzyF03gy$$!__Y^K zM3)-9F*Ec_kUbh#98xPOMYDY>#E~i58}lBP$bHd<%p7ZEQmnA%kGpmpt!^4i^*C^=Ky1Ijzdk7mN6tMHe3IkHoI+ohi)zOae!WP z*@C_uW=C@gPsxUR6mWS2FsxKWT~=Umt5zU&;@6SXkz{eLteHkc{w&htNGzom+q_d$ z%lSp9V>;1EF)WFdhxGP*v+Z(I)4C_i=^qT`^WVZR!|a0&r6LWgSIJSfBCKS|q?QR8 zy;dCAOiwLzWZFoZ4OeY*+ab43B zA))u$3i2RIQFVsP0$DJX9pGSK7r#oS`iV=>Xbm;{p=%PGjHefdISr3sBLuj4-4EXo zU^?ol2HJ$sV;yC;H6Q84t7=-KQYa!zuvZbUGVE*Wt|Z3O6=d{O1&a97U@)A2|wbUEuu;k}2@dWfv5(pD8gfCQ<77%KoE*4AKmrFR1OFWTF zG?Q!mtG5r+FM{e5n%XZ0>k}Q@FNo`NCXq+}!5MW_65wwFXMlXn3-h{-ewQYku(F3b zYn-v--L{ji&LmTx+knX}50dJ@KI8}dUv=^soW36D8~TZVOD9?Xsguh8)X6p`N!-W< zQZOk?XyCi~C0uHHA>8mt)NyYrN?`}5mVca~;Oj!uv%=KE4uV;)imK+9Wru~bbk*j( zJoa0eo442d1OmVp20Rcbt&L*_gFo4#WH-i1VmisK$gh}83i4sC5wO^CYet>`=)QLs z^Pm3fc!zI+;!3ZZw?oz}CSEK8*pU)WfqW@F(K(E~75ahBVprzNIbsWqo$-(x5@45N zx&0?)KK*qU68c?fu@J<7eR$qTRJ>u`+G}tnzuBPBlyM;NO6kL(*yGUrys;yrziaeR z@_0&q#rMIC2T$ZVyc~E=&t+~77Hzw%p-RpNfv^SUO20Ue4KzsK8^{fRXX*HO;nf2KB z+^z`t`hI{Lpk!0qY?S2%yW%`zN3Jl2WwP6?S}-Op1jt|`U@rO8h;LbBbg6AQ2ps6C zi^uPj|5mhTRnvw|{$!PcAWqIQh%+T!q=1dfINo_Tydl3KFIUlHKy&VFG;n?F zG0?a%C3Pb&R2X6iQcxUvWJCCEhbZlw14c)Z2n;J1cd}mto$yn^WdG|D2SF0B8-Aqy zHx)7T>);`prK?4WZv1xh2JW5cByGO>tW3J=-ecIVz=ys3+Jg#O~1G34+ zX>vSv9#5Ac@wR1N=XQ)4BCk2m%P0LK@C_a2VELX|XUIrQIWr#H9%?dJgJ`>8jCysl zjoG?RWU0x8XIt?dBx;vr!uA{!L+)(~$L<*q_nD8rouI*&hU=^-H>y&D`3YCktcr*EXNqi{O9=S|;pSKBSv%>7+shIa1CgL3%9@ zpHv3q@on?xGo7h*l;O?|M$PXoZ#^lIJvLMWi@CZoqA*^OkK8-D=U+U=qx*EZ2U79G za|(kgq1@Q4Z8Xs48r}X96GyXryWV+!kAggmr#t%Ul)9^w8}4ifd25X)cUa~^+OHP1 zVM&-I26Vo{11^oTx2#h1oS{2tGeX;dUQZhk8kHkIK~l!hEuV9$gj+0Zvi-4|p_IgY z0w0bsJ+hZzMTNhlG=WI^jj#?m)g3c5uhbk^W^|+57u!U=Layu*b%(R5wzV6ORck(i zjl6~a^3)XHKxvAk6SA1oDS)3)P@ZioEXW%_IU#cyGwjn}Aq{3xg*0;xa!Z+*Lj1;z z5csbLT>NQE9pN`-&Hol=9RI>>-VXVDtOk?@#zi_Ftzt>4vaGIYN1K3=Txu=Yq)<`D z7=Y8FtfAxPpqX)3HR5-}AVVrf5IyUgbUPz#@!N`HwVUNR=lkBj@%}$50jsj&_#roF zZoBeXTfAa4i?%{`ch`+YMYFMNhuR^Ee4B~gIXDE~En@?`P!+GUFdw82coE`@&iw_S z(1Ob`Lmy7O-lwym!Ww0Jscj6o6RBP{To1TFeg_{8@3A`d9w2Lk7pPi!;pNI!VWb-c z@EEznUqaRsB>i<}ojm|%EH}}cKzF{01DjKa>t7HxYYYh)cOyXHg`)35i~IZac~ehc zkJ4TT>~2ybx?HnRBA#Erkx0M@&dV52MwwTR<#LJibKC(N*MD-|AbzfeM@N-qy>&|2 z*m6PPI_^-<9$l+hLE968PWlI^f>IS>xqVq~yTygDxbn{5jn^*Gb;%-PHFMv_E(+3GFdx^zKlY8r1wCb1;2)B z09nU|LoQjU;jR(eSe4+3wQgD}bIaZXx1)W?QC2Ave&k_2N7>VNpbABh&{~6y zVEF^f)aM;l^$PEC?^C3g=1%_yW@SiLiBmZ;ACt+3NM149AD`&(|=4NFBa@iA3w!FGhVK=Zr2H@VGEG`ta{sx?P?hy?pu5qpWbkT3i`Gd~eB#LO4!`{#{ zo!1hmJ5#sf==15~_j`X=y7So4lGnk;ejQ%7J;%0Ufff|=fgLK8ZZ?)!j>r0oL#12( zDOsfAZb5Si(@8rFoVW{?T6{NgoA8plr=h9yjVK41otEoCg4_V zzF(AFGIUPa_dDNMNF1FjbVT6NeS_~x1~;zNr-4QmJU^D3-Gz0o$eO3rA@r~pQF8S? z9)q*Cyl17C_k#a=sQKi7FOruyXMGr$17mHZqBx=|*=+7-ujWdXu2{$<#3_ zM6^e;m~m+j9Hw<*T9-P698qWM7Pm!Pvvgyil2s^uf&B4~`z@}caD$GeoK5Ugr9}vi zxvlvBF?N<+b%jBe4sh|{?(XjH?jGFT-QBst-Q696yI+D`+}%AukN`m@Jv}`idi7c} z|6!l1I=lA!6lYM8!&}@kgWQQhU)W`*7{a(b!Z))htu(qxWE(d0f&bPsjf+!#R{xD! zO8;L<J4aM!qvV^pjvQ6)8B;ZNKR%zq6zoQP74Ih> zmJvg{LfF554soD(sOZ|6B+-AvOv6v?i-t$FF*;(rj>hV|g& zx2=5BV*eE>!wDu84x{O{x?HcY%0F-^kieu1_F3#qrXli{gVb{DYcIOWQf6vxJ;NuJ<{zzoRB6)F z`zjK~^LX(>EYqc9wXCc7TYArwHfX1lA77$ejTld3(rO7lhZy{$$em<;C92KQZT_Wp zM3`92z1VDGfdG4YIJ%%lD(imBf~Un%3%2j=-U&}qBc?J(b;S!j%bW)?<87ar;qq=x ztzTTwR~D&QA}q3_XC=ERNTY-qJji#>puP_j{KOs8wR`b`!ki=nw}xHzK)?7yllFk$$G`9?h`$@10U3L2Me8KG+x@vh{N=(HvxXIu5nM} zwvS;?f^O8UP}m5o`v_7OsN#p7F~x?RH#dVAuW9_caF=utf~CoV<8nWua_i_3T~S@PI6u830I;tKJ2CZ?t{5drYmziP?)p&Iz+(JYKKs!V$3{LU{oxhjTiRYq zV{!3#{+I7X#u!Tkc_aFY2Sn;V1F$US_~w8c@;eR`CiAAFW{H{zS$42 zl-bYz&o89WyD4YG699f!`p`w*#e^2Qyb)i#uDQ_IpWb`u%v1Z{!wUJ6Mz#11Qb#!!Xk72ASEfQ?A#ButFEl8;|P6GL)?KNKgbfv%%KX06m0X zX;gETYYAN3JOZ}91G%Y|(&|zAoKqMT)>D7&nxs-N*96#EI>;FsooiLu9is(^sA{xn zbNiiL&m*sOksNe^e-)R3*jS2=JJF)-^oI<%)w6NbfT%_L>XgZ6A&Q&{>-HG;0q!Zd zhov_AG_=$R-p$FlWZ%$j{SyX_3=*GTVWNUWHB7l}fsMaCb-aZ-%zQ%~U+nwn-O>j? z98=_KhAA(WR(p}#@V!rIXOQ%{JytWuY=lp)CCsVzN#OQ?}mK-RT^JpHH)f6l7cKL#It zbqDz6w#)DBwUc7jn0}yK(9h|5mE(pUKQH)0vJ4EgSGK518WOjwwpS|n*X37?w?UW`@tS=3-qr*R{WesQ{jtdGLoEpCMxPvgWi7fKqy zChj{sd~-4qk|sD1yqW3`|7oWXW69-+b~mJ{@I=zeTzt)BZN4_r%wfP63iuc`dK-fp zMQnKy!Tq+YJ(i*!JvTc&LRK+|B51>sfc}Ti+M=SsP;!&T;>Z^7`{4DEWh-K@I0*|n zBuVm8#ynd1ou8+aKSuJo1jG1W)!UHV0NG9%TyZw?<#;IE!Ddw$p_0l&8A2LpG9{yO z^?lt2e1lRq!4fkYEqWon_(^un(A8Sw9q!vK>O^!l>zD@s{#H^nW>+rSgoHf1&N121 zqL$+zqFXxC1Q!AuwD$3G-21* z$UL{-OfAJqY+s|7Rah}N(fg(wZ-Vyz+wY#H=JT*n_Lnd3QV{>+p&jS{it_x&qWC}C z-c_Hs58*NvPk?phHeP(UrGCR@7?VP~!60-f(htVXA6gFe4(0^p-!_t4pX{`E47)_n z`l7KRBUHs%0pf$53s8Us8~BJXasyNO40dcC=!lY+=XqGd4Hok$}8KetHIFpN1}jbqofPgY6EwheXG6FHUBln z+U{kS7gPaH&W6&)%-VrU$sQB!Bi+?ay-%OgsuR!p@&#nbE;wE zcKjYOpim0jXYiLW)0n;OZ|k-}(AVqT#61W=q0B9*Uf|EPUvvFM_9zs`vE5H_1&MBs zD67O!q&LSK!VTA_8xRddM;l}fLf|%<&L_&%0?0U#c!}Gu^g>f@ET&hp`^UZjmZESL z3Lmsa7P4mqqk->x_CD|YVa|JxmVm~+$7M+4fv22?KBpfztx~ct)T{kkMSaD6x*!v$H&8%v!IaIgDsI48a70|q$G9{<37gh1Z7TtjL6Eq$VCc+a*E z-rq3pdg5t#&$s^+{VmcA@yXs6Y)?YYJMAew(LL%(vTCX4YFI4oi4_X+%)iXLgvsd1 z0u|-LA#^&q_9cDOWI6C-TUF>ZntWtmqLX0_yTmdeu{|q&m|rS10*~_p6k5sfS{}ha5+hCL^gu%pEp0yLw zY8k^-^3x5#fcgdgT&cSs;r2s9L$9P!dQP#?FSem0M?HKe%4+58RZl}tdEKvPCyq4a z2pMqM*Iyyl<)~Y})|Eb^F8* zW!2xaFY(f}!C9=i-XL*refE(yG==!^^~-99t5CucU^Uf%PDS!1`nFmlg9 z(s3u-YU!LBf}R}0F<^Fxwh-OU4!w+ zqkR|i2?S+{apE3K$a;K5P-+mzs>sBne&+{W!*0!GNA^M+{?Poj!Dp-21-#;$ZROhp zu;_vaPB?r|8Q`7$y8SBD{h`~iTYFh3u@DI7W$yDQ_Z8~(v^foh{0s8@K*(1UwD(xJ z5Sa%Vv@5YMZ>2XKFJ4y_&-ug&Ft@})KRf}utmQ1{ET#3@9`9Ot zduZJsIdp-B!9*h;)NcLIHhxe;2mprUC+gJ!N1M|N=j>PShYqE8qIW~eV4R^ptiNx< z1DHlH{e9jc%tRz_DH=X;XA93>Rk}VnB!d(7aNvS~9DjsYgCntn<8g*L(_fvtJ_Ia2 z3lge7U>kx5A4Lw{RV3*iL@1tc;+`7eJ}NGQdCEmDKlffmx;|J2_XfH?$W~F@6W))| z=be6yYy{-HXS+ux5!EwkpHFaM(87*=6%XE$R1FyvSB)u(xi`b4g$ON@>J85%rJ#PD&oH_02-)@TraKx z_->VlZ3shO!L@gFVyqaxEvU6ptOP@Z0QY2wywSwdH$eU@PvAHPa#0Z;5D}HJjB0OC z=}i(Gn$63KA+mlH`+^Qu*?-dnU-H2Uj1nZZ#obG5>Lp}i!F`*IBNC3&!MHOBz`DjY zj$gF`>)$#^%|&VHj=boBH`T}oePOQ=jiaX@e{K!F*!rx;m|%p>z$wePz?_mC_NLx* z@S%_w$KL;fBtGCi70UZ#w)vVwEUh3a9>4%uM7Gm-Zv&Bd2LbLtyS?Q-g$JkRp}6(u z-xKBC90lNi2(+|JegSG=sZNBgPy&@xtWuf|=qh<&q0_<_YZh zt#bK>y!09;Hk6N9x+py)5575gbIRWhA1;(~VSywi4k97aNs3~*+m^(7evc6{QT@Ul zB@(ko1|BH7k4AFj{wz8FOCDSnA~N}>(?{YJ<5W~MfCbd5a{3oB0QLnU-4`J;w`8R~2M$Zp|#Xk_R zH^af>FE@OjP^Tm=A2Ru$6A$nCpLlb>aloIGFT1KIH~gQ`=K|B8z|3IR59i)Dz)-X- z-!zg7Yt$$bNoYHnyTm@sGmgYz6c`DN6iz^0jNzoSMJuU{#`9gRI)b2l>&u~8h$~wN zZybVC+!2U&8`p6Xqg4u8x||JWNM{?@dNMWs&L=y>guFg$UxpQa=%22)@-3H!0?cc? zF5phv26+=y7UFFy1Z9lt2^N)ni3_wU0w9xB%wc$Hy3|JEv$sN2EtlNPxeMGo*>I+} zk13P!?mJz3ZSzc~SL2~8woDk0U|eq+?J`S`fLm3I@u?n%78*vDj4Sa}=nS?ok0_%s zrNvPu-i3V|J5+47bogzDNXaJTrZkk_);n7^iDjeA=PPU$5-5mcc^;rg)POJAO!^yh z>su?TyIbo`Kl=Oni%XmPIOf*o*LQGrR=3cSbad}C_MY~xWLY-^1d`&SOZ#Z#>YB)~ zl_PuUK0s}SN-xp3m;EdO&<@oFMf4m9D=AP80 zob_#-IGQU91s74XF=gP81uuIpI<5cc576-=CocZ!cdR8h3HLzK!FUbIZ{0uW=H}Z= z`ufY=&%2|R<8d38B;iuyi|m~4Dpo{g0_`Qtt?dI9N=HGDu(13GLpCLJXt981#`>Y4 z9*PriS&^rqd&_3(s5FoF_^b7w8+nJ==^gZoivl9xBiJdy6n^qR=kZBLn-^aeCKaCT z84X^bKYv9S+cn3i+ul%6{7{if#(%iaNpHSgOrXD(V#}FFRYDH`nSP_&!_1_qFeO8- zZYvjajT<-4Tmx~jn#n7P`$v%g?sYqbY>Y;50T-qm=MHe24Kmg#u7+>R-23JtVU0MX zh+9FhEoTJ&YFZY8gvLZ)pMZcrXG2ebfPcfrl-lo!&FPP1)&4pp^+EXd622Bu`UV$l z3P9DV#y^@b0e8vL4IFz|_yn$)PcSZGtDMk2$=6f68|10LE7UhO^xRzw5`?Q53JNc*ysicn4L>q=xm*N0s!MN|vA;)Wo3 zyvsU5QoHQjXjgLO+HZtE{KGi;IlJhv+aN&e{yW{OL&>9 z=PNF!GPFqTe`1XZiDY|H?#b1Qdtye3qF~GM=($eFUFnTpxKhp4$yq4Cg^-n?%xIFh z_F_e&(5bz>3Y0MxY^PYm8cLFm`9W6c;$Ej;heVXtZ*o${wb(?lMk8+^fUB@kT!D(j zw1v?Q5hicUC?>Jz^95ilq%kl0%%~Ut-G$TQ<|>A(j1BZm66{ibRuB!a&~KU{YpIlOOL=63B{QZnarbn^9ljFG#fK zvQj2#k1W|$uZ0Su+%U#xNSqLb0cc+n0Zv3n+USxu+caKdqoPXQvm}msp%##4oeh>i za+o&1R+9-N^!*OoSo_!myL_66gj(Zxen$Yl{&Er^qgIvdx^5@C&5&Lhriu4Q}rG$=TB46v(mc$WOxdwCMA#zz$U;qBiXI*jqaEG@Jselol75@7 z-y;Fz;El|g{Fo2Q+4ZC|<%<>Fu@g~DWT~9paz}R4Wmdo#;0cQ=$L6hB)<$+)oQF;8 z2Q9aW%wkqFItb|tE)Wu9rE+CaH;fXaW(ryqcBH)#aXZy z9#WI=P((OPx+Ipu4apmr>#dUEe=7-rM7M-_4Q!)?W98l1C_yummIi5TrVoRD)ui!q zqJ0U(E^b8@|23w(@MMTLzpa0#v-I7^csToT-))*j4F#|28iMo1Lo|7z*! z=*A$(XW5-7fu}|%B^-(&LV`YAUlU4~M>J&3x&mX;C(aW$PzuWW%nmIOvGI5!DbX-^ zVybIIP%&6X5G9TuFmZ;NG;ZTk(PBjV5YD(G?X!vRyd&{>u%9b+xOR`GTLCTfiso@#f~QfT7w%mMw_?xKu6~Xk!W-MI-F|yMm^mB4O62g=a+G z)XtahzM!h-qZrF(o^^7j$O)IHxkZ?;LCg;kRB#qR>1nn-`rAlAu4uO}{rSqtg(r~B zq*;)$G}Rj&*{`1-t92!N={16ajTdfE$svx{C8nH0kDIbom>A`kn|o|28=Ah=A4b@F z<==_ciuLQ+@w`l&KT2#ES=Y8tzg8#H?w8f^@AOXlxtaxa|Gl6X#j0w}tKzm>8)N#V za_!i+X2<_w%0h{=C)@K^MM(n@vQbs);6l8)6SulWtYQ;W&5~8P%VZDLo;Acw^%p94 zL~3CDQ-TMIRBIrTk!wk>oiuT1Nyv9Dc)F%sddF&f1P`T`b6Mgu!W4E2920^C2d-~* zEI4@BC`aVtREkS6AmYhr#AC4-6DvP>I9|}4hu(Gm#8aydY}_WmD>X^3VEtHLfg>iE z721CTIU&|d_)3#G0a=ULU}i(#qsY_ zM@rxx1P$_lveG*gnqDo}=V83q?mXbuueb$K|C+Y>qH3(L>2>2d6EKx)OUueN+ugIIb*llEQC%$S+}8ASH04BVj5 zb&w6a@>R}-FvE{FRt+h3EM~N#mA&gx)W_TuFJyu6v?2-f`hFMZ!hB&R^fFTu(v8}P zz42ZQxx~dGZr4q(B~kgX=SB}4$i#{-p>Cehvx*j2vatx7CT`xW7qWwoK!bj;V^l@{ zY11Aqy-?WA9rNCT4x^0vI;F416gvbjr8!l=^%Hf$6{m- z7h6(2=Vuyv3j&$0x{*vBANHpF2=xR-yLr`-r2~{o>^6DPCB!XPDF$hP*-Q7eaEild zyYG0eF4EaCTxvbW+b!DxBcvfR%tmN@SXH07l3oJd_3|*>dONg*Iw28+HeJI~wO|*4 zfoCA+(NEu(*(ulc$S5IJ=n@0@ZWbJ8@QQ_wX{o^2vwR&jPBToE>}V7*ZKeV>YLYDr znfQY6>k68Viu*Te!rVUQ99ejx>V#h0M%rW!n3P9&jR?1BZn3YO6ckgO$Fw9dYm@>p zkXSU{R&?C(oupr3dTihzjitji^-8vvdmskFJ$9u1JGe{dhm7lI9?1W@P#k)GKjIh7kn1H+GKA z2t7$jlg2wKwDU3>TmHcavoc%+WXsBk6bCROcuzZXSugHeFdj>QV@?N~mgWX2LCct0oEnJ}o_+MHf^u57}m zuRi4UmQA#I(Urp*yrAx5O8>FDzizmB$ja+DOrjd9MXkH8b*V91##~K0hGOs>)X+}C z#BdPANL?q%=rN)j`YRt+)dZAbRvKM;Y5h8Mk3K~8%#~dHRZn_l#0Oc@h`IuMNJn^% z6{vLPsy^IiTbWD-$djcFzW`a`quG=VNpRZa*KmiDW?CQ4BxL<$j6Al7SJd@qsJqtxhjYZ0?wSnr=vD9-r-jU%)cFLOPoEVM+uJYXF~As_%%B8J3Gwmbc8#!T_OHJl@oaEJxNty7D0NmVf zWGX1S;-zwFE2XIzBC;jCU&zwzGl^H&fc}YORKYaEMsjW=);nlJBj)WmpEVcvxsl*p z!+#Tq;~(kbLEB8gUIjO7Zxt2ahWV-NYuK_eG7P0X`Pk^bsA>eclM?IKUW5XfGrh5G zDKC(`>i|T&Ti>ZwZQ71IJU_COzg|4T^tNb9T_=AM0Rh2K{T}ivHb1arx_deta3VLq~|+27jhd! z{BC=Q3){YPq3Kozo89embsT=8p_c|y=ctT1Kl=wU5lGJnUax&v8a^Tt{H|DQ&Z5=^ znOzlaYXvj)4)YC(7cxzTF~XuNW1!H+lyy-m2z9wANNND5X;P@Yy6IX13TJ6DRZO#Pm+y3u{oJUda*T5wpF%2P>9)($v-*uIV z8awQ8Un#1fg3-z%(XYAricm%DR$omPv=OJFbE{t>0P3{bqIU+#e%N{q`eypnNdD!n zDLLC}I6mmS+M;$|HDZ*gi9UFCDMy?V8O>uuwYXZc#%+nN+(RsFDld5>wyV;gJtw5N zNC!9oRG7u@FDXpK+{0)hGFDL`fSfJ`5Bi$lBQkheIvMuRY;G|K8*Sl(TLkw;4r1~7 zGvN}ZMChA8CUw^;{yB}1eTmoqOtL-!8p$-OAd_iT#auR$xhhqTCn^=X#9~#JD@-p0 z#1t;Ct$EPV*b_ipn3hi|i*^i9Dh*paz+hO5>-i(ixqIq`@8UU)3@AaCU}4SPY`0iJ zkx7ez58G@g)cmFIL8GPApJNU>z8%)q-GZ+ja@{0{`<@;H|A{abqH3F{p9N_so2gFL zx*gCldT@E|BTfpd;>UX-N0P6M^3}`II=!-`mj_&azO;muFjDNW51Q3zP8bS&cNc0n|t3L;D%_JydvOOb+bMjo9o)@chDPYXUZXN4#^)#QG;!kmRZ3m+2n66qe zI-2ZnNMECOpC!Mz19wHjl=Adf%`Y>&l}xzNQKB7i48xzwIbo0YBS@FShMeNe{zW`- zEebncB~wRCPc`mCE1u@qJ?H(ppRzHAfnR}+@lx9j9K+`D+>?wWKn6b>w z(e*M|4QyrJr0h^Velp5Elx9=(Noc!rA@idYr!kKdBDVM=WI}SinKcu_)snGh3u7>9+;LJa5g6N1*kX=ul<;V(o z@@QF7y9MIfQcjGHOKRuroG;VNAe345*h5aM=c~A3RC0MB6E>bhEmR}`NgSSUv_Rer zF(J|&PyL2chLkdh{Tz3<>@g3yv5wc<8k-o8s7tR+Zfi7N8BP53H>o{~Aq1~wvUU`9 z9?setH8g`7|6Uet8&U|1Cvz?$3}M+x+%c`)UBEqGO$EO(l`jM5gnL4Or6AX85urTt z>IJrRdjr3Z?B9avF`4b;>Je=b_(^pceG$p@JZE(o?ZuN?Eq2x;w=lrG&59)v1U#oX zQo@PXzY7pX^UQw>ByUu7Rnjasbp@`pI2@}nkvql z!tYcaV0A(}?cD@&RAJglXVWcb=G?Q4>kn)&VDj{r%o`;2i8}m8L{lLP1=2RS{G$4& z=X)LRH@4C%?0mF&oMdd+y+}K^vGKbJ-`(lg*;wH~{-+kkj}`Zk-}7OzF~dq^P;7W{ zUd;rp3dhmaw=S&>_f#HQlRouae^ib(d4G>|HI=@^HrSP{S@F(1oL0>OI{Z8c1RaqrlG*R`0jO54VGxt$-VMlQq1hzWy^ zr*Y$Yuw$k}v5w%%!J39b>#|5BJt(g`$WOui$HIy>E;4_D(WX6P9_m&iE&$+v!o=qL z(-%w!c}qKd0#EDV-E#5MV|+6d9g97Ibh(F!Tvjdn2kLBRF_jn4n_Lj#K4}FzCX!DtJ*Hn{e^AA{#V|1 zubl4r?_*|;HM3NY<%0lnQA|0THlBU|FS18I;?q&O2PT;WOjz`_X&1}$GI;?GaRl^j z{zxE0%h98_hhuqqI#(FCEPJ^{_kWP={cc_>sXAWSZN3%)dKwe~42nPz#^%J552io( z{pENbs}9^WS~tpL--)`Lxl0k5uW+tx^?SK+BVFfZQ!2a7)Kmv$EwtSkH!jIxRiBhP zv6Q03pS<8a&Y5hsvRg|NezIyJ$XcIdLb9*3uFi(ssrPs%Z4m6sK~ms1N2;>42KdhO zR-$P2A(@{cDQWz5!9L9~_s`#5Sgd`Q(+&IU1%?jKNu9@6;0KKqC~)j5n^`_jY$vC^ zTY0l52+`7>3?&N9Rsh#K%v54L|dvHk#CZQ9T0S?1NqQLd9XYDSPG zI{b0Kd#o{|8=LIOXihVe4*yLyBp>wNY00P|TsD01o-uF3*b#?SQ$oPNR63y}6~IBi zT%ztsy2`81^G#p6W!?<0UOJcRQ}u&*hCxGk#!Mf7q!*#(YSPfN%DNz<8KiTG>fzj+ zVqjS2)T%E%ct$$uhpFM@&C5qPKoxz=)ZGkbU#b1-9V?Sk+4TK5V~a(`(>&ZV&&r`S zP6=ccfWT_NwavTD4ptRjici#)u5_)i1jIA9YM4#H^Vv>p9=B!mN>p@ZSi$X0nv^8Q z6ghe5OUH0a?$9-M9JL%JQ3Vqo&nC~d9mT4?n*lN@Iw6PBfA+~I==@&(O+D3gY|r$9 z4_KWjY&yDBJAwi5kazxDs%R>IP?~iVy(CWLXS~q?Iu0JWEw&QYD$%w=R|U{|6n-@w z^~`Sy$^K>3>%wWCCHo@`=t0{`+(Z0*%JgFTLZ+}2PM%o20kOmzvnuiXFyjp{DFj@t zL=~hcbe@VdV*#D-^$!+AHHsOo!pMt9Q6`-D3a^HA8-;N%W0228@WUjrueKhZgPb^X-OD-D z^C1~~-!=uc+uEkoKQPZ(3gU)tA@9k9${|JpyqL=9?^A5jtvqAQm;POKSGlvV2K2ldrpo;=~ z_d-!Fnyf{q75=isS32WWuO#D(Gq_|huWRrCM-L|6DCcQ`4>4F|X$Wxs| zo%8HY>Xnsx_c;UlpczsJs;-C`c46DC5`w}Xar*I_9*162&z$&u$n|N~6NCwty_Q?W z${lgDq@9bMQ|ip+y7=DaddBG_GZ*V^1RZhywA#AzG^@{yruK(M$Cy*kd2R^8?KRF$ zEAf9B%{$D{x)C_JdAL!V7c$h!N|VWz>O(~@Uf);qjtik9WiAAuxKe+kjLqW(2wrs?0X)5#` zIu{*j=r^Yi`I4FfL_J20WF4tjYQU9t&|7nB#p2D5>vOn}=2{`$84f6>SWlt<>)9jv zi#kwgQdRU5Iqb?MSYH1mgZjCiRY@d2l>RP1lY|@UDUN@U{Rua5eoM)Hz36(p^67vr z`AZHjz5p>AEPvnthkgLOt~CN~A;+oD)LQKJHta3)bk0T+mJ4!$(^W?t6i94}*Fw;# zI;Tb-gb@LVrx{`uiX02t@PX-?g^Ul9Gh1Ad>X4Run=XNqrJron z+dXhVyCN3{>U~O!52NdcHDEw_d3Rc8hBIwf&vWp@$&Kx{O_6*BMo};NbrmYHP@_Aj zRKR4Qzg_)%mn9-ZgJL*2Gh}0JN1Bf-dzx|mo?j4}7b-1pdj_V>WOBT1w0FkVVPnN% zu&46&isE=hxUmLhdngEp-)7%Is_q~G%r465i$P42U&87;!vwxpw^|0^wR*;;G^Kfp z(y^4J!zCO0q8|0XuFVWEy)@mWSO$ze*Ob?NDg47_lHW+sp#$QHF=RL5ZUEHvo8dKv zB?ret`qmPnRYb^iGiSx>HR^+S*m@b_oPqiy`%2X|NO3%jp7^ZiYI+5g1kQS(4p+`y z@mr!>*u@x;EafYRp^)7!`-ht|iVGaYT_FVAFYA7r>^ow8-k~b_BOfXKyfl=kSA-Rfh7u+dwGeO5@muOoALC1&!n zBY!5tzP2PJIrF!j{2`p~m6=g@`l4JQK~aZQ`z=Vdpm^}+N+)c7bEep2exNrH?4+7R!rG5Z-aUB z<{9G783lF>|ErWGo??{NXlMzBB`5R-Hd9Wp84di3*0^1V((*Vq}E$na&o2%QAN0mVq_4q$=J*4uL8h2FQ*a<4ZautI(NtSP4Jcbexe5YP; z{;DCH@w7`cZM2QF^8S*o*8!o-FY2gKKZ@l=cdDapKch`NgA$nzX+SETht?T)?uR(t zcM5{LG`xPl-1oeLEb#`ogGvbo+TwQc2F9!3!l?$N7UJ(h?_|gkM7nPwfHQBjphL;u z99QH&H4x}8-*|0o_wZeo-Ff7kCx&G7Z3+> zOXJB;RPr2%)j7HmMQe;hQcivrZD8z5k+hW=_1pOtLrI=h_9@nXC3Go5ew~7`MZAwq zAvC9es5o4=<&>Sf@)4u3ICXq#O+J>RV>m-VscM5|#}6j$GAnNZxuI*!ialu+uM zdl-u0R;`|akx{x(a@hPEgYm_l{ce2sTYvZ}FymZiil))Q-e_gLiFs~kh4{=t9|gzK zk!f!j=nRwsYESGv_D|2G8XMT^oKU*|a8hobuAc1a_RX_Y9wAp5cM7}6)(Q#7i_yyE z%HYFLeGU~LfA(3#tkE0pMD}J-tP)4&Q@rmEOH~$k$Ev58OAcoIq@)_2n|HRmzW}s& zP3-WI*2Qx`cJm>IcZ>DSv)i+Q)~QV$7opcSeD9gu8~9KVC1M}FRcpf5mmzQ8_mg(j z72r?er0)U4SbL{E9V?+4f3#xx*^Z zWNwm>kLy?uMKhwTtraO_1$_&zSq`_?h^RK#GiyXHq_KnX-h%PYjDPS1op4j**008I zz{G4}lk&A8hYS-!?39B@25)bTAjANpqWD-P)`HVs+d33V)4uu-1c&CK;wott(1h8f z!RU;eXn!&IqPpQSXTzbtLweddFwh_4Xd+~w%ht0r*w4tyr+W}8ymihtdw9g8JQnDP zdVxK_;V~2t+akWHnrTbM+ywIS&$5z4x}nzloe9L_$*h@TY=MaI+D}e=YjVP1dLhbA zpyyh&VeXj5TDwYz%h9aJt!)C!7O$Fc7`ep%GOahdk$lI=4w-dl zfpX>nE%Ea9g%}H?z@*xEtd5`bCg{svv+IgXIK+)2fsK_}2EM8Qqh*wON$w@1d*3TR znvm(p8nDrr|IRXH8_%=9>j9#I((FsQZ^j$7Da0`ur_l<@*7`Ydm-1;U>eQBrhwh0j zFE)XzJU3bUy5KhZtSZygTh?#pUwOcx3-nCPd^A%R2fBPt3riuZIbg-Ua(Rof!7KJs z2TTtCYJ>fy%~u_emnY*LUcF#wu zI{^d_a~AQK^_WLmSlbN8`cYK))NEzf^tEhEV`K$)w-k*176%2QdUUS5i}mjEp`=b* z=kF)D&*xT+mQUHHosAU2LSq651?;D|)<;xRTV_seOUW0sQ*pE%I#wdGilO4MxLEkf zjDeX>AVv+^inf_K-U5ic{`f5U;YUn#eigdY1z9n(Ha;D*kx9^#bgv7n^eh4))8o&o{Q!Ch&X}5I*_D?y93Iua0^xy#co6?2$G1*prp8 zrNeFG>b!lfnx>QU41|Zcgk{`Ub-gw@2+Kz-oL>vT#{7+2;^j0)&YMzJN%zrAbLSaZ z86A=hKSiOfPnfbu@>TC@ddH&8QYpd=up#lh`soDOuN>TF|FU5LU~s(>`>Y9N$Zp7H zV^fb$i>!mcKF~X5!>6i_E^X<1n5OrDUM@&>)y;aC+*OV2vp0tdiMYLWPLxfy4dK9H z{Z$4@FeDl$SV7+#w?Du zvNBsRsIf>pSt1|}m5HFJ{HNAB()qAD%QqO*Btkb~*7J!;v#H)MKR?CKAW(8~bg7+8 zmSM#NZy+IF%4F_^G%vT?rfvcz_H1N`5GiG#GNQ3C2@~h^#K{n(YiOJ{#Y3SFLn8)6 zuxVcUDx>+)f&hR&Xj{Y--x#!FvMTphB$;|^31iK5r+Oob!nlvsw|l4AS$Gsa>2dX(kSw`cJ8XqNgL@u z@_gCyY)F1qMN-uZ{Joz-pHiQpS!zw~J8_HpfIax!ySL%BwpIzKl{1s@sU5uaICg<^ z+OMpt*2zw64r6ed>HA%g^AeskMu%Un;USvOytp{smeZNkhKpzn@NEZbi%u7f$v2jl zmuOgR_-3Q<2>Y(}AV)Qpe7S(U`ayAh`WD?2OqC$k%j`w%s1&=2JH;6T4DG}pJ+79X zQa$C71#!kR3v@xbArVP7-;6SE&JiT{-P+Mzpk zSC>Fhyqjh7D^ZU^9AbH5Yo6Bs2TO}xz%z9qP-LFU1gSh zhA2l8&ZoIl-Fu)};dyg!coHJ}(EgOjSioC2o=zX7(2|jFvW-xA*9pxkB)q>g!4nPi ziZ|7ZG2IB*9_tpRfS5LXaR~V_eoed(b( z!FqOgTZXSld$r)) z{La$cJe~9o9kukrA=Js~wmlGYwlfRFMy{d@34|Tu6$HRsBAPVW{qXPz9Jbb%mO5Rl zfi=)DC$~Q-&u+D?Hc zU^veX9kyvMY?bX#m(*jLVL8HBiz7w?eIo2W;6%)Ou`j@ea+>ar!e@O(H!8E{vbsok zc^#>x!B%AV4S^dXhf0@@yjqsh7yUbj3Evci!W5!Y#v8F>Uj%kHwwYT!>uT%K4SCn7 z{Rge0!gTlvnHfJ3sXPaM(D-2uVqgjMcEA>U&J4{D&MoClc{bFOh`d};n@Q!LjImUo zUnp>s@v{DCtToFtiBO$Tq;3l1LaXdI@6$&itv;A`P%I+;izr~;u-a;yARrKQs@hq5 zm}TV6Rw>;9yZ#D&?Ki5hbQ9TbQr~_32Z(Ho`HR$r?eTsB7OYU|STrK?Vb6H2@zP|5 z>TK72h`8w@bY>-H;0Ah$)}l@qI@*q<8_96iY-Oisi#}9H3~ku;F+6qO_7@Nm!P_Z_~cqbEIGUTXFL* z6s@n-ty&S8e~wi4{SB@MJ^Wq1k6ML;f@&V1#Ijgt;MP^lN4}*43Fgk70Lyp92UHWx@M(UH@*`~h0z7uew6CiybiUXJma8;4?Wlc?cr5<&bvfmuKSJ*>pD7Stbq;nUQ?iZ^>MPN`=>hATvBy(%G7=seVc zhvr4so3GA`cP;}8@^1MwyqkypH|S1%zk6(8z<39o{(bsFvPlGphksmucSXvTUNw9k z^P@z2BkhY1x~67GsSEDDohW$<1sxRzp!NS$3H}g=*Cv_h0|oyo{#&ZJb4lj!aM4m9 zaynkKB|sb2XtbrRJQXeT`_*rvuKqNZQ~Sonp^(HcpC=PZX^aO5C<3!7CA%s;mqlNe zLv)twr&)K7^Fk0YXGETA5i5UAAxlr-L5Ecm_r1!8Ojr+w2CV$9wGCV?U5~Maz$zyV8 zKWQ?hK*H``*4{ynB3&5D8dF)&ba{8pxei!ygql-h}diGEzesw4f|=nMx!;K$e~XT#|LET%8r`FFbx` zS^B^siJcx68u8v@2Zq?>#lKVw`&# zD*FCR%A~gx{5*cna^n#Eg-1bWUotP@puU))-ZsL4=sP(gMF#x&zW_`?v%l%jd#6+l zUpC{RxjbDYe7K}Rhc6C+WUh)oeQ@&+Gd(K{-FhRZ8}O14|YDft0Kbu%?f;iZV%m-7h#=RNCz$O%DN%D}wmq+hcK&_Q<6RAHdL)0nfCo^e=u$9KTndO5Q1^E^uc|I5Rd9 zgIx(%yd0VFZ$DI)^fEdS&6bMaVp!@Rm$6l=j-bW^-C4FP8tf0JUDeWnHhomJ#Yb^j zT@+5#N5Vk}a{=**fJ^mL!$>i`khCTSI_f)`8d6Ga=(k(fwRA4s*wGm1Y^h%}^tv+F zfwIKbee@GF)E|5vzszQ@$ElO)_3#8|Kv`CMj#o=6FZ`Z5G9P@7d0t0(WCqusjV1Jb>!! zL)*g%^nd&@nY6jTm7dn`w;gRahiu)^euEt=-1A@31efnS0vNERyt@G{+o7f5 zWK+WRelQeRn#0|8G-2mxolAu8RX5Mk2NV$g1|mxcU1+&;8gl$DmnZV2VlH`{EzAA* zd2AJ!t_j|7Q}=-*5_yY{O1pz~@5;i7e&+`hrh4UFk5ue+Pw)J$)X_jG55g@FejMRP ze$X9To?V7u-59|SPkWszir>XOl4@XNVwh?p^WQ{4J09zW@9<%67S}syD!thd5;qY? z9)=S=$EPI}FzK!wr+cN&arL-rc8;{yt#M_V!yAfm!L~UPNZJAW*s6vjP@xG&HhCse z=(r{phEvP)5T{KaVJFk7B{Spi7)(y;*H2=^qNQ9EORVpIp?w=lPx86Kohn4+NY66c zxx8+RuEBsD6Wxp(o8<@hx&7I;B8R&?E)79?STEekLo9KAibDMI zH-6ei;0hy%Ymjd716S2~&~8(nB$pRob_6U4T<*Zy1c7Y54v0a|i6EwoHb6n0JFV7O zv}0%L2MAXECyIEFte)kiwrps+tM*B~I+~zD_cB@79oph|+J$r`KoI~~Sv9;qVBvo< zVsRk=)?%o}Y~_Ex0=eKiTKq0e$}6k5$4p)Jf!TqJSvZ)@xEij?r=m=lI#0dO$NF+b`ieG#rd3 zGoF8m!5DH|e9S*<+~lyc!!|uuERG)BblojVXz3 zadADq3`S_VHh3QIu|uz2)zg74vHJ{I(a=k$H^Nq`SNL$zfsRgQ>y{c==1W1jv8=zW{#Jx>1#IVs|U zZa>>;e0c6~pF7?3UGDQNcN}NC&yTz1&XLa*&-3K-#q$FBLh-!FZU18Td5L_fcwXi{ zFL%?gaGzJY?Oi42;e+>4@w`U9Ry?nhKOvsiyX9|ipEtVCo80HkZoN;s@3*+){ghZ| zADohk=WTBO?e6=h-RB){`e)qtJH@jM?n=e`-R?N=am#(y?eAXq{c~=;``qVl_j$kj zd_exZcs?jUB%WVz-ye40zv!;_Bl4r-xyNnyF}L5nZuxy~`Tg#C9&pETP?T5T6IHxF z;r9Ea+s;#N{?l&z&$#>ctlRIG-15)4@6WsN_JUjg%WnFM?)yvbxW3}Pf7NaGYwq*w z@;AiuW%v1tTmDsdysx?Mue;B0y6t?+eZJwQzv;ez+l7y}-1qOe&$r$7-jUy>Cx^W~ z!Ta|a6L0Tjz5O8T?T1-!Kk~di#e|C#djBakUCuOCNU85t?`K*o1$v!AAzz?A!HkWw z_A|4F{?9zX3hJ~Iy0glqb!N zvfOr%mF#Dwb=DqM_7W>DD?i9aYzk ze~}$mX}rk%mAsm&R_dZ=`Qm1m2RL-PwV>aw&#dUl)GZCnDyi$LJ$?R12GJDN^ zzRAXl=R0g1E$`200lL^|#-vK7N@G}oG?tZ0_4bm*OT&iVF z(j2x%n#Y3De0G7fh}|ch#2%4OW=~2>*vrxi_L@}BzDdtFr3UsEJ>QWU*>|NT`RCNn zJ*?^DcRP3&U%S9BarwuYS}|C%>c^9lqOS)Z^(b6n8Hfg zEArn7xKuWUJt_Y~{wIOKsq9YqU(||D0P=77LkB=;eI(JYvWJa-gr1UEEe)ws3tZYL z08o^?nQE%^Jn0~ta2qRqf=%35J$B}-O636aKeC5S;$nxY0~?jG2ifGnMs;Rjqc$tB zQLj`2(m^)mSvK_%0qy9Zh=$9g%}kR{XCtID#nPSNG_OeF^dRN~{ueQsFoRFT6fsrA zR7_RTFnB6;H>-wkD|cE!N~4jp(wal;IEgJj$fk|EZ0og4#y^xZgsn`M`dP6Q6GNzW zDv74?S1M3DNf^vj3>u7&6*He=QcR|l0>yH>`xxb5cw?$xVn)qNOjRBdu@{*tKU7WU zX?mvLk(j2GU|dQvQ`*7Gq@A<`XN&$vI;|*$ZvSJHBC*>FTxYvS`W!J`CT*xbz^ba1 zeQZXxw2xIIsHuK}&D?m9%{stp_p#a4#y&O&>2ndxtCsh%;}M*IU_OEc$XJMA5nfNM z-oxtlv6GN+G7=V}{UwNO(ACUAAQ(+lpueiT#L05yT!%ZItAr zBg1^xF-1C$8Pa8}NV0VYN?PhbNhuM7TQC25C&Q6h@V#}mw34J`z zTBR3RK>7yTB)!TyrPo>TMw>_X|M>{{u!>_+Ji z>{HSo*&Whf*geue*#pvtY_CsZhkOcq+NZHE`#AfW&t$LqEcS-4h`sGAVc++SWIy(e zX20-FWWVuEW*_)wvcLQ0u@8OoCE2$~;=YrlLf;ap%(qM$==T zw@I4kJ40IN>y}RTC8VXkv!oTi^QGpZe@JVKn?}B?iBQOXW3Z}eci*(27%omRt|(y!)l&N&3&AjJ7*s|HxoUtdM`V#?EHi5g8l5m zYGM{HD!Z7%OAfM2vA_q}W&7CWW#?0=%lES@_OmN*Wd&$$@ovVQjY<#us!X(-qE}P& z8rok%kYlRLuElomrQP1k79L{P`52M)mYR~8``IUacd|K8uWyOeNJ#*I%eU- z%I-_2oW7s!M#}we&I9iA^X~IO_xX_f{DS*@7|-3TfTCY?l8CV@d&Jq&M~QplSkXNj zD)}>yGFiGv`hxTb8|(W}9w$#^cZ+8=`>cZ#3Bz1Y;eG!XiuU!S}fIi0`1Z$9G6N;CoVf&i9n`vhQi>ZQs|V_kFKOfAGCV zoWkoq?)#Rn(D!ZMXy04DDZcOcYJKnc=K0?BE%JTW*W~-2FW`I6cc$-0zCPcNedqgr z=DWoAbKi}=_kDNye&zd|?>D~B`+n~>|8Qb|;W zXo^d35R)91mtsD_gdqlwP!=&ou)K(YZBsoQp@QFZaM{;JhpAj}pKKzt` zTlqOES3u7NgcpmeXO7fH@&j!DZdN5PFe}WG5%;hOGb_y5lWw}571valr`J}fXSVHT z#>J+z`|uAl1D_00L0(L9@)A}e*RwJ5QZ_|yU^C@LHk;n(%Z`ZBPUXtkWMv|)rHOu1 zD@`#!N$8S@O(L1yCt{OHx|T(3iV!Ifn@VY#h#f~UPVT-Bv0>8p!X-~|0&UXOLp%q^xu@H_jT0!2I~FvWA1%M3d-aO)Hm&=6tC75q6JUi zDs@ZE1ZB_M%BJjL&u(maZV&qsy+3z|J?~@BvKN|XK2LPBb>{Q4o{?IlRswf#zv0K^HS?VD|d8|&Er5$2l_c0Q->eQM_wNly7zCrZx zZKu0w=&nvl^+$5h%QD+gsZe*2^_Ay|7?EJ|%Cqd%{p_^`B>&YtU7_5|3`7fOG(J_&>gY50V?!zzM&&qeRd38#q@=P7SpJ_yo>Wo=0vLc%K zI}(GWZ_cFGnTOcB?&|}zlcvikK1!TuC97ezv@^AAu6SO-Zew@Q^9~Zr@mwg)BXRz2 zdd`;?(=IKNmWt*U?iV)+4Swfvy8R(@FOkROuP%a2N%;mO@DyK+w zOjb@HEUifE2?Nfjm?_z*7-9R($^vB}os0R>JY|t`BH@mO(j28uIZ24w@geBb2e)F* zsgZE*kh7fxW}%R}O-RstS@<>~K<{VYy_IKXL%KzvdVlh#$Lb(+n{bRuo|71V=>4pl0O4q3~pRZJ(5tSaI-lwuU7KT=V z^@(Sg^^2zi2}?-qXYzAIr=Dkp@{4SQ{1TCeud(s+*V$D08*GmJ3Ohl5l_24pY^nSP zYmwh%A^B|G99y$=?ipu0UuwX-ov`b*OdLH zLa)#cvfnN+Dh%IUOe3zn!YI+tTr$2wxrZ&O8NZ+X4utC<`~7Wf9G-u;jg25eHuFwa zNRLzQM4gd{-9_-YfP<9Dgh`&;efW+Fo*D#+6V)|k9~@+Vq=DdVTus@ZGH*pSWq%fL zs=RnyM!9k>n@BtL6K2qg70AD!-Flxj%Ku_3o%IJ+4S>P?6c$ioz~e zIJ;Ic*!7CVZc&QZ9ZE5~m$;SZl+o*!ZVe5zyX@~S-F#iho#ULue`F;(;FAFf!GtNNdGu>1q(^cB zjSwU8;fJ2wUN=%1jBO$~mzPMkEgA8oxzAx@+}DDA>`-P&ghEgG7y{mcaEQbg*{GUwiQyIN`|pF2(aJi(UDt+iyA{YkY&J{zIGeAW!|Ig_ z*h=L>)}~y*Eh~OAeB*hDq4%J zIUtpnOCxCIa0gQ^RfupTg<>5?rPi@r8cn@aZV-KmUU#!)t?35FQUy#;)E+0o@gkfc z!iggEr&^tq*&T^J&)y{FY>c~0+u3+p%G+3x@@ay(J875hVN-}nJYKnYJ*=x#o*_+DG*msogvA31)OO?tm#O^Mkle?aJ-JqOCFnkVSnT-mN=iBU5WwUa+ zU@OMB5I>RqQ#nJNtW|9fYr71WS-8HFw zZ=vlSw?~>f(@l64yIfFB9LH<>SbYYVt06}zA5cesVwUn}R<8V&hWih8oboS1ivK1l z=`eA}j4f5=G%v7#N}fr)m=`tr2<(Gm8pqMm?#h{lqI9RHvCX}3fLL?#ivnOz-Y*?T zn6KHSUOi5w@fU$JlgQi@Uw@t2&tm zHicEHQ<+~qj!jpqS+zQy)u=Ps9CcQjoYWANht2?NFgK0P=PJEo(2~-Z#i3B|H>e4SBg?3GS%#D=R;=MV{q zj5=6wH{0sGFO--gV*YTU16o^3cHICd(#nci$sq_=^l$Ki}y;4Mi$)kX;vhn z3kxcX>I!!sexb5ZsFtllN*>Sv`2^>flB^#N(R`gv)V`cPUl zy_0Buk|3do@bXAyka&P%b^$w0*-65u$u4C9WtSWxj`IqlFlSM@Lbi_Gtej2d47Qkk zP5C&*z#Pv>GskmMkVP>UvM44XOT^9*Lf2TSLOB=8LN8NrZ9sFznKi>uLeriDx zh!!V|&R6R!A_~^br$2LqQ?`#8>H%8RCp^GEJ`Mci)4)Goxqui|A5CV27)0(VyYRmm z#Pc+WFVi5tdelK&Bwu@kL0s$(Vl%CldZeTNs^=E}n2x%LT>?4C)8!=m@~GP-h+Vh5yC_e=HFiXuxyX)?&U3{zF#BO><$n*Pt(6!jM#L_IYR zIlC;)Bv#X?h(xlu1Ww?p7ui<#+6vOrRT(q@b(}c-Fi8RVO^TaY)ap%nJlIiux(mVTIcI0 ztbREiESY3YSx`@h!CFLYwaOY;mCy*mc;rmwN|{Iuk*&GPRqjs3(>%(6ay8Y>)>2%f zT1QO-N-=;aNV$X>5Cui4R#eoVh`raJ{r_fmZ*w^g_4~fRn48(z zo&M&{dvD%*gLs00-fM`ryO$I_%QgxFZo+#=j~Z}uX>X*Pd*WX&MylY4m+geU;X{lS zXjaN;n9K2nk4tW6SCZaU_+o4+bjBCOrO+Ux2nL5-+aPNCB$YyZ4s*2+u=2T&6Q89cdC{|(T9FPlZaqyxrg@-d? zDGyot0qi(SXCX^x;aWJzLmAq`asGY=4`;$L9v+9&JTxX_DAdBq2!m{kfWwvxx~&Cd z+uB1@TL;LsT?J8FXXt6`0{v}W;VN4aC zZG+(eroUvn29Dc?S`(U$h<=W^04H=EWQdQLQ~O$qRk_fb+7>36^Ps`A-H+@~QJ6D0 z$ODzbv?3Po9f~l{j4?#`bOf4O?9i3S=|nisGawZwRh&~@RHT}T8kopLU6}D1Y_|-4 zsD;c@KNtohEvAXHwl-wcZ4+=LCxYKL3u@UWL2cWOkZHRa8r!Boj%_ORv)zen_bwP_ zyBF8(3>amb2@lxrvzQ+TV#h~0?i^^w1Q>;@bP;EMGGUVV7~>G2HcaLW5yNf|rWnV? z;u2#V<@Q)6<5WudcnO7ZQIBwsSZMIB6=aYxmOEhRVTN~MsE-VeK`CNi^Gw@Js3avj z$yM7R%93}GtGMJIxg&NAp_V~3!Z;AYVYQ@Bx{nNH zWig44emy_5=Y_dYC0 zEc$<2Dw|mn6$LKt9d#I58FG&6;{2}B=rkW0$49=*noUzKEMW=PAA!CBsSNYtV2n>y z%MO@S2Iq~UCy+QT`>K(C%uEl8@fUkop-~%&BL6*{sUpndxOW7PB7u*iAC-}h4B8Tg zK;|kDiEZckO4v~N$V6;3Q*$sBTaoJLNlupJ926o!#iB=Tx)sjFprGY05L-!ZjFFq7qF708j!O7D z8OxS@)Kz=OwofVma^l zr<{tJb8=KMwhVl> z6^LwCL56KLWZ5=A8{0-Cl%7Up`wSx4ZE&q^2NFjyD6>_;7TZDCZhH=P*-pV;+hN?c zj=;0F7vZSwCHT?y3jA(+jR>}Ph-y1a+_rP1f$d|`%=QUsYx|V+v3)}Z*}fyAWkSZu z0+}j{WVP%e8)S`akprYk4w9GUI^-w0KKV@!lRxDMC317B$hkBqx1{al*0ht{fp(J% z=n%Ox9VK_6x5(Y;?Q#z~U%re!Dql_)%f0DlxewhT_odIuSJ5-_5c-uojQ%c<6w>5t zg-rQ6Ay=LteMu;`TTYMu|)L;p2X2 zE0&67Ad=D0nakZpQUwJ@jD7`$;xgekQ0SwuOU-7FX~b zgghv&L~c$Jw!=;0DseS4Ab|1W zxwwH571$<|s>IkvERW#(MdBvDwaQ3@Jc(&SjSY3PMVLHq5GEwkKn-^%3XyY+w0o>H zAGtToQJN`Uo@Kqkz5}Dh(hM;(!B`AJ? z|2`OBQ}g3{UO6Cn6C)4T+y-Ye!RB}*iPV)aIuxmdyLZCKh(43!P^L#WG6r+mBa)}p zWYhwSjC$mPdbmE|$Qt^9T}*wzE{yOWjx^~q@=zkJDL)Hd`FZf;2A3_r2+ifAP$-{( zuJS1uAin~`<=0@G{3cA4&%jdoKd?-G7naNK!IScbuvPvT_Q;>WA^B@~TmF`S{1frW zKa*PWFC;_$-C}r|(E2IyY0mn`Szj-4iCZ{T)fL_nw_YGBen#A8axzR*Y{#%|nmDii zyleer;SGMWXncEHZJTH5aW=G{6d7YyJ%4*0988x_!8nz&bX0MU5m8Asj2I_dGih<>y z?E|<;*7uQZm1Mh*?1*cD+L?_F*8;Uyl~WhizVm(#-Xv-l^3@a|p$1d~Bye!bNO?d_ zfQxGo1+WC$ER_iPjsQDri>)DdurH_892O2mss%+(21PCgGi6bC(2Y>!33?b5c`PXM z1lg6!*GN%kiI1A=4F&Vj*E#dMQdZy2gTaAYl9i*4sB@Jxjr zyE?`Yja3oYMGg?)q&(B{;_|T^7JCg-kqSRZ4wgbNh)kGs4|x`+>ky;kks2q@4J!ZZ zL=blZd>bRrBN@lS!w1O07&%h@*O#F*gsfrZ;Ewu@XwYB96z9}vAaW=esA9@rk0QEX zMV3JcnL?(+T6%_lK+lt9^bz5p@Eoiaz7c*E{y<(SU3^|Vj+pVdc#?&<$G}7j9&o$T6Xqzr;6bGb9#x8AxiSz|DObSbN?&+UDS=Owq42vhoXE-u z;#5WxT^U1aD`QDr7-00-IZI(Wy)=&Sh<~CsoY6Q zl)K0fWhNP|+)XAZ_mZ2H`^gk#E}5>(Bey9Jkh_%!$sFZj@}Tkvd02UrEKwGbmC9nW z9+%?|Wd*5F){yE0l=JihUScCWC=t_!7hpRmI27uMR- zgbnsu!jtx(u-#rq*kjKS4%+Jr&)Ktt!}bQkQF}w-n7y&^s=bMD&K?myvF8Y%+gk|V z*z<&6?QMiV?5%{ql#`;Q92On+sOYs9h^_6Hhz0g8VkdhKae%$2c$K}EILuxojdsyTv>Mt5yXAML*Rhh;SX^?zI75E z#)?%)qq<0K7%m>b@7$y=TqPdFG!My!E5&E=J1(@U0yp)FwX96_IkOARflIGUQPZk1(o)er&eSOSg~!Z=aLyAYR@+7u`ebynSwZ z5L?RH=MjdQ?eikFVzf^at~cAK3pbkW^9hF`lefhw{DrIW1@T2J`Cf95cocIu#MWl} z9JByi^%A3ZXeVqHYpFuJkUzwic|W?7UwKPaaW2#qj|o?Tf^>gBTVLO zFnqa(yogEU=uS9`@s~N`GGWK-|XCICfht#i&Z<>WoF;ycnndE#A z>B>ar(6WM@D9%Zbk&`(YF>)&5l!@yj;Wi=KE3y5%AkDrT((QXMa@us0Y08<&kA9fm zj*}le2uY1OV>QMQ`DS5bPM1Pjrnrhp%3n#~IYQ|fHTuiXeeBPJY(ET6`w^&PKbFv# zEUPhDR%5cv#<1Az3l5*(65lqb`w~;zLfJ-M4adl9Nm>N~Hfa`LOPIxs3uY0-_r&+j(n}2)FYeXh zNG7x24%h;?#|G_8)|6DNYVaLnjSN|zr zV*_d9vGcfYWFGqn^C~>{vG@ttlN$V~(O~frY%sEev=!%6qK;?nZJk2Cn@J*7Ci8ur z)9P=O0y_(D>olzWkYy?5L|U^_7{N%*AxKWWSqcL%sZ|*iGfK2oNMzPnoNPN|(2-1_ z-A>@tW)MmBw-_zOtq=|4J*2j{Wg-*8d3lVTt#i^xHLA>GRT^CS+oim?zNJWbVFPNL zWTL=Nc+{we*UoIt+K{NnkT%;fwpUWV%Ag-AAxXqWw(lPV|HKd0Pj^KS> zMs?pf*N$zkheLx*i8tsy48EY3GbOC;K@T%w^Hg0Vn-=sOB>%BK^pOuZixHPQu<}^J zNL6~PqB>LX*Q=0Rj*)YvSQNK!H0RY7DnTYy9bvGjIP)65O>>TEi^QKlMn2r=i>9$r zNUOqavIu6wd<3ld@GuXn;3yn}wMczRBnKWR4$_2${CNYc<zW2>UCtYI-cCE zP9SsDNo0X~BUz`LY*KF}mFjKefOMZiPdLQ{+ zy`Ku|JgTY>P`~;RO;;bL4b_D-tUkuk#3#5+he2cUGq$b636R9kam)31SpWe}Y$}mL1%99<)IC6d;SWyVLxv1^~J9- z=0q|gQ~ZVzGz>k&(G$i@^n@`JJz>m5PZ%@N6UI#RgfSC6Va!BN7&Flm#yEQ7v2XFM zT4NXZPW;{!_I1P(7-E}GqGA{sP{Y)KoL>iFw(`OPdx(*bD&Th}0r!!QaRKmEC*hil zBBy5yvlEshaCv6FB;?yNjoeHcem-9k^KDF$9*L1plz^m+t{|UA#QbApgHQYcr%;0K&|UnI4`om2BL2i_LmUQcznCxnY^r$77ypZc zPkHPcJ|P0k;~*i{7}Q@Z6^{Z_Jx>i0L>h?1KT9&lQeOl~eF^O9%L!YcnzRLGV41&) zznRU>!IovR-c@elD&O9z7Ttuo8dAxUQe(@5ZaavK8SLz{bt4@IiD@{b#W zSShPGlZOe^mHIZ$LiIXA` ziJI;2Vix1Yar>qeAj_hh|Aw z%!O8#q2yvbDXc6(vPrVJdV83fJ+qj54uU%@Va6k5D`98dxh2JHc5)5PU$(BcksqD_ zndBVW8WazZADP^}Q#e#fequ2{{}w-qpAdR@LL~keh)OlTAiZU0=sgAC2kE6S#sWle7lERKe zaJl!B?8q)L!fuuY-LoW>FKrDbb4BbL`pA+)a+;${Omh8J!p<>9mKsNzThr+(7>PsC zAw93RkNg}lPT76rzY%^;pc@CAznGu*E{A5-`WL_A!c6B!`M+Iol#g@ZHFFp_aYzaH zaC5$d3`4nUMq)EEf02*%qS^rd0F%PC}fX~W277Jv| z0n?J|YF|`_obFSIcQ0WUFI~rU$*L}oBRj`ZoF*hE9m^5IS3sI$Rf6$QZL@q2*d;%= zzePMO1-NChD5XiY%ue?=8RD#JDRUuLvHCs13WdE(LS>Fk2p>;EhGXl67&ehZm1;}D z6iBUm^5pFO2c%X4CLVeHoz47-f&ZRx+9CB+EYe;}E?jr>_$4m+@#o7m~iP0Xs7 zg}caKOu~xfh^hH}n3Ek8xWTYtcgszNo3O8gHXkLsC`HZ(W5O;fa?@cGW&QOU`}!^H z5z{WXsy3B}mxhkpzZS0sL;Y0RleZ5gJt&8o(jCs>S4WBlq$9_GMdcoD-F;W!VC(Yy!e9~{pj?t31*j>DikUVxzEMX2w12^u+$ zL5|}%w0E3@0>>%n=!15$;a@rHXNxo3U3kzy!7BraCTmX7H?%P}ilI^(}l~hWCc&7_QryCTfmaxn$ zBSVZ0;Ai0&ld_YH3`MDtC4sul6pb_w#i*?)yo<^V;?yt#m_mUCb_{k=)k=2Yb9Gy| zMT#>3lCu`LowXt0Oot3-CNy%^g@`jNf#hm#Ny3^L+MhLWR%5A&*`h1Wp{&c6`4L?E z)S0;UD=0f1>ysolaz;RQ=3wo45OgN`eW;rPKQ^@py+j<)FA2>$JEp{s%`EIb%y8tz z6$J{|vZwCS3rx?phH9FpCC_3Ha5*o9OlPlz%5p67CuFrW&upo}nkYDp~&ZbxcqO=VK=^yCIkNYOh{%CiXW#NOSNocX4daMUWk z(UWftpA+z&aoG4eu0&rMoFGMv7K6h@q*%xoEn_#AkNS(neB?$|9}N^s`C>SSZy3EJ z=5|rSRMxqR35j9&>}@1FZbO5p+{QKmFVkf^nU5Pomw>!EPO?#EsK}UIr;paUfM)a2 z+6hn9E*>IST%_8?12?twhO3=CkfM$3Si3XZG<28(405K!Gd$dlO*#Z?;Uzc)ug0Ae z8AjmFI}xAU1zzV2(4F@{E$1v;+4muCnFEcTb0OrM2Q8crLTl%IXzN@6otz7yr}I(h z=X?wXITyoNXDN(#mcexAN?7S!2b-N6VYl;1IN;m@hn$J$H6)Ew{C7g zYMYWCy&@S*UrV_N+ojBWU2^6#DJkLhDHq6$CQhdJWjy!J6q*aJAzb$bPD{)YAi87X`V2Nsq5~Sm(7o~GsL{!lnZ z(-G-qFs-(1eMy8X(WHm=(9Duhq=MGnNs;BiKO{ry3lPFjvv!j2FLZ4eqYb!dpEhJt z?NBAn-bou77KJj>4UO?l6K3=gBlj_$f;LUmD~Zu&jG<-cei#q2qdywPScEaRxVPtE zym`VGx%`V3)xGZre(ZfMkX*R_UFlHEl>ynVOvrWBhqkT;(9@L-16_?^sH-WAaW#W+ zt_VzX<-lxLD|pb=8kV`*!5UY4D0daW)2@!N&vi)xWw+k~#{JxN7C{`dL+YNa{wDQ^ zOXj4z5Ek)`a6LA*C9^6f9T79<81A#eKAIPIo<%xZrZv6y&{llRTgPY{9I||qohdWM zpl!%}W?mHeL220Hce2fo|C=6EqfPjM<8VL2E1w9wbH{_Lwo#AGINA{ zG%8lm4m;t7azh#E2K<7l^Ngyb9XTOI3oYAj{JN7Nkf`OOm&8RAv~wiEiv;r{nfS6( zjhD0w7T?tW`ea&1$gu-}2g3f;>DJf)(o+K19MlCxi`e?rx?TGv%3u?DXn-dk(RAYk56Fmt=u_e0pvHHMcJLf$7Ikx$7oQ@edElpszhLYz>H zIN=I#yZS-{*8qsP20=U5Feq@1fgY~0aJg$7;)Y3Zt?LGu;JOKBx^70iFdZIp-3eu` zyI`ejCTwus4Hd3?VXx~xIN+KCM_lvZ4cC15)Aa~RcP%3IT#HF_*Amj!RZ1>*EhGJ1 z%gJ!p3UaM$6`AOIoXl`NLFTwNk|nN9WWDPtveC7LYQ@85~^|@ZALDw;w zuD57=*E_Vk>ny#@^&TyDy-x?a&eN-1pVDhxpV1p!U(j1zU(>r?-_kj*-{@nm-|2eS zUv#%ypf9;4dfYA3SKJDH*X^X|+#dRcTcba^{Q|ga35vU}knPSA!tMq_3wLATYIj%| z?v4m!+^vLh?$(w)as-^*M3R!W&{twEdIT~N(xsl<1=b9(OTD<$tj|p?7>S&KLDFUX zyZ51obUD{_e}nXqiWp|4FF{?YH`i7_j-?bc3Xrac!BQW?iM4QjoTnAWNc^$}+KRN5 z`X=$)RO)Au4Z}?uFW*Op8sI&whWDF#K04e;A5p_HCZ$&#ccN>;d~1*GFI{O;PPpC; zZy7Z>CPWvTixH?t`sgSd*Ch=1FA=Lh>0cr-<-!b8vv3z3O(DbZE9eC+4%`M=;=Tkl zcNfszU7@qPhb45?p(P*SB*#H<)(c|;nC3=}K^ho81|g-G#uN{p6bg*77*mb)WzpC! z79g?kprHakn=Q~Xm_UjN_l|#<;Y1%DThsAg?NE-mi(X5CxjEhe&BRqmniX&nSuPWm z*@9A4)K=4Boy@R}hZzi++>E@@R?f6~>2+d^j$;Ski0zt*1?h~tX$528I$(Z}Ch~A9 z+yOJNYxlu?SYTPrPJ(nCHe_kt18|hRbBr&+w=X)j_Sm+y$M)>8ZQHiJ$MzoEwr$(C zJ>NUObMDK@{o}p7n{=&oYIP;ut2$M+_*sPzMtM=0-Q)$+Y^@1Uz22MM=0$FA6Bo97 z!Nk18haK2j>6dtM$2{o9t9Fv}FT0ks5Bnfb+v^6tcHIGaX)EdXeyOVM<%LH#Y#sEW zsC1a|cYKjvJ)c(c#Qz-W7=_d>ak|W*EmQLhf_%dtd zvSUL@Mdm6g%7!MkR;I2FTc1&lCO$$$^ifxB)F!a+6lU8A30fUoCdYeY=`AJ3t)YcH zp}6r`Z@oKF!y%$n8}^cpOfyBe{Z{*MIBl?fv3veDmz}Yk<1A^-R6}AMbkx}KDGCwL zyT!`$cP61$ZQ9xcd$gJgWlH#SLouV-EVDL14Wt_zZ zkx71%NN!HnkDP*$myhUinsbA|EO;yjHs?j>X5^Ahvh+0ee}RNwWAq*SVxhh`+_uXJ z%=#c>x5^3s{XiRa>VZjZ+wsr8ZgEKO0sYAz?MHp-Xl>jH^4dDt^?eCrT={~gzmhX3 z`*6};*Xt#JQM+yYuv$I;-sZXOD8b#Z%O zhOE+TBRBV`q|`y8ebl_-iyIEA#klpr$`T%prS8-?xKHlhX7=cdKO-9oWH$j09`SF z?PmeYNMhl1Ey5Gf_ zl2XkEs0vr}$0dYH+l~SjWpLa?Kj(JIvWX>%V5>7(WdMuc9O#Xnz+WZ{3grx}85SZh zz+xdRA_v~cXA^w}Z;=*OWs&3>JYu1?9)+%<^{6lkdMiQbWxabp8h2JFoFX1Fj1L*i zOK*OCC%_$xpb(1)!(%bKri4TPvKW9Y#})lx+>a`!)4HHUVCqq?A5cO>JJgt*LtZdGU81^6!bS3E5o};5?dx}wHVquFj-Uuo|qBs3x zk~v!f&}3Al0QZp3$h_f16fM0Y3b2R;ozka<0O)3v^;BZR&#$R(E74DvLq#PSR-Y7p zHvgm37p)VApv^y-9*aw7hp`bY4BA3ws|lZT#TEt2%uK*B=%`*@uGtg(GN2E=V~7od zrZCLmgyM1PyGn-?obfh4^uQF#0iRuekO=gziwUXS2)`=4)9&RE9RJO}S9UC^-<*Hj zZ>)ew82hb%Gb+dt(rFo-?IVIP`^J4LEO{=Mvqb2L51DC(=gy0hmtsa@?9N6Zkyu}q z(IE4}r+X`f5<-(GaW6R!Z)(+?F%A^6bcF;Hzxfxp@WJ6L^QzYj-=h^N)it=`Qph0u zriPA%<}C2smCY2!3tziG2XFWB5-hd^WS%Ekex?Cd+!C?z_A-P=P9;$4pHRhAh-s#Z zxlJP$1*cql{MuU}q+?NL!sAkSEgjjQb}}3jLvdl0ZFADrx^nJ4v(6srZ^s!Lj{TbN zE6Ey4nG{>5pUPwQ{o8PLvYtkd@oPG_ZU)^+CVGv?oyqnrYz;$cm7+Ag1aYcD1OCQP zO87ca9PDBkZ>L5-9%L6BFtwQ5cIaOcV$t-naZ}g_U*!EmSn@nKgvL4GJtw>(Mkh!i z*&8!}r}P?eO%+oU!zh z3Hx5YZ!I|wwVN9<=yjMIqtRZen)4Z6oDbreOm)(&f%GOYnWKLe>?M^wT@mT%3>@>| zUyI?WIHXO*^>6U=Ceq+>9=^uRTaRd!iqm;1uk&cqCY+w>8mf8tDJk!GrTUOsO7p^l zI+-a=hfmA%T9?GtK28tr(tEdALvak48GVM&c%)|^9^2!!@BAk!0(LHf+P8sNpNj=? z>}*cYWx{f{;ZAR=VAVV>2B7Rf(@v*CH@akYZS9m=cW?qdwsE6stU#{{xeK`+Xgh=? z+NClgEa+R6+O^ul3R;Sm!|9u}J?Q?^x_Ye$aE`pD*0iE6E@eh*_e;@`l+ql6S?qyQ zaPzEIJ&Y23B3kH1w_R6fp5v~sz+^ggXr<0FWZw?xU^RX&*?0xv4u(rbp4}CE2J7M!@ zKPa7F=mWR6N9=Xz0}Qr{?6X@?SB@Q9*E*0*J=F$4w?_=(-SCn;Rt79@SZbF)z$#yC z{in8LYBxSed2Y7gYCKzdakj7Qw{e1Qx;l0-ZfsvCK4|l|c|{(tNf2&)6ZUuo&J8p{ zZypLmUcfIzJb4eX)T)qv&C6gR1cn^()+PTxt?jQd^4>SFsJtYL1=~X>FjgV@OM$r* zNN4LzZ^x8Q&mMm@ph*&jb6bfcyu@LzClD4O-QPSvs|g8T#RIsIbPtPpN5#C}>9xB^FF`4^%eC(e z!c#bOu2q42NhA@43>Qt3v2_q$%uF&5JH}It_vZG+0M3pbYgxdNKI;SdOmLI7Q*;1K`jRSK(Gb8yzvW zMDrzGpop=C1dAW7x~3 zEkdD#as}P15Z79-co4Moxd$0}j5R4NND~)F6l&zK>t?g|wl0^EWxxa*0?NmBXO(AJ zF~C^a7gsvts^0Pu6{?W_T7cVw3@m73a1^+Ny)@z9R=HCBYQh&;qNm7E6*)H_ zB2~f>IJfeVsCEUnsCpv1YVs|VzmRJ;S4+@cCseG2C--TppyR8OzPfvKB*ACdiQ?~GN1L>>(-Sc#Y%ewbj7}Hk}lJqY50C)e(2+`gGHHvq1%mqD@ zVKdC0E{+d3f2kE9=_%p4s;JD$wm00m{9Mn%(;W50##V>tte190{(Fsu{l3%M_FP!F zG>1es#avi$IW#~E2jOfT%Dgb<44Dl9d8J)&eiGyF%=0Sg< z6VQsN^PrCXNu(wuKb!zg_xLCy*ncsFLl|wN6&J9b=3nKN5_`PUP0(|vV4gf*WwdDXU|C_b2>B27g-z`> zxmwG}us~xUA%}qk2l* zVxyxzgI;-pRY{RjpR;u5S%?+-lwBJ}g9Odw8$cWYV~-l*^Qd7vWFo1Bh&4^a@I7R30DHV;yxWOm_&6%s?bY{cOPJ!^*MSk^7Npq4ZP|$vcfKVx z+(A>ZQ#Zyf4PmIJXBw;PCr-d?>W*cKG{)92?!U^D*cQw5FJ!ahwoTeKHQ_Da4!#o; zX(G?YMP?)>!?o_B+wo05i&0Vi7ZW9W1w)walE+V7)o9$3Zyl`F=LOoy)*WvbzvD0V zXut4GAqeYBPa=4Jj}V{!m%W-*IPBcWfy@~(5pyFo@H$fz*g^7A?|u3D*hZ&81FNM8RWB6aNizZ z|3V<{sy9DMo^&Tx&TJWdx$VbZ-&N^|0-3_;w_yfnU2_<)m1?N}qJnstdDqyr1iHc7 z8I>cb8KdF0&{AHbS`C}JKfeAG;5uPRK_dW*rF!h6mw>2I!<+6t1!kj#d&_4WUKLI%=t>VUg{$n zcd?tWq^V|<9To218TC$XooL3!S{*!QZ3Rrn)>ZOONQu5rgA;F;p8_)D~A zR+LL3^^|c-O#GY~uVUjYru~oI3f`k`^vn{kbN6)-;su{(Ippad-k6-_1@PQ$d5IMq z=wDqCaW(8{Fie-lVIjbtBAAsQ!TFxB2LHAd)Bc@6yIoX;w0Yv}F?Chd3fWOuFLJ|d zJjwRkb~$Migt+H*?cn%V>_M6LQh# zsEx*)pb;Z6-Oq>I*59T4B~8WlI8&cr8ij4I71XrbEGN0Fi@QTXpTDuo$uPrS&uZf2 zmD|A%qV3ygh)*zpF_$Bw$~)&3T=o*Q`C=ZO^`g-K;CLbab2Jap5O`KhNuI!$d4&fR z`7Hl_nLV4y|I$yb{n>`0`iL+br_H6MLx7Qgq2^!y0$$@wwm1hV;Nyd2e4!?&-oq8( z9Ino7EwXOjsus_talhVY%8r9G;#sVqksU|t9z()~xN+NBQ;X@tZeg}CA|&5~fPJ7JypTUK-{2zBi05`lltdk~|%A7=F& zLBOwfMa(LOV5WECv~q^fv)3tUAKuN1)IM4tEZSMM-akI@mBWt|PZW7V3@xvxmNSP& zy=Gk5xyic)oy<#{LsTm52xik`ufHJhY?Zp?&_%1u)&u0sZ-Sv?F7r=N$XT@o`3?Va zc^xli&5h=pwfY&nJAi-cW*y*7BV;)tRrnfe&zcmIp3)uF4ye3Sb;y&3SL`=9QW`m` zWEnSOnD0j}*>id|VmV&O3a*Ls$Ig9Ej*#epw=L^Ff;-V;*NlqyGwWYC-@HKTVhX!gmCO* z?jHl!B5|IyXR%+%Y8ttNTMP@$XBw<4R5$wTyakgsm!;w6ZFe>-~+s?)IvwmT2mgV}ly}RAke)G~U z%Jma}q0%ns1vI@^)Jpo{HJ{q`(tp7zpV{@DyocR}eg6XfQre&Ar#O3OFRcE?vnU2g zXrA-OFJrnc`;m7&=}G8)u}eu~{3cTH*NLOBIldNP7c@Jgs@AB3yH3tI*1jiBGrR4y z|Baj4OxTZZAKW~IR%dxTtHq!nol|$a3E#?vEMo+Dg4Huq=30W(XqevnNAI;Duadh zhR-XiQ3yO_zFY5WO{#99>RZVpvdaa6?`@3}leV<@94?|VmAcR&>@%ak*U)O)<@N}7 z6nHrzXD!ZIO7m1TI@d5<^eo0yfyA&=bu{`ux!D^G^dV!mgUFXtkQmmcYhI^r(3u*Z;9qQvw=t^?D)RND?ds|{tcEG)jBXzz1r;KuHMbz4&=Z3cCo!tJV_3uI}pW0 zkLZXyp)c-fc}W)?C;#%`_yMJMM9%kgq4?cJvkPhv zLEaMv;dbEB_f^5r-7)rwHij*Vmu$eiRa2D8+PMW7>N(0y(fJaVVQ!~IO zYA`05GN*^7lZ%r!R-0Kjvp-0(XielUK{OAj>@dEj<(CSz+-Q8Mjw5E*1DZ$mtVl0Z+*aZy!C|Lc3$KUKY-sqe1r45bM=F7 zFtYmf_8@lj>??A6zkFdHK9OmkH}pgFLS1~pa~>;hJ9j|EzjWQVYBVTos(y#G2&AZN>)*qQr*6Le_@ z63GvS?}z#MeT?*YBBbL7Ykp|=h6p#0Zww32#l5t1V{%|TII~1;Ucs&va_Y6Vj^iSu zI(X&wKV*=gTry3zWPuEm_)tuBk#W@6s;#{C(?XZ{P)hyH(^i?Iu3F<~uBL)(M$$TR z1AR1_;j!|N_K-3i(e9kpNeVN~k0b(6i97DWwtNc{3iVSLa)H*0cP4~x3ZECO*vHPs zjNgoiUyV>G<8}}%6Y*5#GEP|^dAvN@5C%{iyp{?1|C4VOBHSzVS>#6m_T~Y39SpYg zHvN4GvRF0mB>8yTF#kZVTN!I1{p~9bql++1N+|WW3QRMIJqo(N=V)?s@;=&0IAQFG z&=qc7x>{VM@Hf;PI?FrO*Z>?Ul`WX-z$+aO>-z?H=ju)-(Qa;Zq6_Tei(E*pANJu} zi7+IfYIewv+xcY&JoUq@pAf)n9|O?E{JZB4piMjOL9~6Dse4Xj)F#F|_7-u|j&un6 z%UyZab`a<=(eJH7aW0d%Y3gwiGZhq-~v9 z2N4>4@bb_{bLG*>7mXo7t>}1a-R{(fa$Xe z>4X*}i?*Y)On>N=XuxWOwv;~l^CV7Qyl*zqYi3W? z6?5+Jm&8jC6#SRC0}VIAF93A-yPR-704=L<#oi@50PDMD4_&PBN z0HCNJ0^m|!dxE>ZZ+062X6_RJ8t;9;f@TaohoxuhV=wHyLt^{Kq9$4H4^Y!{3+-8< z^En7A?zUu*Bqc{)AgaAK7qA%Sb z?oLREy$#Ufk8|h`+31f^55hMJ3zp}UhmHy!$Ve#MTs2E?M4DjQF zc}*x@kXXT|LUH6om-btBs#@H6SbqiWl- z07LdbOm}9%=)_$lF)q9IycY?A^nY}*j}G;)o@Xd$N)2iY(&kp-N^AR!^ADJq3tPmK zkFz1|@xof1mGM>NwI)CXm=|}9zgC|O7+#DRDhNsJk>>WDpnF~OA7zsG68T!B5#VHg zLcvL9ePiWY3WZ8nxXn`KbAi51_ihC91*u9oA%h{9@(pB-Q{!X;T9^#YFP2R#V$8>9 zDiqxKrhkD=@7{KSPWOIQxiHYghWVY+Gc<# zW_%H6Ub}Vv?4d6yfveIeZWzITT%lr?esPBk(=G>7c|*&nH(GRg9;^y4$eV}F(hhcG zv)J);o6UK!U!rD^-ML!G$}eamNjM1yu_8K4EFfzt={FS%ya(J+Y0SsY%b8joAN(^* zE2g2@UD$qN;gJRtElofhLue~Q}dAK24F%n;#QNoQ!4Swc>zXI=$k+hMwmyF z!D6k@MKb-ZM)`N5R-)B)JaK~|C=L^3#cGx>uQIf;)f_(3A0&!MG(wd-9^#%VvV4)! zX3YA41u>gYW2u&ipMVed)SwW<#Qk@KN2breW!Ze)kbz`q@}1eA0?mn+yh0bqKB^(J zrraG6DOz7PVL_^wKv5paFy?=EY)RJmjJfDiD?Zz7=AF39j-9;Pj-3`O)S-pKY=pu{ zcAucZlXn@`=$$DcamXb<2&+U^$(;{xU}D_x-a7t%Ne$Wvm3%Yp{djQ)dEH)vr)hsp z8yKd73awnlQPl@V1|ztP_jZY&Y7(nLZ85eXpQrTy$(_Z6)Oai5@_b~7Z-!32U*U~e z`Jt)L40SrRx!&;@tD9GGDhM%=&rqq!!8E}W6^cVpzJrD24|^o9sLW75V4WSox;$B+ zXFS^Gz#wkOP#s9zxC2}Fq>gSi#82;BtYLD5k#7t^Gkesp$Zy>>du*@h&}Rg-hkCn| zpAZE7H|isLuS*2CSf9{(NFX~%Fg?GZt>WwOV>U%`jUgNoI0r?Kk=ZpQcn%fz$tEIV zE6IVQB>7>m*fJTRfp1yz_RaVB2q)*FSJ%mntm&hmcMLBTa)yCi`0mzFNgsdF+qiyL zzzp?zA9-3(EuwfDDUyf!FkZQEDOlS!B&Lv($__o6ILEMpiYSf>;=ZPH!0Iszt&hX) zunatyzGh>68wLx(vP`lFc@)SO63f2%$xDHP!2kgPK>-D%UvmvI^>8o(0|DWJ00FW5 z^cvaOFxYrFIao7T8XFoh2;14(nix4-*x5>3n3@=Q7+IT0+B%y!8kyKT+d0x3SsOSx z`NZ|ff-oV40{Z)jBmV{3zXU?ALEaYPNJ~pZuML8>C=O2Ix&KDw^G7tvA`@}` zjZc2%o&EMP)9KgQ4SZT~QE*gnbs(MhuW?EuZ?nT4wG>e`@|eDk{9*1_DK&Q{ne77) za%qw3MV;~tNcOfpbt?0yt~1gY*_4gpri$+3=%@}u7JN&Uu3gdr*MU4&nGNmiwyTxJ zKB1$9;l7OBLeadj;t_%^r7mW`GW%eHlgwXoT8uT(@>8}s>u;XM;n`y2G@f`(8X31? zg$zWa1>f(~UNS_K$>p|#GvmrYK<4V?^!}IocrwUV;Gq7|sBvX4$<^{5@kkF0~y;uMDV;u`z$EReO|TDTt3p|t5G>2R|p>mV2FRi3@= z)nG(%GxgcA;))U1E%*60J}K+*u+8uEx&OldJ|>iJU*Q5kTP~uhgs-R-wrK=a6m2g# z(g^8NqBy>3Sh-5fxnh@7Etq}EbkhvEYQS+>`n%a%LQ`3-vbv+JF!vBB^$>713F)#y z^8vr2q`D`lL^18eUgwj4AbP#_7e+@^)xfP%xAE)WjXh2UBmRY|(6w=14d}Y_*tMd{ zo2-hc2@H>xm;u^zcohmbOJu9lhSSXnL|8sgkvH0Ud^uI*Ia`?}uk*&Q?xANB6+~~n zrGhrXO0WQN)4>JZT53J&Dwj`Kl`Rsv5^FSs`a0v473HyK9(rEo7hD*k_bMr6u1 z+{&^&cLLVhs)JH}PU`aUSF7U=mSP_IODbR7$^!E;~TUQJ$s3PYo5N69fCeiS@tX~mE zCn@EZq7h}8`mA-p#A+8eukRIY<}cm#|BYyzd$wMwxd)c`8xie0?b`K|h*@8sO}2B9 zftXWY@Ec84c@?TZ*Q=12{RvT;MLtEX29 zcML?VtlfR``m%NTEN#=9*H}XYY2nnVI%lmIb33?hYd9d4XhH<#DYVt4=tZ*^zN(+T zKz5qf%QlR<6_tIU?~>aHc`^z(tRnJ}f|R3Nr^lAOWA&~Rnf*5KII!M_+NEEJb|xe+_dkS1#$i^sT{F30eh5uBd@qU$KO%3<#UXhN1FC+7n(w z>cn^hyQkR{wX|gsE_!hF-$IuSEqmS>GL}LUm%4+{a?Nb^il#|UGZkikhBZx2C{v^J z*J;Pv^LNF_VjDTx5S3OjX}p~ic$%g1mMvRT`D7+83zpTYs)W#=+MI~qCZ;MXBDlRL z*40eMrKi3~5nJn;rRFiQIy{~c50->p+#@9UGqCuC{cLyh*F2{WWe zQpjdB%BHrMs+KQZ)GYfAPC5J1msXk#12)#DUXvPh67(Hn0F)m#8qJ_$HW`nGx@Ox} z1|6qocBvrZT%N9+Z^c}17RFw}6ubV;Leh9WUSo})E;xS<$Og`qo* zO=-T%`G%?S_ovlw9GlgS8N+E&Xt*xu!Nc3VlJQa`9itcR8^RS`8$-oswJN`oMBAHX zviTkUszuFfU=-ETkDKZw4YX6nxG3;ltcwa)PEh0Gs51S!P=J%Kze6oat5TrW!pX!Y ztEp#%q>AlP!1pV_{T6HcjJbc?XfCUVvmtm|XiYy0!GZ?GW_!HjPWQr=Dxh5#_h^i* zw;(W?rlqsc7@d>O@5iLf9rD^_pjovG=D0N3;Cr1%63l0LqYW1+K3G=Xddf$JqBX zf}#cf@j|~OaR6oRw*uQ&0r0yx=wmEfzTet2{#OCfySVUUZ2iypdHz2|{~2%2@-80q zcmqKw1V@_qK`aQap|%tsgOaXZAZ*c-eB7Fot369rKg`M)?DUEx=h*J4#v(G)8AF( z$zq_bX*Znspt24bS8o6(B4iY`Z?O@PqBda=kyD&}NT+dTS&EW#*8Z;MkRVxGCUFOe zvRX-)ZIqob^ZjkMe+^}GY;e61%AcIg0sL|ZZPPQ@VG+JX$e)wPb5VCmL6j4YtH#XT zRkk2_`RFN?R!)>DG^`92nrV^5q^u18 zTx#pR`)}d=g!EuadO>$K*}#QGg_mzX+dkti9z8;`X8?StJ&S)^kuzMDLU}>D5$)CI zuLrY71Er(7qIaNYglhtu14s4FqKTYTe_tCL#PbPGxW1(#(YlpbB%{@QlW zj#J(iJ5E1yB}^QmH=*_Tc%CG{A~WEyo4Zbx7h;n}T0XJqCBBuf{8m_I&@;Mpqgpzq zZTri;l6Opf(4eh%GQk+dN{MZ?9-_R_w+QKXRqjW?X9OitJkeanazD#nt@qd$<2;w@M)hURDw|GD8iLi0uwpW! z`q^xXAOS<-`8M8($A)$hIvwLpHsCzyEvl<*6)+a*4ba@LJz>n$ElnfMx^ZZD{Pi1I zr-HXb;e`u9Zvg(_vMaQfg%{~0K4;<^^ptZ(129-NWwL{qrLq=+pr>b==Hi*f=LNXz zd+anZgO<{ur4DuH5K{k38B#dOw6_G0k?gw}#g$)!2QN9sq!-g6r2?RxWlfz24k>)X zkIHt#Dc`R0vSgh6JBOb2{NhUsXSTwrEayc0g6f+t(K5QnSt8UD5ap!@%r-*45Dvyw zli}Khv*YpSJs}z_!<4Jqui*ikMO$S+mRIwh=HA>4-`Q9N)Am@KKrp@2-guqj-B)wrhOK#e$fhqR(;r(sZjFTv~|*d^65& zh?ksUatoBOtz%$?9Qvpnb`f_~UWqiWijC`E#H5lV+x>1lOg8 zhcQa}78upNdJurw?-mCt8f&AsK3W*v=?oeeM1wwRZRkyeP2f(LRuuQ&x7fSY{kAb) zgnF=>u(+VtK|8*q2RtBspmB&oIY9V<0E1PE0P#G2m^ZFnrroFBgI*keb`U!d**$Iw z!W}qo%3Ji^0sof$4hkZETz8z?U$r}beF>nwQ7>a5zJWfkfxZcEnR>bRUetFF{A0tu zpyP6(XodLUX$AQ~vxYd1_4&cSEcCJ7S>kR$ra>|Mqi(f?{LpqaPE(20h*oB8!QBzu z*>CZ8yLumbDS&g~ykTz3dP{(F5gG$3dbwtSsr5lu!K#6Ec71wb)56ruEgl1aYvDVg z-~zy+{qc6WZWRrTP7hrS+6Z2Sd(D9ST5qLeW&%I0cb!@(`Urr(DIfVE-bMoW1D^Sz zKb!()g1$=#0j#%gy%<1xP~N|8hk8?i^kBTPx?fo0{Lo*WdUGMWabID)0m*TC;NDN8 zFkKM5J?O7o?%nvW5RZ>yyP5uW5Z&OucHrIcuduZM;zK=T1OJJ)djsN!`1;Yy0NMlcNqv0xJFBh+vEk-c$*;tfFJe*f2zd+u+2X07^{0izHamZUZVh@Hv%F6 z%AsHACqo3J&~J7Bd48ne3#F36 zl2&s8Tk7>2uA3hg!1Nj3-#C%BVOy#ia3P}I>_(RCsj~p%dRGfHSmASS{RH7 zhzFMWegt2Ty=;#dRq`bHI;2-HDNB3&3=PWwg8xzD|6@n#dwt`&`BC44e{3lX|Nqo@ zNgI1>Ql|e_=40gh{tO79W~CNO#>`pX1VRc{%u^bg@lAr1 z3xwqFjYZy3tr2>;HFY&j8@XP28KLlp7Q^zyEas4KkdP=|KflhH<;IzTb~raikai9JP#$DWq_T|S2k zyD$!Kh!+;+D`iNe`)ge!8QO~qEejm@W{XV8_*d`qrpgxrXvfH`-t#6Q>sGBLR|k*7 z-m|CQQw;;aR3cQ%)&7oIxZBWUO7Vfw{W7Wf0!K9hiM~b1uoOM^3LEl7V zQ|#7lC3rv$G0nd(DZKk$G6GvORatHP36Mr%JaiHmjgJv&>7!tkF&DwO)yd&H{f%o$nrI=u6y0Tm>4jL0P+ZbPr)z&+SE=Jeg@4|1$uuz@9EBCkk^aycqi&jD97S zH(YT3i8crm`j>WL@e1~Hsx%TIjSR)EHdi0`4N^l}Gi~J_EC;QT$wXcyN?6vffHx_!m zM`T&;R5)_^PRPM>-;5DG_9RK0I2BjLPpDGfJMUY~`|aB}!9SJl3T-kx}&pZGD9&rWt;sjK{B z6VVFvS~dQ>;bqYHBCo=ts7+|BH}tsBu@ zVh9*7tOp`H@gc2;XrZ$~XY!eYC)S&O?(u#eNs)6VX$)2dgs0Me@nB~xY@_KI_As$- z;xjQmv$ZnwPz@8WteixS>PCRzkf#fRuC# zglx<-^+;h3IWJV6l#S<)Ia1_O=2qt6zNuZSTOzWzO40LC!9HkyV-u>Vjg6E^swSyT zRZ%nFdU?^`*OvF(>C@O{yi@0c+ray_$qc=8=Mq&HQdkvki5iq{8YAjExTAjCZb z0(^sMH*fbO-fV#F_V76oMR-QWYhtgP(dzMewC%4pYeL z?piy7EJmYKw#(h(lM$x1Vn*6gc&g zUJJb7vi9l|&Z)7orCkFq?v|3RCC0wz8{DQSn~KaLMS&qq&NkWX7xse5FAU%874p`e9XN7S#i@kvw$|fJ zEtRRx$jmK;Q7y!z%-ZR=!%*p%z|m)lDRxN$u8rp>M^tDBKk2IvCiiQFMO$1^q&6xw z;nl^MP_)*QQ;TqiIvs-KfX^B@gck!pw|glK*b&CAMX1P2yg-9M_(#bpWlUPEDJC|$^@EP&OfmN)^t~Imijj!c&+~AdtF}O3fD7Hx3 z_&uRWMR5?)h;b6Ln&b)b?Q66tZLZ}a){(MCXhwEHvl^L8ecFc(o>?c`2SI)_0*Sgg zYD`zHW)HedvpRSfbgEh#FSh0DcvXa+J?wL(;B@| z#&xtuEy3JVR>*WoQo@Vc83>BI$AH=yxl$^=Lox#MY|s;^=h)k`zv~;bBfrx|5g}$d z6OJy6s)#ZzY|tvxci}Fquc5UnQ9?do88|WsGeN9jU_>chqvAfwD83R_=4%6jrm(IY z0?#5%@SA49TI0`yTPar~pWPidfp5(&o%Szv z0Dzx^jB{E}pv(A7tW%GLtZ>y%zcg;_Tk9Q0f)Lo8utphz80@#G07Y%TjpJ6_vXy1Q zaIk7|e6AS#sExfiDvVv4Uesu1jt)@qc8nZL|4lHwc`z9kNvwqpee>3@azz<(*jb(d zCaG6slF*#pNfnvZJS}lQ-ZH8RHx8NJ1>spXSfF{5U6nK7y%7?w5+01u9-F`L#zDII zk6lSHi7%mJl4*AsS($_$TFT_ZTZ0m!3}XF@nAd;St?XsjvJ-EJ)#;z-j-VHIZYzjt zAz;4B34uTXB%KK~f|=UT3y14Rl{i@sG1Kj1dpoD2DEDJ74LpdhMkvNsB{ov-lBW0$&1lx5 z*ghJ{V*fPUiR);~)7(j7a%jEd>fNyK71f|p^PN|DD`?#kZ7bJ)!%{nn-8-Nk|E3sEa;hFL zuW*!UyC+jS5?tZ-8XxeTQ{mh@Z)@Ltn5Z6?TnYA=;O*g3O3x4(h+}1r{*|yz&Y(#2 zVeVi?8urGyXzRx2;zcrti!S}*EbqE@vB+sR`z=HJuO!(g*yc;fKPvx#@U5zN8W4QB zg1Xw)Tl$#g%A?g-KV&*$VDI(Fd_H>8k0IYff=uJEO^EYB$NbI~vrGVm`W;UGDG7l@ z#6rZyK8h7KuMJg{9(ooBM+T+DMH{@oC(qnSa~#cmmL5kjWPf1dE?;~AEpe?kdZ8D! zJFInknH)Dd)&m-5wrWWa47;(sGrGKERyV{r-c0T=NJnqiR^=C0zPT<^i2Q;)kEgH__0u#{m4@9S533XnKq7b`(V`g6#YyPCPvmSEj02P^iSp~t+>xAYutAPAb zyhL`s+EGc$`J6T5ADtDw5#QW2ZZ)qUq&Uscnj66Tm(+_+Z#`b!?mcex22Mjq8e1P) zr$~vcJ|ntyVx{>J_J@S8=dy=T&S?^b2ewU}zSo>2E%rUC6#i3O2~C}Tn9nHJ&`6!W z2z~Z*Sl1yE{4k{s8fT?9`rQdEG`EmSK&e=AT9{=%A)#fR{9?W??I5y3Y^k|G^s|*H z3Yh~mTNL^xt!AB8aGjdA6hB3Zp#<$fX)8jaA^0__&Htk8D}(BYo;{He9D+LpcXto& z?#{*CU4y&3yW7RxEkS|>w~ISmg8TB{-7ov9Ue&%&-F2pCYHI3CpYC51N&(Q|^(Si3L z!H22$x9z-bi1QIkXE%@;QVuv;+b|BKPKcm5Zp}{1(GYdu-q=HGm>adHaBRYhF{u7U zlCVZOGC1a_1)Lpa!iAuAepJju5D{iV$VG@&Lc#DSYBX*jW+1^hAJ95(pw_PFvdm8O zBJPkGL}Xz#&DVBx))uJRKGAbh(8#>>{&Kd8F4m*n=GSbNwLv*aDAp`&>$Coh=Oc++ zv7)69{-fjX8b(`^AiA;vrafm}rgdKC?#!T1uZ0ZP4j8<*>~zG(G%m2td4~*l?8+bl zxG5Gazc6g(pG>~gThFN5#w$)IEe!0dmgrw5#iK6n`zW%}=u`~gtw}26B&5ZtZRE{X zFw9d(5{1xJsu5X}&|s-xhpYd&e?s!iV9_yFb}e;nPQUcdm2aLj@4qNwt!la``$4=A z<2Ur%)d)g=C=v2 z87yZF;s(2ZGesh7wZ}{gGBF3BFb1D*&P~5sJ!cQQBd58!=x|8ZhqAp`DAP#g6pKP} z$|(>$*laBA@$gqLQj?7sc_z51v71_JE+1~Dq$wlmtDp@X-(Q{06kqQ*gUuFyrRRJL zZOVGuID{KA66d^P>0XY;0X)u-Mv?q`jyk>Sb2@Iz5$Bk$KydJ&InK8&jaR4xc0WTn z{klInw#+Ra7?4=kIK21Yy@zC)%_f0H??$4=TRfLP{N~Fb^3T?~M5z1)c~I%m z#AfQHb7dw3d{sDCA;?VGEOmwq2!w zpn(h+1vw^4ryh?~`(jID32v?1OKJ3_V=D1vo^V}v)=ez*j-we$HRZN9FB^``ye_7w zS&rRJubIdwC%N&6_B*pxUr7?5(`MB!G+HNZe@%a&(if8IM>s9AN9|GSj_O^tK{s3- zEU{l~NcCQdtmg&}u|9vId?s3(TFMtPGDtXXOw3WJ%XIgDlaSQ$MRjPn^X?v;^0OLs zeoKRt-aCEILgqKe;~-OrS7a|e+YFl1O@Q={sFccam!(Ly3yd{#_l#_meYn+LG^Xy_ zl$-v|a>|dDRb-n*X`!t&H#{FH<{EZB3)@%Y`&+9wpOn(j$ds!3qKiy&$ccCQ0(MeZ zBO;J!+QkLdy;9I*s8lm>w{VWR0EI;$O44q?Vr{{!n8XBmMV8*cUl+p!C9#iSw;_xI zAEo7f{u1Rv@3_j`r~OKr_IJ6ND_wGQxykQGMxgwa0*6^@j#Uq-sYAvb=1*ku-%Tq6 zE-O;_TTO)?R7^Q1W(jVGU8d2$F@nIL3N%l<4wSxpRsNM(cGwSmSiJYaL!Z|R1&gKYM(C$!-IjIGVnz9 z6~#Jbh?u3jH`?21)SbdT^?^_B(L zz7&D>Z;u(QbiQV6rEF2;e^HT4Dd=wnWM@nPfUm!Fm2o1uXFtYlBWae47^)T?G~8`a zLr5yZ>%Qg2?wHT}JRN*Fn$#TtVK^!ScU9sq`EPBrxC08++TD74a7++!vA+ ze4_SJd0^I5=dtJY2gYR9_?+Pn+6an%5L7k>&Qusc$U)9(gE)wbMzt9Q5id^bAFqm%W@WUyTBrQ%L-OefyWL@Gt^5Z2SjE ze=^bKTa#-@ixtP=t-S$;JE%6*>fFoPm{zYoPzjd~*!-8?X^H>EX|6^7ifvfeWd^Pj z%U?q&!`+rP?}2bZ7k}EKxjW5w&g?59Qjl}^2;Q1&`KYB$8ky(etw|Qgb*{ZKs~a8s zw7>a}(y7_B=DIQi%w@d4NGG}1O_yD{=Z0Ihy42aws=a*GeF7y~kGXkA`GsxtIBX2p z61|%BSILemhHcwNf3UhO(ul2X7Ee8<2hlx|$7`cI`l^RH8AD$DL1#nZm)Df*MHK7y z6(f1EoLjR%q~X)PdnXcpTn}$S>$Q9{O{?IVJL~o2ezwEtXSNm!*s7v+@nw~g91<|? zcs+|7m8TeDu5?z9-!Zmr(pVp3_?<&mQ(p9?LOq_oW+GQ{T!VMKgICXfwxb6pPmAMpi`9J1R7g$uvg{a`IGd9SN9pC_M?R zc6A;aHvO&bYZKgc`XA+gs_`Uu1DE*BlVJSbbsglcg;!?)tHoK2^@$6|(^OLA%?adK zdUXZae6RP2>#v0(Uvc%aA~ zcyb+PFXB|}k^?cO4NYF$S62N-WHz6x3vad*NU#SW2}Oe6kpx{lFrA%8XZ1rKVNR6V zk*5<0PQbnR7Mk6+@pqQ$%>@Wqbs%(mZxGXuv;`N`z zzjS4m*M#aa@7@KkWyabZp(8GfZ@Mvm z8?XubSgPIJ{kr{96QF{1j{$XVDSL-QXwhF1@fKZj&Mn_8%rf(y8vE&liT2#a|I!o; zk?UZPQ?)Wv8IV(Vd`2MW{V~I;+fQ~wBBgpc1Znd|fLqu)eCtQ>Us2un?}0qYpP?q` zPh?m2f1rI8%O$bT&Jnvx~`5XsB|51&KFlQB9mK6f)qrdSq04qvsT{X zoLzWW!lpJD+P4g1fy zh~~7Uz~o;q%+2{9ZF*jLHwF5Er`sXo_bkxgycmOoa7{W&P3WSmrz$fwoOMRAu(U=) zmQ!d<6a})i8Vh%`qq)_4s&>1g+jSGas`u3G5@B6cdo>&gL?Ip!$YlGH$B**V^6-eQ z9p&3=Vs{*^*RwmuvIFIi>R^_yp%>t>r)2Y_GRP_dAHkR7oIXIRNW=hEuwBJep+ZBZ ztwo;+-+^BU|L`}&bo)T#P=ME(OU=`1cwlp~5iO&xcd~m2)~u?QK>Jwlz+sChf_Sj-)bA78-o?el)IB;4A;;&5_1C`tI~eWsK$YYva&p zxu>NA*@e{%!xK(9|-JpYJ^YCUdqOZ*0ibZo@Hc|dw`};aw#bLh`q|O zz{wkkV*hr#M$KIU2<0%(Zod0r8rbSD93-wa+8oV-4J{O~H@hsa;q_XsXZQG=^rz$j zaKp3$A(m=h_|WPzi#!vw48v6NPxLi09P&{BcZM*m+(=W-FobGa9w*w!(*Y~b*tRlt ziH%s?YEyBQXjz>Nh3F#r8>KyYLbv0w57ZnM{gsB;9c7H)6~0zx1>jmW&1H`pi6_NI zN6vUj$$68--NloOKPoZA_Fp-Z`6)lLi5P^(7?-OIH2$?1)U0fn9{Za~#dSOl)X$#S zpc0v-5-sn+EL7-!eNf&sCE}xk@9#T~uy#kr8_VCq+pv^yPBrX)`yN;X)5{Y}9-1)E zuQRB2OUaD36xtX`68b29Eay=2LRd6&a*!y*uaOn(i)Wr>6xu&oxVC1vXmC%#WeMvB;BpxzspKNIWf|(?W~fMvpUmh-uMT z9|<|Dq6VzQ@xZCuw}Bl8ugXgXqZap5S$Qy&klMN$+$BmqR4Ob`=n5$Q^7>yulKO+m zbPzNIgv_Vrll&iOJ~cNN>;K;Jtkc|d{M33M2IEmFQ*Y91sa?QE5viLwCR4wLvdwHp zV@>3xR0PQEeV&Y^G*j4h#;MwnSaLx!XywKKR-=dumze#kH+`gHm{zNohD$+ZZl=j)*`TYCpugs{5laf z{=nhicQ?N)(;Ix~m!E*r17Cod_gwkG<-hZ|%RR>r!w>6$#F(}`r+YFn`|10a>Gy!g zvh|G<_X{csuZ{S~gOULf@OKw4t9#f>GO?oOD~WXh7dtX-7XfNri^p;wyYN;b+Zmg# z^!CMb@t{5Xyv*@hd$vl({&BpqCBlU5jSEk2Ai&+=U+S`7j*Y2Gm{lH+h6-f(N#;)E zq5s!S3Zq$MfkN?`Rt{H_3F~?pD$DtQ&%ZM%5{5+eq?pLF>c1sVs-nDk)%}xQy ze@7D4D#`Q&>Sq^O?p6F+x$KTc+OQ__T*#m%ugSU=Cb#N;$4JsmAJI@bWk4=vapWu`J%%oOq$dFag>a1S6v@dkn)D z$8N%1gadC*!6zr3c1&1QE6$8IA#=-Sfgy8*A+xQ94$~B#XjYjOJ8Nc@_Uf-X_ehjQ zJuf+mHi1r+Dj`o#uex>Q>_j&seSlXbK%Qm^!kUut4#&(+JJu(gNfhOb3RO<>!fF*i zrfdr4Hu^w5HTw0QeL4Z(-$ZwJe4VeZL=;C6KpEAb>~~2z7U~Tq=eV=1%rZhr%7Xnx zN4qM3ZI$u8TS2pwYr!k>+Gh{ds#sIpy;`xyJ6LIgi*jDwK}2IoMVU)kl?y;q@C&2d zB>grN@0s2uT+tp~^S2?zi%s^BUvjXE_|*lpPg?2)`bivl21YM0?Tu5rdy>XEw2up| z7)pbTAcA2At0Ty}$y^j>H#Z4s@)OT7`hR^_oODWGXl)3Hb|Od!#{YjE@_*8CdV68L zFu9+F>+uwlmiOAq@zjv4-9+I@LlbdL2fo+=k-w<^GGQKz>a`W%0^M%;UR@+78cMU2 zrUaZ^%==zt=qGpYyU_MOELwRicVBsRe)ty%&kW0!XkFDL7|JvlT66qc2;6x2Zfcjy z!)4ZI(dUrkxN?|7TAt$=hReN;(pWI%X?J5VCpVV=4QeG(LU zgANS%=4T0brw2$h45b!Y4u}l^i2o}OX3!!P`wcmse5c;}-gn)w`wLZ{7n8wdJ zQ2-V^JwvUD-zj-*-_R*_?fWCg53pdEM(|uva0X%xW=V*hEf5$EXKNM7cr!tV;g=2! zhqvVsvbWS*M>M3ZB?@gdjjU_&82XF$$gT?R9KxrpoqObv1k(ZHu$FiLapR$RFa^}L z@I%>=N-1Bq^|VvMS`md5(ER#<9#~82erpO~n4#?OxlNb`>?OC@%OGL)FAZqe5Zj0a z6EH?JwOP1z-~5t*7JwF2ur6SF3}I@}5&}lL@Vxihx({?Wr2BKuW)KIl=4%Nej1gI_ z1a2LcUls6_MVI+eXed}f4s2Zonhb44mCS(e)7PG4?P>tMAlM4WUNS!h4DtQYrU#$= z7<|Cd{8B;>6Y=*efOA((9gH=kOIb_hr^{Gt0U!#U3xP?1tC7&Id&C?r=l~5Yh0k#Y zb0gFkXfp}9!x3X?QcEr)pbRYm+!s91#JB;j+zMeTZ0#^=(5sOU>7LwxuJ z@o2Bc03utxariSYK;F-3Z!&a6bVB9a*g3T?j#x`oxPl7cOrRpp65gX*Iq=UA*bb0q zs&`~^D*(tN2?j&qCNG7t9M{IMJedrxhq}W{GGqD00hxx64}!%E>IaU~9$nKwL_=Np zCChMIw6*=lx4MJN2xoi%g9IglFGke01flNaLYtw&+=u~@K!?HOx?mEz+I1G6ZcqgL z846%CN{IkQSYO){aO*Ib@NJ1I)&nu16v$=j76U3w@n!L807)U93B_(PKe7(_K$M^& z1k?hFhmJJ|MGR08&(QpQ)SYHGOox033-Z6cegOzZ&GjRk(E&-STtGGOovK#r`h;^(31jID*B?4?3-c8T&>J?_4g)*gPhRVJ zeIhtGgTC~F`vwsxg!xJc@TXvCvBzF%a}B$rl@!Jx)ID;I4Iq7d8WM%J^rw7;8G6Pq z*@g=!0`_4oZC{`84>F@KJq(HNS$rZi+S zHSROvU?Zm5ZIJIi;R7mwbH}U3w_FImP?FRL0U1DQcwaW53$n+} zq5R-E1DI_JyB0q#?LG&962|@IBZmQadPuU{GGud|>|BtwD+BZZ*G*W$4%4r-f`yw$ z`RG4XKXPn0c!k52E#zAdLWS!_D7pC(sJvnYWzQ0X3QwR=h)m^F1DyM^W(-Aw&6WLw zKpsRsB#B`a0`I5362sah4jvEf#VmP&d+z{d{2zHRJm8A@{O$S#;#G(A(J0LSyCiwA zFy(m~uKl-HYd{HF%OIQ(`MCzJJ^HH-pkd6a88ib=5Lbje2KEND8@FhzumZ-z;yh-* z@;?>>*Z(h<44gw*v%R*=12w?;3QBf^kG>5WVci$u3d)0*L;X8|3E%FMhJ+9n;;~=d z0VE-FrZ9nGE8~D$ufc81dw5(y6>xi~Kf0t6_NzUhAb3s{13KXEj>Bgq#jG3~FMLIxSwVcO4{P`S zq;Fm~dHQcW1kV_^C9rcO^P$Ljmh_VD6b6b5E*BLSmS9+XV*J-9!e6(+z#@YpRwK!Dt#1q4p>K5Ivvv)p*j6M~ z8SN|xjF7)XZVIm-SZ5@i;?Gfy%bTx&_P4j^2?NjrscHA)xZTjK{=rSc5=8#tK97Wf zm*WM@p>LGoM({7TfI#wdN3myo%r10Xk>l;8qwd7F-ZxatduX9|n)3qDbMlvhwl`+L z2gA8h=$qrzE4}JRh;aYT%oW@Ps@V(1!CR29FvPdP(AmPOP?XLu<0R05@~@5H@iCGh zVctiKp#uF^XD~Ht;J@n%h(Ltv3b@a%7;3S?{@@B`T=hBBz-RL01bfy2Y)aBM5)i|g z@XzMjkMCa*ROm*&lYT{H6^|?uO@(Kj!ZwBtcpmFKrXhLD%M#fSJ3xhY$`m9u|38)>DXeduDSa| z>B(fPZp4$A8VhUroQg()UuPcTCPZ>%jCm@q4*_~|_*?5X5XaHkr>7Iq&(+zdSO<&E znyJk71>MEPJ$){U3KwiNf$t(otx4C6N!kluN@(3;c#COwa<(=Piodn^YFrL?c{LVY zH5qE_vJ5y$Ol52?H~yto^uTDiW6{p|V{0z`sjo6nHZ)MlO4e7`(rN5ys}9hS)n%2A z*!bO2J;5ivnIW2$@r%E|y57*#zgIqwXqs_va($iL;3j7i<=1jWJu#i3A;0bDYc{Vd zovoI726N@#mH0_|TU*VkV3X4tZ1ws~9o}|784ZOCgxO{E#IE8#3yHhkryEX9?8HWw zg6N5`N-brVAL(n^ql>dY{K*&@uibCdk>@-~E)J?H&2zKlC^tv}V8TU|a z^jBGgN_ulj95ih8ChvpZAgi?~!kCZkPOJ?7!uvz}+VsiS#E(pv#wp_;OHwg7L^S#S zIL5Ko!8vg`D{dU?vXV+8aEvPSGCMwx)M^>oJRa(bUqVs#;h0BAMr85V{CgJ4@{NP* zo7$l`pirEz_)ew0gmhQ(41XS*=)J}i*{ z0*Q1%EflNHE~;S!L8JCEmPntP_0N`t!UNZc$ZDsyPoCWrmGW2YgYa-{ucKJtd;rq4XPjdLYI{S&CADw4t zCAAU&Q!S*_MF>FxNrNu{94WmYMTM6xEo9eAOBR?0==Sz!$Ev0<*=Pt?l?luVZQ}qM z2|a!hMwJ#t!$sK2)KS*<<~qi$Ei`-mV;|g@V%GCsL`bt1Q%yH>>b9ngaER{IHeg!G z*}5*-G%H~f{MickX~+0U5TVe$-#Zb~-M^fz}ZM6vY+@y3$TsY{vx6anrlAGZo|&_iWQ? zBI8mFgNlyTw7W3kjUFyt(r#flZ$j5u@mW{$6|iyt>lWS*$eb7iQHeJ3wVdMCYxkA9 zQ>}I>gIcWAzffwMQ__g1h}i@-i(k4J6lC&Nq3oBT-q?efHiBF%RO0V7iU6kdcH?gouttva*` zDT&b&Bzjd2ed@xatYVAiO!F8Su^_&dRA))@n?yF^)L!Td*!51razG3r$eE#b{r{gUvL4Sqx zhSMKsm2C9voP~m2^}U_LIY~ZU%>L_uCcP+E8Klh?s}hr-+dtZ-_I~EBb^-G=1DTNI z7{k1MeGWquiRUI41hfXot|g2$1E?3DHtjLQ$;wmj6i>=-yMjV|=)YtA*{lrKV_gfzbP&1z!I_=9C9N3wc61XG+| zrL^fxGvpKumPX6VUNa}PE29pxtOQd`UPuavd(%7vH$Cbzft ztY+#bR&4CBFp<9RfBE`WUQ$$tj}5_yrcW|FyftT~=Zz>&gFhKGz82nUjNjvBP^&VA z_#K7Zc#-b2xDg)$3c_7P1S5MhYsLA-IN1sUmS+piF>?4A|EC4el(lw$wlA$)TdUIC zmf*N&m_%+)5>zJ}A0d+GfN5~?>_tTLy{jYO{x7~0RG|$!4nyc_OS7p4Sy3x;xl*nk z!64C@U0j)VPi(G6<3R3{GR2?73&RG;NeYZtzrxAYY1UD=t`zax5rfgS)ywMN$k}M< z7PLwTan|b3rKqv>p&q};p3UzK{BJ=MdeDQDw+4MQ%qVy;iW z=l@8UDQQyFF1}i+l@?7FRLz1!ufpAUH3x1rKXt~2m1!?wOWBV~YwJ)ZEN6c$8w)pg zGkf;uPC!DmeU3cCw7fiP$_mBt)MseV&vsN~~w`zUUH`=A?boV(NCE zzWAd+O6dzh4V1dPm}Y3NS9g{ETPv9tft|=*LYcu8Wq(GF?4e~(;}X)bd|CqDRTy3xwrlAdAVKo$0ZW$yk_txcALPje4b&_$2h zMA_h@+)9eFkt37}FNri_0*>wLP%wsmu8SwOww}JeZ}j!&j5>1FHky>tD??6Id#B=C zdC70K9CDCvRsn8iy1PU`@ya;ags)Q)r~jP1SZJbzu!F`tXASBSv?gltbNZ%FZ0UWE0+5X7UyK^onf)-NhV*H$G(mhag|hUI;utyTOluK^7Yk)X z3R{g@D4a8wTdavxnyC@{8gh;KlgpH$a9Xs6nWO4l!}46|WD$Ni$?NAO?31r3zbX^k zBR4i}RW+K_1BLtLJ_j;Q)l<+wj%jdxzt=L?=pA=*VXk9RQ6XrS^T(|C(cqXM*{gf> z%w|SR_;IkWD2Q8lpzL3;<=Wi)OG$Cnkpxs>?$DVbjoy1k?C`H`%Eu0fsu?BXdk&46 zx56Mb!p`14T*RkgT>VoUt%Wl0yK475rBKpJCexku{+}CT8RRX$OX`!6KaCX1FCFMs zv-KAc5)@R1w25n}jI!wHa<%V<_>I?eH3S_Gx*MVElz8h6nfSm-I%`ORI#t~8zPn|ZlEE5!`A$!eaoVstV-CCQAgB}-T%!H+pkb2=f z5IFPQ;ho9*j_4B=BSNIvQAoonP#)SWf{oJ|)Hf8K=c)zH3-tvLxt(GW1}-WfDk6{H zYq9=aKzW7rcmgsE-_@ka6ujgd7ye&I_AAcAez$+JrO3FK5fcBJ1|r+);&hB^Qd9{( zj7OX6K4WL4Vsyxb?-el_GuN<)$i+(7W$@V?RkMgl+Zh5>{b%YZvi`bqTNh@CU*Q87 zaVjo$Z?EU)xwW5te~)-X7k}fYix#!ZzP+Qt>&6Sw@R>~ygUaZ${p{bCa&;SxRd-Y_ z884gmf=@@>;hJ=1E`1*gX$aLCSY(sl7?yNYQDYDb^to&_54vb%u(yRu>&V^6qfuq< z9H5(WNN8V@9DJa=^Lx14Go8o7MU8@h3Lm)ah*pp9a_jW=<=DwUUlm!Fxvr`SNiJL* zM0dn1v-{%*G=su%z`EuVIEB9K6~5shDW;0~cDsl2q0rigJ5%P>l(V;|W?>xYqhP>| zhuo-PZOhd0&{RXNRK{T)mapG| z`A>r!Z@0x}v<+To!J{<=_j=1|eHO%sj2uPj>n;_n&?|;w8SXV?@MPX! zH5^&UAcro3^YU&;2OmYT=*dfqu5(@@L%X0e_XmiF&5K2UPud5AVNc{_bgxJ#J&xI7 zPv2{>!Thjih=58H(5X2>28U*vhaDV6kAL4 z^mRShG}QOz9!>Lv*Al8A9j)_(Z{I50^vQ5Lb9F}28ny87j!(!r+3&7W?33evawtr> zx+7)|dTpdOYIw(0_o-^kCMMdw_rGAXd)SpxN8I&g|N3aqXEM<+{@+ ztdQ6-2=)XIMbRhG$8>Z9J7$ zq32XlZ5e%g%a+%^FP`LOZ8tK{m5!d;chaVOSJQXGPaWWM7|fJZAj>Rku=ixGkYx?+ z!?32SW{?l55L7BO0WGWKK$Ze)wy)SBF{B_4YsNw??PA3JxL)iN;!j>V{#9Jm~RT%OgYkpLgZ9q-bT!nN0%ADr=AP)g+#jO zMhqeIc%q@1^njQT8Yw%{O*@(|FBa$2bbf_889d*;*6F?EMa~BB!uh$bfgrKoaIUm~ z`|51|#A77k;3>X{Z_JYWv9YH-ACsfPwaK6C=OKq}x#(4%@+sh6l$*S&^!K)Z)g;fj z-tN~07rta?Lh8ld0;zH5WJBTY^X_cIT=~CZTVHh$rB%?(*77F z?MK|g{sw%TdVRjl@O_y&9muc?&Z}*VPtU)xDf^O+kG_5j&51OTs!`$%i!ork>l`Sl zAe>@!T2LcoP6*UpcJ>um0~Pz;L{1zP>}x!|jsvAGyxX|X(W6MKRMvlDQ6XI!12nsLbwebf`?5sclq~2~7U=v?Nykv+Xf$H9TfE&ivcDH{^ z^U(k6yk(fp+drARq|gw>&=UKvp2d?#Ac1fh{=qv=mNUeZ{Kr>J*dLN)&uYyf{m2r5 z)i^GFx?Yrh0@I!g=uT}_zwSAAoIDBGc&7!4U#N|8D*RCwwvmfhYTj^BRw+fO&7FZ? z(bJMD{>0OhDx08ZOf(9L~ zZs${Rrn1Jbn?im2&*sAP_AL+;s-d@;kXIv+5S-Di z@thFEfRzy@10&rRmK*+F*{odXvq6CWzH_-29NWA}sJrb;QXtdZ(>w=~P+M>HxZ#5 zlouh}x=AoORrXA9MCOG*$8C^V`f1117nI}-_;yYr*5AKeAD74Cz{CA>+D{*TDp0YC z(bj|kDbWq@`*4k;W>V*5->QfJ%(Iv`r z^RqK%nV=jXp;V_wbY*AFaHdVfcoRRK;cZYPA7G}%Bh`b1v^Qvu)|p_mw9?tcyLFQORKS+eDknv`rrp*gm%ih#s?$cdWyn?0W^p~# zlr=dqK<3`1;;960f8?y3wu!bDr&B2NRI|2MXC7tCsqPGM`=JFwDTx0$j6Bk}joTyw z#r%@!4?i|ZOvBPoYVVrZhIP`(z@dcU;qe#?5;-#Xrh4Q^&f}*v#m~jV>^wBGbMUKW z`mjACCjOag_9gq4hk~8okE#KVEoR@J{7`%rW2H?;JEr%2*;g_+oZh)A3Ua9&UW!q> zMpkHj$JNXFyUXcg?DCMY%i+J(M^ddG_uNn+l%j;;42~4%GpYQrUmM*kQB0A)Xcb`G zO6eG=3aMd<){{~w)SV20g2)}561tEy?v4!Z+}W-@J~d92C@7+cg=ADymFh8{kbmlF4tL+^KewhN{EIvP? zny?SEIiaK(mZUZLF2dTrz}Pp}V=!(w1BTmic99#!i1<9*LO*&B>>m;V<82U6n4w14 zXT;1m$@6#sehWeVF`&WkvJu>eG5`>7r!XADxN=UOYK~%YuOIjqoy}%MIUoJ|*D)Ac z1xoO}+3<`!?MuARm%PEWW2AWxwJoq(hCuhyDbbp<7c@4pT8{ku9mGYuyGQD%RvL0c zj$U(1ZIh3phP%0rhP(T8ZI-$F-N9YVS$GEL_yqdt7w$3sXO%VwcMi>^O0J4zya9F_ z*aq2rl~}Ile4NaQF%WU8b4=oJ$sl58{sSWKf4Z3#A5OKmK!%lBx_Mz>OVYE0n8+d; z!Zp8j6Y%r&;N=8ghCx1H{x*b5fBJq~Q|F-_HLAy{nc4RkUYZ6(hs;_0>J#UaGk04_ z#v~+4&%e0?YpS%(OQ81b5IL-;Tyv{D)x-LGr%oHmULoXC^|Me4t@T@qE|^KvFh5Ylibjwr!o`dFu=Fe=z&`an%Ghg} zY_jmjjte)vG33hbHar4l!yXoj(G0ZUQmk(!VE|mZK+@Fa8L|e7FeXpyis}r~VCGjc zrkS-@F-UX!K4iwTfty2@u(VD#e6_F0G<8Mu-)pD9H=9jO;nH>$@lBBec8O#jWde2( zgup&q-8u$K343#IfAiI$we08#ofupChzt>c115Lx#H`JPVHDfM#769>rR&rMgqZH3 zx0X3bmy?@fIffjq7C@lG4QT>o;u5Pz*iVcILYsl1t- zH6s=`DrO-~S?$+XCmcN8@k;f(O;FmvO=X4iAH_63Y$wL$Il`P-h13 zpZ?~lo$>o*TIZiSeD|PRVw`h%v)(ItE^^%MJ(aQgme^Y6RHA_3+sHLGR4ABAO2Lw0 zC2`7o`w}H+7!KI9)g9`hQW;3XUZQK)$KTpVt$FHl;};O@RR|(SMs&;~3P_h< zDJ;Pk&Q09Gu6|V21s+ukR~fF4I&imkUu2ne+3GWII3PWa2<_e`A?L7{K2Wm?fN&wY!m29ypgiee3bt14@zhH zLcWVraKkLdw$OCySN#@o-)3v528puUboNHGP83cNPvw8rq7g<3O($4b&QV3f++Ubs z=j*vsHPMhBkO%om@o>It{_%K>%iR81kK;aKSiFJ89!C_6r20=*JOXuSdN3z=T<

u_Zg`UMj*-JRe?!AibB+DOrvg=jO)tbh6U;99e;eT$gh6w`#!G<=LV{>K^!ryxG&nWuXTpvSv+06X>4#5$LLHBa} zzAx|NJ9@s1bbGd35yFH5&-~Del)SG=hA+y8Rm>5>_^${>DFSk*;PK$i zI&BL=g)3OqIVJS+038(2sWa30Qk}vT+VPcq2l6LD} zErNg7;H^NlBSDn+IM}Si4LHj4^ms&lmC`%Eh0mPZy&>X$-05| z&z;@qbAoy=Uwz}oj`^uNtSSM}`xHj^eaGBu(-zrqDmv9C2*>7!346ytCJ@2s>UxJ= zw6Kcp@hFl?{cB&^wK;>%2>6#O z=1fdwn}yw+3~Z!S+a#+vMdRe=RVP6Y~#&)k6TmAI7x5h;8ZT`?S8F00KO>shz->!{Evv+-{-?PAU-$ zyaIq7%vj&RO3;ek*|ZvDwm07`^1m7iTM@>@LlkUM8Qtf8&@ar;xf{F^GZmq}V4totxRsIRVmCW#ih z4y1klppzhbDrouWuY?dbPj0YRd&eE8{Ajl!eb+zzfLIwz7&@?8i924aGOt3s{J8Rc z>G^=^>nUiozK9SD zsMsgLD|QXf`IJC;lgbYqD5#Gnk*?k$@0IR*mh(KP6JFK^ifYMHyUFcAX_54M85cm) zgKwJRhZ-!r1}4Ro<>kMwg5$^+Nv>rDbWSe!oWzte?WDFgn#;7)EW@ReL?Fs#g7fi$rGr z6lzFE$pS0LK-m&ns z+Nb0khmLT1_{sjatXc2wB6!#@Arg~zxm z>+eGMYxB$%;iN=OBI zH|1leR>)N1bT7-n-K&ABeAM`Md9HCJq58Bh*Eq%Lk@6c(48odzG!^&!alb@Z1+~+X(zopL{&|(R z({e)d(gzldZOusE=6paw?zHN|{lfig2k#}g7g&vZKq-gN7;=T##a7|t?I4~ZKv++_21nb+Ktlw z4i)znTDv6J4%Ig^3|qz1=h9;@Rd)dFwfZhNt@qy$q%!*oSR%DuGFoqykhroN2Mqqa zekxU-PgOpFqW%)qmuOgk>aG*5w_XTS>5UjhcVT~8%7*&F{r19r#n~&H>h|*DJsz#M za)=$x+d8ecM96jd4If5#O+OO)b{Or4WRV~Jy3|f6%*yFBc9H_%+5IhlWIl~Aw_BRu z(u(AX?HkIs$Fy?0ZPF0ect|~NZL(7Fnb~W#wDxyDm$n9Vc1Hr&Zs!!e9~#}?LSaHi zVI^$I&_Z-NX(Ga_sAOL}&F>o!DO$zC0A8KQLLn)SAPmcJ6vD{D`WWkUQUvwFOLuoK z^2>Pi)&kPY!2zh6db^@kh}cd$7sTa%<#as{<&uXR>UpEfE-^(0+4kBQM&ku4sF%L^H~Xs=tMrygE3!Ilvyi+}hn>qr@PcZ;NT`7Mcv z8Nlc6`o$5O)|QzRtj*qSjNa*n!J}_r3-Qw-a6spziPxvcED4Vqs zvYKv$B>AyNLsAP{sFkcZF=NT9sQUwC zx|Nb?H#bG)J#Tzhf5h6e!)he0Zs;&hX$iZv99|2p&`+7fU$n?|(}EqkNNsj@@#c`X zN+mgPcC#>q0nSmRo8tp5MI@cN30J@S-AFBsQHOOSojH)~ls0FN&(!3aHR0@p=J>|= z?Q8bhr+;n76+#<4WG0>piFt&FwY=SRI(*jV^Y#zKksj8OKa4nx3gn$A+}-HUCx0iC z@=Xm)2Lt3tz2%F3_E#_!y6j-7Lc5QNzTei{d3Po}Mee=hA@!7_dspsx$tCD<^xIK? zbdPdK#I$F1txj#N4Q{C&o#v4C)y{WEX>QA`l{}}M@&EF(;P2(v8Xh28VqobfS`HDA zTKq1_S}}(`KCZv_%M&l9NA>qDJMbQXTid3x!R#F;*p!%S z#EvHp|8A@;2r`tQGUNv34yYymXS#r}c^IjuTCox-lDrjq`4;)GuQ z2iObX1d21TY`rNlL_@wek4x;<)$TZ(>A+rW(NwAeAi= z?M7aS<&5h?1P`c#D6T^xlDmo_QG{D#&8n~ho3Zy*-QO$DMKqtQTYd*~V)?&nD~f{= z{0^wdR5CGFi6%LF%5IQnDpH#aQaMM;ZqR2Bxgz@O10%czwW3B_^8iaY5!8D<-_SeK zm@%`=jL`%-CzY2w^8k5TFK(taYdd^&E2qe&wjr&QZOsMz(y9AXFRP(7Z>gbNMk zwKN^@Q7l@S-3%5Rlok4_rQ>SwE6+olGL&+LrvxU&PpdNY9;64AMZyX1*9oDo?sBb_ z7@;p;YCk`L0nm8E5EBJYNUcF815?Fgpppl|mt<4nhd6)__M!sacO-FAj{jj1q-)i# zK??R=sQV-c4lk-HbwSbhiLz=j4G+A{VQf7$xM{eg8GJEiAvTy{ncL?~%c9C9F>~&< z!~2Y+*Q>M~LCfYJ!O=V-^csq#$eAS3jbeyMVSSuD?K&QCzcvN@nlJxX$JI8}7`b{@loW6aOQ(#lSg*i%6npkU|%V zyPY&%9LM{hc4U)wi$#lzRSTAtoBQJ8l}ZNtTgH|2n6sN!v7GN`dsNeub|XW5;&Y){ zp!C+cc{>xu{HJ9G;SCF4=^u`6Z z*CzP8^X?lC!I!MW54C=@xvi(NYmmpy;F4>(!|T_?ZRjx~>Kb*fhqW;NV~O6^y38$a zsvR`I3(d)1L+)1TQ=7sEShzkVFYQ0?L*;I$agOo1w?R9fz3qUPoVgl>k1eV%@Nj_# z>?Xm_*^(~^jqeP0jPD7mFZe!8Bn&_ucDPNTey7?96V2l1sU zpCh6ITFHgrrS_D1Xy5&dQ(p&$6Sfk&H>j@Q9ygc_D?9(Yx{l%l8La**I+Atz0G@KY zOy*hFJ*R!_$^LyI=Q)t$NOp65bI;oWx0jTWw>=hmmbGg8241P>mpt@XvO@C)cftMX z(yZ#2)>Y*<$Uh@s*mI_D>GPv~jQR;}Q~p(w+1r2@Yj$KmJKHb?7H z@x+#j#QiGPv8}sItj#|+u`NF>qMP5blP;u&uUxwn4Qn`#*23`aFD7EN-bsv!-WiOG zJ{#(^9+-`c0%u9eV?;zZIK{KgvPo@Ofv5_&#}NuKQI5|0ciETGR*tkWS&nMBZb$gW z*1)zocj9CI{n_lQ;eD=a-06c4%T82Uwyj?&ICdds*hIl<*!sbUY~2XD)*t9=)*twu zi!Xc+1!GQ8li3?}WuSM|!|tPSp(n%}abU zMh8arG_I^E@ND%d@nh)wf1O`u+FQ;}HhP1+yw?!-t)1GF%J;eK)4=zQPU7v~OjAT= zdO1C5Z6tmn9#&r{N4l?R8P5mX#{9|OnXm3&aYrnWAxAQh1(VBgN9os?teHeu_{P49 z_C>EYeV<1Pkap=km>=_CSipK%x8^(8imL7q1~toFTr2zCj3w8Q77a2uK>aY5ui2&2 zVAW<+sOF)VmzGoHQwt_K!GDXGx)uy{?UQRQCxmoL5C0bbJ~S`lZ_PRmG*mY2hBxth z7rJP?D4n0&V4erxR4kS45>+-t!d2c!jcBByt81!b)YMng@h`PU_(6AR+6doYzY5sL z;ZA#a;VoFh|7E>+UnBVXWq?_Hl19!&vbpd4qVNH@3C=!@W+CYBe18}=&3Zg3owM~( zZI9P3iuctM|6=-T*kGRC@3~k!lb!$WgXeX+hFPKv*unodC=qkDl*N8l(eZeM z69i4bIdo#h`;Ulq3ZHf8%<7S?+7QlvWf^y2rHZIi)h@#|!Q%~KrXQhK@Jzna{QqCt5g z(G8@o{(U57wV>8zhS-!W%Bq$cp;aoH@NG8#SYvz>54TEcLR_^tw&za>@tr*pDnd*8 zr2WJrcF(8jnL8dI=POZ5mE2kRol`V6-$*v!@?-l(cscLAZa>}mB;WtDLW#=(NBQ5xMUg)oPglo*z^-PU<3XEGDu^^S!#bzPS*M8XNjaiV#HM6fI-Dj$A zx%QR<3i&M)Z3_BfKlS$gVL!kZZ1UFkg78xmm`Z3K=&PrcG%xj=D<`{N-Nm}j7k2XR zysVf2#!1OzAt2TnZro^Os{oKU@ZogCs*S-cm;B56U&GDuMG*x%z#ZTV{Nv5-*5Iob zaYOvl<|OS{OEKLKNZv>t&)GjbQWo|Rnc-vXL%~$~Bx@mGz9y27P~3AqKc<>F*xiRz zzI#6kgVq^(OFO_pV=k%~yoIneP}Pv%_NF$`5|SbWXej+lkIPciPdA%XY$%25!oiJv(UHl7cyR2T4x<1j2S z^&wBRsu*K6j4-=qgzhM5+{@fyeBwq+d0K0M+UqkGC8LALQ(VKQIJWp64$+rr^uR7% z54|l$ddAQr)PEnsq*A?p%~k0~C7+`vGM+5ej3gt#NO4eK;iJuCH!ZO0VqDYtOr8yE)<0LEUHzV_bn`Qw3>dZv^HbJL*J7XSZPdNIY(l#V)GV(H z85$)1i+QrB8X&B2S>10mzPMe}d=kBs-f08o=5Lx^m)kVC&FeLmSQ4$wH!)rCH4bcbj?brDo4SXqXOWt$9*r-#Kb<@D z1h(}m^(~oZIaXvI*Drk@ye>@NlAgZaWS&6ZI$TA+7xc>f%sEa3)?;|5^@iTpDqamb zGOkTpZf;%awx?om9eIEi7wmfGHM`I&1l}opAuTJqytXxmRu?WGlJ9?g^L;qiRHlr; zSAVf9u1PCfnRMX2ii6V4aIaVt%upMJXwmSkl40JaE;SsmVET+AQpWi!0TmT1Fa`*b<}89V0YAPxCA4+Ae_=tE>V6~qK=7Y@1; zGrP^X`GUGQ8HcFg>%TZWi627{-(}?A^5lLneSU~z0)YoavN!s&cX8yeVQ3%f2_FTL zUkMQ3P>FudfqtEP907jb-1jy#lV*V)@ME3Y-1n4;9+k|og5BmVzUJKDpX7J9CQ}s= znF7*x*V#LO@|XL7o@VXsR@I&g?G8TO@p&4hJ2WNAzqB*g^5(u7Dt)5$uQcd3#^U%|vg|}I9m|Jq_gcNW9kvjp&o0j+wC#kP6 z7~ixVj%ZrPJ1^3l*WdMb_oMv)Qdoghh#royZ_++L*f9YB{%Z{~+4qmO8mQ)%mFO#0 z!pGwJq#wnYzQ|pV)Q!Hv9TWNaw@>jsi7my?NtThC!AS>>G5wCIkLQFB7n4svs2sf-+YD}InSQ75=zuB zu^FHOxT$dC&<~w0%+(inEVefKxZk zrs<2O$ba~XEzUC56S}jVM*mHm*b}v*FLg&Gdq*UG!;$pCK>nQo;fFW2Eq(TlE&P2h z`Gvjep+LcXjY961eIO9DBanMwM|KO4+YyL4&=*Pdqfz{7BlqLc{K61@O^g3vT=iW> zy>w$6+x}@;!JBQtJGaD-IFyf;qz@~pFDjTX+eANtv2XmoZ;-K`+ylR?9lz*`WCyH=aC3Y_~=3TcmU4s9yF`_a^D{p-UM)VQmbApg zlE1zqe>^nLDi+>*gZ3%d;StECZVMy{i2hh2cSz(fr#1z~Qoj9=2(#K97*cSrHhlp{3VqYpqIR0D0?fe-chr}H|_o@pm67QF1MmneX zZxrI%8DX=q|1^C|V-esPOnHJ+8xrz-R$pcUtc@)E*twiRvS1$C@}SrS7N`TJP1)B2 zLZasnZv)06M8JPsq>BY{*kuMMYb~*Zg+YKrr~~D{+SQ9_5pbw2_%fh+HljBebyl8P zmN=G`*G~Z$utah%f5H-J1LhCv;LSIJvdH0q zUoCHuw#E_-`>2t6z_)<>^>mc~%;igiFhaRCr7ZaHFu5U;eW1nq+CqrU%cL^3Gw z2F<8y2~2}l{EgbJk>MQaZ?|NHleSH=2V^pUp>_8$POsDdE=;ZcR*9i#`DS&px>yML za8G%^VwNS_A?yEnG@<-%QgJ(v%RIi zi$UWWK%_dg{Tz}f2e#GOgESdGu68Z zGc`<$)YK9Q*VJ!|)L4-|6szHTYSSTfRUjbw{JTVdlYGh_o5}YQVdB<*iXEyPZ0&7D zHlkuN)G^VCE}3dXDR)z;Rfv%}_{1x__F`gVRK~2uw}LiA?7n6Q5tqt_FeM=m?lvHO zFdb)Z&K7N%U}ii{n)Sz3kKc==ao7%My>1BaNJLi`j(Eokf9De1P?g?TENtydZrv8z zAkrMv6^X=?51(L5A7yI@e}|*7C8uD-8sz#pk%ipyH{v{quSW%egAF1v@qU*5AXLba znGSfFMcSnx>yowae+{q#N5wRIw`@0r!qj-}AeB+Jrl9je zR9&?a+Hm=~RPCo5i@Je^T$v%e$)t|+OGkF3qqd+7Zl)B~$0h7B77T8J?_EuiUO6aj zq$Iai5nt`n@8uE?>54>np$>ksMYU2%IV>yhwYD{aIix2g+mSZQiK(I{;& zB)7T=ZggnQ@X1AXS3I@hkX3CiaAS+^zR|%(48Q zPBiGCsTBwu1=Rcd#G*eFQ(UPdKLdVVOEttN8}7tPiQlE}5PA!C>L~l9i`axOt6YQz zHr7_T;!xj;&y;8Y$nOo*zCbrGdzUF}#iDVbAhtC~mH+xpDMU&WBW}YC zmGMcX*j`r&Td*z{VT4Y2hw}H4a2a)zav+h`ff%fsoa@<^374tz!X7H)%a_Y)+ucePI(@+N~s@b-saqh@WIuu5cy?ZVxzNG|EpgB$qd+3%1Aj z)3Pk}^HscCg*^)VL5_4)A9_*FcbayAH71r?5*pNcS+DZshPsJ?-kv~gtCCv$5_Cbmj7mUZXO7H4 zGC};Fgzg4TVXKbJ(d6bpNjAhM9+3sQ_jJ+q1MjA}l9JY;2+zt9%a)Jyibdrh8e|wH zjZNCyDjr-6Xnmt^XOVQ+R@&=L0Kz#I`Z!b4TuDgdbIy76#Wqp_Nryh8P@%V+^qerA z*=epgq;>EIn@mxtN-fo=mFKI!V>xWrrnKP_m+SUAtGCiP%@85gnDToGVMyb~!PrG3 z&qaQgfCh8Y#dNONuj7t#5chziq(G9{#~+nw=sn;xDPtTuM?9(P&ain=Q20!tDpWOcrw5Y2WTq%4 z@L%k5iL%p&74emeR`#ks@HUi-*kR|~XEX@9yZoyIT;Hw~T;KimpPS$jgUb%xeeE)5 zDqQWBk?R%@y}-3D`|oR!W|1u_Ym==KYwxWzYoo1WYsW1tYs#79BcB}4nF;#U;vhZM z2wF7?M9-`Wrq{cfp%3W&-VCKS+20v%_t59qWQdlRkNS0i0hEV@% zzyi=37SX-^b(L55t{cIJ64aa@#++(y16a7@ZTj+m#qgb)8T+JgngZdjE(R)`_Rs8rhYAbH!x5mT9-EfrV3i z>!5?JW?Zm&p?Z?^Y%x>Ccm2S|n9}_9elp^Gy5g7pE#`l59*poFk=JJwE85$Fa0+EL z^JkAG7k50u%WWfMZi!lPlUQNpk99n{&7HdttsW>_5MLLAdqDW}Wo@c0&P`7&&;A`u8? zFPTqyqb3+F0Xb-(U)u~?xEeWK`wWHn69jc9#T`!sI;x=Qe<20-%1SU=LmuB{K@2DY zrI|_B{AUiTBoFq=iy#?5955++aq$RpC&nEQ2BL%wBHA^}Ocx$^*zw3TAMijHFqt3V zoq}lc8w4j2Qj!AZ;M|#bJxS1PUa(sV`VX#uGz>PI6MB3bdA!|xfGl}{Nve?z z$DGeqLPfuFyV;C0Q;Brd8v8)!*Fa6^2svRt1fD5ub|jt}QS5y_hl7^2I5wAoUk z{gIMAA|z*+X@Igszov9AS7@-Z!jI9%1-X-*2?;bpmFEKu>r5Qh5$-Q5+0lWwXB-1F zr-3oI14Hy+2DBmlSg?qkrjSDN89#l}RkY*+@wKn1EgS!&aPt(3GphmK`3*C%1cvkA zdHKk<5XU<+@E*I@gBK3}O)2sE=kW2$5$F%{n}(C=XQIEpS5xSb;0a;YZM3Fg3Vcji zfBUb`F}VM|VK1eT=wnXGLHV7C^u{sqRTPK=g0v1<+vsO}DZ%S&GY$oZ1|b#hxjy+f ztz*!kLwTKV*qO;|`M5RdJK{vJvPHbTT9Qu~iao4T2KD3}PRgq67W{0c2aBj-da%yeuSGS-6*mY_~DdUYeSd2Q>Si@xL?TEF7|TpsuKK4B77B zSho|_qDBWu_CF_puW?g?k2x=>IX8?s!m8V_vOO(`{LHO9kvtE~u@e}O7d2L<|1~?X z;n&WBS-`wdW*=KdXudrWsyvk?)H1Sbg*{|1*YAIHHL9*r-7F?Z!aNA%*^h;;PyZU{ zA?(%6XXUZVa;AS>;>-4P1up>2lU?^fs0?amcvURJx=~EX@(9+r__7y(;?g|lAo8hX z#grZr;mr~LPSh~RlBhsRSYQGO)q2)rfh3DNlOfdDJML7$kA^9eDU<>PClw^?67x7b zp-jJrzrVLYcsHD z`O@XiMgTbu1-Z=bdza!gPrO=R4Bl+Z2zJ6emD7`3%~=Np5@=$wnrZtXVyPa>BScP?_&+{_nZwCS{s04Zj^l2TFbV4 z?VEj;oYf(}9?#VwZJtILw7m(afQsDMjiB2?wkp(a^oM0Azx=}c`$CPU^ukF;=dFav zEB%FmYnW@N2Lj1e8RwDbkx;o*E7}xF(df-wc9`~yK|oIJ993z8Nm0v}(7^naf4VdI zBFK;Ijo9Ne#RF#*`dj?5Z~3R~Y2aKE=Q;y}@3}#b8Bl>K`%NXkN(AZEaTBk6{-j=*;d_TNe z$AnoC-M)MM;SxA?Fq$dROH#wlVn-se#0x9W-%In$->D+d3GWn#e%iW{)YHL-=f|YN zttchxJp~liT@mk|Kx7AyXY)vLazmQ`>c#nS3gUAyJpA)9booeo8)EGaBWSidv#}uN zCH}+h+HDS5lAMG3>eRSm{il?>f7Qv*W578<0nwRR7}*R5=x>Cx8fa3S&+*D9UMj|N zpqw3MmX%&ooPMbG#R>LTWV;_yeHoxXtz6mzU=0dGvmX@*G2j=>>>HrrYybsj)7ul0 zU%P!Lp71=#kBS`p;E9!dN^o}|IK%I$>Mbb5SqE6WgG+M8CDceG7Dj(a`_ChTNNj!^@ymC&amA-QsU_Iw z5|{LP(Qrb8W(R@eo`XOhOF4>nr}?A(lriOu#}j-Rz{Q3kzbUP0i z40DfjuX&UsS*_+5#>)F2-27F#AJP7VxEqTx3ky*qFBA)ky;6QIFR>Z(h&QlR;|MNm zI;b4`Tb2~#2<`(9DbJN{)E||#O5=MO6SE!en{O1@#Gux(80V^_ycBJPkmXLq=;x z*ijr|h|J)uV}v`(d#KNdQ?hVcZTG(!ReA~iss1;iN)b!+H9KSF2iNA3t-iHK zM%Q#-hz?1C2%7~3)9162I=2Uw6?5co@g9Gl62MgV^0Z;k$#K2F!#!KEe!7O%)>QGh z@;dJNXmJKpCX>(`(+nrmfTObUc7w2ndv_qg@JH5%PYTxWkBS0z?J*}0{$UdO;9(x< ze$pLHC`0V}VPg7WfnHccB6r(|%+LRmgkxV)$=~{;B8>NgO#k!$Pfb|G(a_e(%+Ar~ ze@P1a$SWfD2_pL_7bPP_wE8olo)Y$!+$=)uf;FW!TDq+^_b+;L`in&9!hE76$(n6t zdDtD@c5Z?~oVZ(f+`x1ROZ?fU%VB8ZhSeP;rGgmv9RWn4i{dn0H2Cu-hxV}=5@n1+ zm*HiB*Qr)?WJFjJ_&c4J2C`*dy76@bp_0OIQgyiA%2!&me%=i1f-5?17InUkn`v-__%X znn+tSJ0n@Rgag`hNw<5QP-vQ5V`IzN-kLwsVZZ%7kT7{i;a-f<=F6PT$a5l1Nykjc z8D`jdNN4y_6v+3)DSdBF3I!F6X1zz?u_pJtS4vawhhB}rz{N?8qD`Y!$TOIW$rMqs zBS(?3>j|DR5v+uq#YRZSBv~aXG-UtzHJ>J*1ZuK7sa8w|wW~VArexp}uo=;S zqF|kbr$(lfYgPi&Lncy#jOgJk&JC`ti}Bl(nnstf0J1~!RRrtA7b`oIl^#}|8cj#4 z^nAlBDt{L1Te`-iB=6;o^Hi!G0jcSkyiKMW5s69-UIa5ckHkylWnLkUTe zShO-5sI5u$8!4HXOsgEnCo$YkBUIxn4ar49+j#geHmR~EueCJX z_sxh1?tZ@s*OVyxmgeaGJVP}zSp+vDi>tiU60N~4(zPxL5JfZk+Mu(k*aUik~`ina3Oz!RH{%fO=%d zc3~ggYExGl<417|uhi^Y@(x7WNb3l1EujoI(2K~FJ68SMCq}%TiOCo%qImU`8`;M$ zbVPd~XC&xgE;Wu5b+N5XB5xgp^7vV>E_p;yUKOKLFLJh~ zDkDBGjW*13uxxJmEvJzZ$z_)?%3-H^X(ec&Z-2juymr=ZU*BYg{UxubC2>8Fr`aWr}2{@qDAj7kGT) zk(;Y*Zx3M&_foSJXa`AZfAU1oSOi{SzoDkBx6^@k*UmM4z8W0Mg?}j9!m%gTSvbcT zy6-Ya=AvW+2^8c=ohH&UcdSSmqJ%=AvR7j6j8;E`FFA)70sX#HKT+*-sq9rX?*MOs zpP9$q5mV9=7ATi{5DEY7_xl`0^c%3X{_k1Jvnu6FSE*a#tpe{vU+ia5Uz*wG4TrN0 z37haj!zegj-7{L#dG~pKlw=TAar-x5}8@7jzYtMN^Kh6}_ zx95^M#_wtsgmu30wu;?@dhMzUgFnwRYC$KMtziMU+5hcS_Z2~P<97bHQdeVNOT?#Avp=;MHR%VhcWRO9Z1dE zOfoTSz`NQ)==jgFB7ae7a7nEWX_VHS+B*;DSd_YW%VwR`)Slgdul>yZs4>V}CR=7hG-(Ro5a*7s>*8Wh6;fsdP4 zGMP9+Pl{l{;8e0N6|Do^@*!mp`44WrqqpEd5I13ei3CDNAIr3hQ+7VV-5qF7am|%8$(6U~ z!R4ze!O&g2fBq60iN)%zECJq4G1Sd~L=HPg={+Q;6}py3w=wF%N8{O4gU;QPH_v#JP&%E@hd7XP}Z8W+kTfR~SX4cWH?U z3@rR(pr4o5;xTr0bJ9tVaApcZktGja#OF|^5h~%|2dJEzfZa!BH#qXL4uMdgIX)sn zxjFrj{*~4;h?>u~IZsk)Ba%)nszF-TT{4$v6#JS~_$`=d13+Xokat zG=Djk0?oN_Eu)b=J;4?h;1@h$L+~zExC7HBU7NNt22P6NC8z=4Al{k-ZN5H}FZ+*> zWu6pOmz~B`2$rU31d#=}v(``|bvE%Nou*7K|B8l@pb>|YR*a9lY6Hx4{moEmt=yhu zINZvK+%eA;mb8!e2Yy}x!pv%-)(Mp|0Y_d&VqjE^PZ)V9Nw?6&nF8ILDu_NodgOAU z^uW%|-H-(G!Tyhp*x+z_wBez~3)UDP)Y4vIz@mn+0pt}caJQ-N|j<<2!(pjDRc+^c!2`CAT49(+- z<~It~BP(b3vByfql%k^E*c!Oy=a4+xmhT+D-CQ-h#v!%CINM;>XA|kxe4k^%>Sr8;yLq;EX?h zN&Q(#m7p*&%YKsPR18xyjwl^%bdir&Ay-V4b}NKsm%WFMTK5W~{u?WQ%C1ZzJbj9J z@UwX@lO-=X8tW>y{#;w6*rfHuD6c(rBuPrE#fiF7qvtS~t^1*_NKHfs@ptFl91e5Ay7^#q zb@6V7a8Hwl!ah{~A68F`Y+YqH#L8k<5NWwj5FIxDXOImxetr<&wbiDCZo)aRZjfi> zF76(rXQQM7H`iTsDI4)9C!qC+c$$dR`vxL~&HgVgz2BaLU{w|q>-+7(bcfCxMwsm& z(~LEqh+0-YQ<~J~iittp%5&8uM(L*v1S92Beb^J^bGm?m z@@ny^<6GdkVe=i>nh#;-hADnRPEs!s49jv{gZlUD(_ccVZI`_f{ zzU}d>5WNNc<@a_EoeV+BmL{lzKs}^sA(zm>1}_da|6o^5Z;>%nU9F;v+7V*aWLtOs z<9_Pw`cd@S5iPxx7au>6!js=|Mj-qQ|G!@#3b`qO(v<&-n(eUhZ5|r?mCJMirB`5b zurH7cS9e@%PX87PO6k{D{TMt@@89Y=7dz6iWgIo$c-=pXlBmxmRC_sL;-*{C)0NzC zFwi@Bu;2Q?P3a%*lIN2-VBh0)i@cRqBqGxY*VI!SxoGuF+ga3T;FABNr#rawO3vDW z%e%qF?nGp9=R3L+D?LWg7{)SY&<`ZmkG%B8A?-wQ=mzuoVB{SI=j>PCrS8F-zH@O; z;Mhmkk7Mx$hkBvx1aj;XY(+l5VtV(k-|7>ZMQ@LAZV$0`XQkZpSyOIL*d9MOux*%l zc~G72JGcfv*B`eI>Fv?Drk1SYeIR>fnXh8_ru&Q%nGxOYU(m)ZzmP=&iB#dg(v^U5 zbb4Q{N<)CZm^TH|Y<@~*ha<^QUyaHIBY(wf$}m=hRW$;i6@#iQ!eWtXkqxayXkzPa ztw#`ruhBc8d8B|rER`_Nv*nSX%}^cTb2B4|#vE1chPB@YNKgGk)d^4Uw=k{ATHNPJ zD-urS8+oyU$q|U<_F|gBzw(3MA2Zd7v#aMK%t}OPG$g+F+1oZ3wzGTw&oBfW#fD1) z0R-e2=l@?A^5_2vL*U%;7hS%tCog~-tFu-%t9sGP_Prh&Mt49O5wG{M6GxJrrVBlpZSh2qON(r(EW?7n__LfGYjCJBMw=N+Vts>!ViV& zyw!$8xLNU4ZjW&Zmu`Q3kp}k+k|6j|bo((N3Q)NY&?26522NMJ;05sF_7}VaYIK+G z*|G5!8zXiPM)ak*;17g{Dh6;>?*a zqkYj$mU?ms!?oNnXFuIb`!bstrXAeX){ty~qAJ3=ouo_sW+ml9jfDbT$tr*8AP;>9i$$6>DDxdF(&PGBLgX+|k9YB0!xGhr#8(UvWyq_FS45Y z-RXp4pi+<)Ik>~P9&?52GNm>|Xm@27AzkdQoHwF`q8@BQlf63GG^OyCDUXC{?Hel& z34jMpT>YaW3wJG@P?3hYCvU4{=AzZ+J$_j)x;B}+Gci?#W|#VWs9c6fwVEvllW@Qk zKuiq)S_8F#TgBc)1KF0dB+h_CSpx&}$%SJ2vfjOi?SABOZdbnqo6)*S=0D@ZFdut3 z%V*CTkTlONk;Wb)v6P;OS6f0>T`2|7YFoN1+)u=>X?eGub?M$gtXtJu9f6ve&D7`OA>a-J8a?M$j=Um?w^D8cPf*PK9__mFm>)N_0B zQfkiS`I;8|2a&JM4u|`CFHhi5H0o;ko^B8)vr>nNJg%%!{Wy9M3 zT2q~|b~3tIc^~VrYB3)DproL|KyemqU zOhj$Lm;qLU2b334)=2Hc^Mn$uESM0$)l;Rv@)atoUPi^WY{oKRr+vmCO%Zubsy)}i%fmnZDX0Jhi+{@aW{I@{J}`5BdXmklgq7X20Iiacl-E(Y+jinwB%)~uF_ z+Q&){FFe7&i z30_+5qXU-&@J=N!O_nuQ9eU1F^^7;K~WOOL14AJArOMfDL`IMwb*hq;E29$pq> z>?E{3I&@2~$8GW<#oLY@aFBlHmtI!YJjDfP($BFs&h(}-q2*;Iw+P+*#uR&ZsBa4? znE(@(j1L02cnv7jGV54E;VE?U$^xMwl(L4t!nrhhHH30tTYxoxiuH6m-c+AZ)NiN% zWL#x-ji(rc{r{7((LF`Q%Z)8kXEiulR|4STclihB#)RgGZ zj#J1ldHI)h=R!k+N?RL#&)pVXf)$sxii9q~jlu5!qU@WxD+{}Wmwr$(C?WDqr zbzTuS#+4~w3KX_ zcipHLVkbJRjT1y^_c9o#DY92hFB8X`>fUb7!K_8C)S@kMb@Z-J&>Dnyk}tf(`WK$E z=>>X!57DE*B$h0G#q~o{quvy3UU>O?C#QQVe59(L7JlBlj`&lwYkF@yNbyRvS9R){ zXDJ%Bong&#M)WseLs1C}BopHzQwg)vCb7*}_u=~4U0@MGRU5H` zRr-%ZAHGJgf|Uw>FTp7gM8y|r5G;xl_M1AGJF$@x8hs{xSnOLo2?D*mGyjW89X{ zt}`s7BbmJhPfl0XpuGz-bp|69cTl9QeCiDUQ$vDqWCV#A9R_d`yYIJg%D40NimpP0 zY%4DYV4?{^2c#DDwnV_AGs6vQ8CEuBP&Vw%QDX{5oTR3ncjSG)tvv-)OsC^iQF{;q zRAg|!6eThLlHDck-XWw$6Lgh3x{CPsx`c>%&mv`AOz?$kG< zRR~2&uu`k<+;@PFbyCy4tXkM89bKwv)9+Knmkv;;xkZ>? zBKPSins$O{Yqh=-Th6yNW!;=iHJd=>8nO|(hKM@m3`0g5F10o`Nw48dA!CtRTJY6J5Rj+{^855b2Arw_7Y8$>|av0&{^YJ#J3GmOOFIH3}fzedQAt4kJ~ zOH7|vjQrqvQ-|$b2rwot=Jx#B)j&BbZ*N9X@F||D3Ge&jlRsun%6yA`+kFFPW@+ka ztSV>nGz_2moM@e(#D{KW`QJzY6~jzHqj<^#>4i~7k+^-ZvA!Ip{D6PH40T83nMPq( z@3x!6*(P^(3A-1}zx5K1TrQ7mJCZ$j4f|k_fQr6xo(Ir7k;T4ngeM!f>^ngx&mR1< zKDVU(C`JdpUXfHl)^_K#rvv<*FfOks2(PSEpor$QXR}=A(7AV9?LK37)`yL&ljuGu=fJ>A)>T2pj1igdqPVlQJVaxH_dpwEY4>| z%860J<2{qC=N*&G6Oc(R{5j%*UWmpoIX}tpsN7;SKdt(O?GE;{2LHq;(dp1AeeoUd z&f%Tn#qrbN1>~#E7wIeRo4fY$PZ_1f1Bw33-fA7TKgXvKe>Ixk=F@7t=QJgJ$=mD- zY1QrbD`!13r7C`wncnSCBL-;UEEH~*v03yp(s-Ulx%LyPBc5fsYM)Ht^on|G)TDRP)x$CkQkoNT^^xf90R=(?P}}k!0|kvzvsm{nNdNtS`a91C^fjC^oWq z(!0oiwCQNOxLw(j#%hU_3s@DwA7V)1(615^cr+z)dm+R{{ET?Uk^PZ&5Fa_CTsJ7X z8MUEIc|?I15WG<+H!F*E5Yq93g!j7$cjbQPi=q_>jYj6d?HuG2Fq-nKgHPz%6VRhM53_X%Zfko3Pys z@fn{0CW;MG^@^OR9U>%nn*UOWFVIr4X21W!h5kgo)%!n|a2_}nO6`U~U5LU8esJ+hO%ZTVnjE%n8IR=JGcBQezs{dC zz5gY`>OP(}p^WoxrT^}k35Eh)3whL&ar+`JGLGeN`(iG7pJ4->ZuhHEvm4f;@p?NV2kI-I zyRdc=GJ>4$?idUmkF$3k2L?UaeX(}Ttc8adI#Sa&o*&+59ZznMdOAX0Hpkh8Qaa#- zOdlKtH;POX`o&P;8Z=Dt06Nh=>h|f+EY}(?`B85WJ${zH zhBzJQ94Rh&L5-vW2Co}0t;K)O{;f`?p?vV ztO^Kays<5|$!;`n|DDn^9VZ=+!Syq=vpX!ba~ef-+{dGg%d!-Lw%OMF(z>QiFqQR9 zugGS3+w4hvu{jQnyNeJ)w2+yR%UEG4m(zxz1w%ILBOqb}PKQ4u_s_;@Cn{810b`}UnXEiPtfY5|XKx}^!XKmmn zYR0mQ<=b6V=|2R9=xW}yWhR08;wl>%A3F@YTRDP$)5mV09Y+5=kUMVjUe@o+$0%UiBOjXLVZ>xa_jcbJD`3v+iQDxQ3oLYVYO7A1*}$frKqP zk;|L**%K$UZ$rS;fWov-K@c!FN&8uIz~m({_C2>Jl54E5&rPN3wv&UN|>Wk|8L zKE-|Zi2GT2;GR>rZ*-Z!<<=7!aNz~#q$V0G_YdH|;TkoabU4DhJrJNB@2PRQ0wlyR zBncJO=#;jtC=$nF+$+NsvPsOO=6r*%0cf)}X&MiZ{3VRG&&*P=NSIby+Vl#vyldOOn{jI1Mc- z6(>^L2G=OAxX)`;WC|Cm&@L#gc#xU`_0Z$oTqG{LexpgM$n8?3v!IT6mCW;Fxhn=o zj?0sZI&F>C=1L1&#RJp#}UQH z&Bd|{_k238C{DM&2W0Vc%wmW_!q_&K)I^JnPnzX1^Bh$6)!Etd77d-&u--H`9Z1UT z1|m|&5&m%6{mDo)3H;FtWTVAlnM=|vQ-oOrImlD(0b-NZAGk zP}tIE2pwdNWRr~)Wyxn5cHO3Teu{~O6)Y$3I1f+X$q6Zt2)F(fX$0EiO(I%2bac4egQ?hN$ocwq|Pmq$|fufdaw_wYHE!xlQ=~x%}k>Nn|G!b~}?T zRFx&PX&ID$Gwu!p^h;CTCOew~5x&s$MW50outxz*?ikVJoS7DbyXI`C6(PL!$e3%u zL~EM448|VSX&Jl>X-FCQ5j!t;pJE7&+ZS5OUXn&c3bjS%vJM9SC;@)&hslz%XVhD} z*(j_Sf_kd`$h=AY9>E|Km&l!`kMxT&FM^|JPs@1PuKaK)GYe$b;!PbTZa86;S|51mg$wWaa^ms6x2PHH9(*zsgGq zB{P>@-iC9s-mycl)o$-atZV;R;=#=JV>O~?+K4PP5cBTNQb`~D6;{c221ZBKu0!%U z-#Vq60ML`$dp4d(Cux&s!*jMR>wp)BHwYvko5>=2TeHi?B6KF562N?@3-vo-wZTcvn1Zuf=s zIc)Y)6pZh^gSbp)+H-hmy8WXSYIKdkc2rGDZiE(nc(D)m0ys@{igdptFq!<=hea?g zrW|(Ajr3B!kKD?lBwU#oj@IQ#O{9^nN~&;PRm{!l=K0F;+2fO z3=7&Jtq+T%WL+p^73h4!1QBE+tw)MLkR-+4PRSm5_ZT~6^+atcWti9DZfTcV)jBdB zo7IZlb5_+8=!t^(s)Qo@(GhJWAYQc`>}#&BH;nF?54Q^+o>t+=(f%oK0OnqG&=ctY zW}C!gs@!^zARxE!{~6n4{~zc7LQPEy{mVhxRZJVar~(*?!C?$?Q5$S5!eE7YNB)AINJ6b|B&Jc@W6b49x_X-_WKI@@w$p zmfRq6jBQ7xQX-rYDEMm3RmL$S%td8%4paxs^fm%jaTV^5&RvX06>)!{hbpb8;ZS1H#$;ED;(NsyvtP^3wb*@b5|1# z@E5uqY-;H^$#{fUSM%o{)#kdb5~|!)DW!LcTXVSvuyJhkirj;$1dHd(xj|mK6_Oqi zK~(T!+Q1gujbIM}G@ZF~QP@=P$I998X*MnUr=e8+BGz z*0m~wL0maiFDfY{bB)p5+Er+hRm$!rP}qe9JX?~3>jpXt3AReQe)G6qhVj8MbN8_vp;7S}dF+^b1LA zXto*ai+&}z)|Zt|HJ+H#&9Yv$P@Op0*P&Z+{<|j;hx^ynewZ?jR{f{Fr1}6%T>5QO zuok!Bh#joq33sF#zSFJ(p!B7%I6>8CqnnNw4_7anRy7wP7fKaln&4_2wsT$&-%0NN zX4e4X#-%47iCb`33Rdv=8N3|EGZJU4ocr5&=7Mi-mm09b&p&_z6#WhIdt2w@Rg=on zgTC@Ybckbei6ZfxonmhI)%nIfrjv90EL-JcAnG ztz4>M3@pP%#77edi}o$)jhr+7cnf>=#l@me7h_~B+j7&~Wk}1s49)RG8DLs>Z zXUnD*U>|WsKiwLeo!p4Crou*~e~4=)U6A*@5cv(F-0Y#0)#nsRX8k_sl48n+4&n6z5P`$72dP*W%3;R0zSSn=K7lU^}mIm!gZ#x~bLDyqo zrovNO=8R!_oSVxu5Oz+ybu=n(MMCqG~lb~u*qnv-WUTRg++3^4jep3`!w|Db&0ff%yvn`!C5pZ`XZH3 zbvCcRn2Ku{enF4`TykOnm_`GrNT%BjPq=`gZRHpAv^)tGnMrBfu{~?+&T7^$=P9g5 z1F=bs8gA^zFilMT!Kw_Q%lyG}m&=5Ytn0IRN>6k(%bt1|xp^#vT6YHn$&umOeo99I zp?C?jRb;rF?@IV*22Jcuz_f)#riJdX9^#NI1%JUX7=Kw|imRA0b z+JBGZIoD|<-xsg$p5Qr~Yadc+pE90J$jLN^N*l(>(!v)>Z$fVscKdjtDE<@qFX}+v zu-f5?`>!1?<$Vl!R2p0qs)Zae)NY%ZaI}W`!v)cDDls-0h?S>{Ap?@kuXOhpT@J3}tap=009@n)y=ZF*aY`rJ$7++M}{q>tMOM?ywqGHkk6j!pUyUPVkooc?$z) z@644U_9-*%>`LpFd}zIe3V*9PS8x&UY6@`i%n|R`XXtf?YMvS-g*d!%htG(y9(3t% z@`1Ix{yWnM4+UJ)K{kizICX$Sxg3{drElc-4^_lCnBo+fXEzmYHG&ZnK&+fF$-f5Y zKQ_+#@`-$kBr?XXj~xluTnr!;Ekj=;{3lMT$2E~|f@D9{(7+`rDE@McH<*C#N_9Jd zGq5pJclQX05;{=;^;Zv_yf#rBS#CPpnV&N1Ct+<+r`ILMkZIH~3x2V9bRQC8Onb?e zW^a`gA;MrFtX3AG$UrDndqK|9dMS?Fdx;E0(;9y3Zo`3U_>0LQ@kUFee~%+SuL!mb zfcA9)p8R;}Ry~qE@#S&!O}+1wk1H zRDqy^CDUaVYhod=f~r6kK@;s%0slkkn@0Ud^K)jNbNYdreYKt`WW6?WH`VNz6E=(! zU|-a%g{0B09EQ=J9ayEk0J?ASzMiktlaItXDhcLV3NP~7 zD4=SDzAXD>trQF;9PQuHFL!{h)|f&hmS>g>b8SSa=p8iwLWv!8Wu z*6@i~6)Vm{wNL4fCQQ11{Tx5b|7hSnzMTAhX3>16!!epO8egRa2IfNu9QD;h$pOK2 zPt&P;Z{6t^ok4@(pu?&-)vxk`TnR5qEl=PF*|nyKlQKttYly$KYNQuDl5+@#EcuNu zv~hgu;xeh&YTQ>vCHaQuNW)WF6&MVxgRsVGHN>fS3awOV7!ACF{7P!Zmb1mPYykeO zkYSLFzV|9o>0bQuhRoItY22k()lyj`g0s!0W8AA-p3pvmZ_ANt&N=Y=xxi^;i@+dH zMOivAxytMJadURT^ck_VxVl~S9-%D%(#x^Q9c>$BgEz!p^u03vkkwY_xcqh&+%b?v z@^=$)^mFqlXOjZBU8Ok_vPFTRRA6{RoRspI#^#Wg8Iw^+NDnNIKh$d{K+Tsyz7G-2 zS0HcCb5ElW;s#jz9ON{{#2+--L)hGd5^zWUx!(=s+6f8pf~x~UVIPERC)`-!3jOB1 z3$aIYvdZ>`+89-{hf;cT^M*&+41q^1$Tj_hS~?}R4Q2i=su&ibePiMdWn6$bJ0g^l zMGbeL{17XNmzJGUi`BH@m;VdXaK#YvU;L|Wx?jNW)ZQ{u+jWzc54)?$H zl5Hq^4dbL~D1!qGvO5f3NQ6pAX%_Oi zENUnQX@PxR+rPKw+Nj!seWV>G5)&RG%+_RRcmV=n$ zTz{nvq01Jvht2kJ)Fg`q7puqZpVxdwPdPh0H@%*Bv1A}KW7Q~sP4pmCR~geU4qbco z`)Jb@F^m?C#S4n6!F1f@WUWsl3$Xl>zJJ+963}``B8QX~8eMyUBSO-$Kx;`bibmxD zdJa8pRvDg15QcCa=WhQ&I}US|ymN7Emh9=__SNq3;W}!%ME~vK2>$7!2i|^wSm{+B z)vdl+yH5y+G5}~C;25MCN3>rvd*J*_GkIFJ;$La;(fXcfUVVHGwX(!vr^&g06#z6x zHFb(aiz6sKz-^G7MWp=MI5y6^Y;-`Qt!w5RQ`S%)_bJl|2)n=?s3mKs^sv9-I@^`Ke5pmkr>|eGV?|zb zU>tWDbBKdN$fe>BK1-mZf2YU;}YSR151;idjDYx zpVR3&Nz+KSI`oSB=Dxdj7K!+$E&%&jN#@V!a*~28GP&?vm!A*X53VammXsNXJdjw) zYQD{s8xw72vN5+!GJS6$7Im9lK0p5Bt5ycJZzWpbUQ>Fqt6Hr(5X`4*w^ z2QkT>&8E3D$wnLkPA75%1nK*N1Xu^(X$9flIJgGYu`un@15$S890NfwfcEhO0>RSR zV=KdoX8lG>VXdz2YhBdM*>hjZPa#6$94w;BZ^N6AzhobZ*FPehCZkDasS)dq`d_uC zrKU1^ymYLTJ3ruqmT(0Ko>!9N;IsflM@-0wrzKF5qg=RN%^gWw0>ZHSBy2d zHj!S8IF~y-z+pgHFwe@4oK(!Snl>!9@O^->s&n#b_U$}Uz@QK70N@n_SvDOPIq4Vi zC?k+ru@rw;E;dlTKdv5LE(7@u6KK3uM&x)6NBs%vcad9tGHn;w~> zsD{Gw3+1pGGu`V_t{B&t%Q+T?Zxc?UEm=;v!Ve;^-MB!9v9XakQ7T=RXEu2n&#r_u z1hteB2CE zO6dv{s3dB+}GL@yv-f-jhuuMb0OA zyc9h1bbQ^knT*+j6ldA_O!Weh`jv;W>m(!h)K`m9Mv4jY3`z@s-}}ueijGsg-;^<9 z90wJs?RYv(AKMGE1l7+^%_u`V@GT$mbUMg_)-Bx9xsMgJXw%5uqu~Ci$lIr;f;|A<3Nf^yrn*4llfm zqmDpQ!pGps4!Q^Mhnkj;oFIo>Hr&N;bpB4|_AFeS*1b3)&O{N!0pc$^EsO>FPdrgz z2l;XAeob$LX4o+;*QFG9VNWja3~D8dIt%V|qxJ(s4ueMU!n2Yximw_SF)aal@AND= z`gc@9b_6Si1Vxw<<7*Qe6Y{jQfEI#!0H7=iqZRgO8mAr|ke32G=l2RH@q<>UR6%Z} zUzvyrLYqCxR;If0d4J(YlCG*LttzmTf-)&;B_%_4XMjfniY3<~0!bjIRHKC* znSgMtQx7dF1$V?dJQ07SDGm%X4>&(AL@3@8cs_b7GNJZ-CCTBA&oZITAO>0}8QUsQ zO;`lxR2IKYNb4F%U<^TPAJn^hLuQ{tFmMMG(JNa3MI;qS6f_fW3i^eDc~4Xv*B_$s zj?H*-LpmLA#`cBN^uBVscT*Vug^&0J;dt0T%A5`qHSp_MXif2x$ph~z zLtx-*2vHnEbN9=F>^;DqAJ!u@-(0E~)Po-PZex!ZtU3fj`hXV9kqFa7K=*9LL?TR{lx&ngM9j%BB@+Kwrw zTM%5D`f3b`V}(yai2se0>Z1X?&i^0IBG>;oi)%m8C9uE#88)xQxNSO{V<;epCWH`g zgJPfxlkxmHkv~E6MpPqz3wL@-5D~97pYX%iN-6ky3^}En75zUmqNiG=% z1^FooKTO=D3JRqNe?=vV*Mp&eN*S@dvLFK(p9Yu#q|6DhL+Zv75ds9G&e(0_?uYxB zWFbFBxFb*?bUKAuDK$AZO9HIptWoMHO=NmRxZIyqAf#|) zv-M5v>MT6ZuZ4?A*x8aTm9yp5R$~Fj+`%n*H91=6zTkAQr#ksWS)!oSr+4SM@IjK* z>7-NH?rJTTsse-88Bv|7e`9j9YA5f>S&7AlK>$bhxNpP~<6NS9JzoJYBgkv4N$56O z?ebCsERdzMP3_j>pcBSN@bw$NASGB&La)&{X|(VsJ@nWo%+6v~-B(4CldiG;_{{TJytr+7o2zN#fU>X} zxa8&8l$V6d+-*0!$~;|?=08NPI#_ASjD;n$Y=$OyCWfXqCYx3>8W^&3RoIcoN4a~c zjOcC_n{rgC|1Hogl~EpR=xDf5hmE9K=cQ|NIFnVkk8N*Nm&ReD@zNQgQyr}Kimejz zEZud-_%)GZuZF~0go!G+ z!xmHc2NMo_aMg1L!r@0^4RHl1&#OYQx9hVXR_G+veM93le1n@|1vOj{^J$*-N3c}q zuYN|=kzBymKO8KJ*i5F=_6=6FT=xXS(SG}nw0$EmvR*;v^U4|R+xPCr=fdpRnywLh z+h6mLDXVx}o7?HoQWgCgOP`NCl zDl_U(ORIfXa-8vSj%pW&w_+c%Ip<=~V^JGi30K5g0Mf8tXoQr{^Y}#PjRVQuZmQ9tgoS$fP%?NQgydInUI{G> z5o7#J*qjS}FbF(8zEo#r8F|m_cAde>TIx7b9j$HWsJ`jS>;UQV&=0lW?5w&u;Z=ko zyx-P(fd_oMym1gxNuXzJafzTZTaX@(;(@*bJ8zIG(fPOb;^@JElf;TMna9}_oihzq zJW!T7m7=di8WHuc+{HqF34o3_4N^~9)J}^C1B*#37(S|Dkozlc#xpKUkDi3ZLLpW4 zM@->?^M*4V*5^s&1~~#{2;1=n|HI0Oo*7Vz))C_UsIaSOb1zGZXei>HKCI5HKf*dL z2mm-ib=SW6>4@}FO$p7F+#|#vZifGVi)0iaBv~<(th<`}){zpxwl@6ZJ#QwX@ z@^rq5-#hc-OS63hkqM^I@scqSDR;C9yD6K-fqPW}gZg)M&;fWGDthPy=e`TS$TrUN z4+Sq&P))_u4uomwCX%H2V9g{^3@(jv@KzH(jk5SmYpI;~ewAuL@*c<2-yeonFV0LK zNgYhc1$_^KU;n4NK;oM9WDW`hgyTP)$L0Pn(5lt)v&XZ-`RWC(S@E4*yDzldFC%$Q z63aA`GpD7s$l0idXB<^~EX=tPbgnw#wx9g;@N`5w4hu+T@ zHinWmt~~FqEmXyY+vQ!sa;A-QKZghqc3p5A4NaC|sY$g@bG}PklbRyUZ4aIP4Z!AP zkakOq++^uqk%f~h*`O>%1mM9A-Ybq;UoMY%PT{E}EGKfQDN1|S;4=7uh zTZ8iy^pT#HQ!$HG`)uYWIbg+nJa)_nF|Bx_T=xg?x|{4_OOB^)488sO%~gMwpsVCg z*BV)I#3n_#-EvP;;Ki;4Axj0)J=79eB$NdCNNfE4hLKtCJ5wAl7i(jBX2~#cI3bxg zyQ+R{(70Nlq3`qUq}QiBu8PaX%&r9TW;L7svW-#IRYM1CCk~Nn+z!j#nW3o@hpnjU zxjL;B!J}g1E?#|(yUgdY-RaO?2g+Drb1epUXy=$rn*vuCNNKN&8W>ikUD>PVSm?gL z-^$qXiAa*y$ff2sLsNKCCerc9YZa-Jlwl&&s4fZ`gNEwl4vNrxPTVpiFUwh?C08C~ zWb)-?W(g1}_Y@wKx%4vK7T%$6^elC1Uqs>Xx?_oxv|OAJa(d4gYk} zkq}(M!4sUK>duNilbnTH2w#<<^jiyra$p2N$_3EFpo8*Vx1oa&e*gnO7@yf5ur?}c z7ihBztdV=Xxh9g9?B4erE9z$Vg-~MMyj*aDe`t9c^YKYb<_{~^@YNVXpQ+@o-?Q_Q z9BIa7+${psAK=mEE#4~Vs{;8Iay7EU|1uQQpch!PxmJ?Fd-lZVnXdMo8`G{uH}yW> zby?o>bq-<|$<|gfw9;_a7sXP_(pss~IT|`@@fC)3gY2)lgor!5=Yzvvs5)j(rH`0u zFtab!wA4K6_NUsW1~TM8%q}kt%iXF8tCOCOE4}8MrioS=x3bWL za9)|xaCLr6nbmQ8{$^!es#aRl!ML_RO5-J1@0b1ebIxbg|BLBpMaOfYYz|cw7Q>J5 z@W`Xjg=F`dPZv_MFz)a-Ls+@!>=c)TN?RIJSX8QZ70Nodfa#!1vb2t>{8Lkl9_EU; zMI?nn&M#iS+*+=d0uPzZ(|ZTW;Cye?V`NLhnnz8_8osZNl6T@k!L zS{e8AgT5%V6xnhGli>VuH=z5k75*`#>NY2t%!b+3` zv64P37|H#B2aLfONt!aVnwPYzH#lWncBl8p`^!4uT>`Z=5-M4}?o7p(7T|OfR)rtX zg_!x}I<@`5%EKqM`6F32DQLs3I-3RTZ)ANsw>03Sg0u94DEXqB;I)a*u&68NHjlK^ z=j@QWV5sfOi@Z!bH!9y%ku}?vU+li*b|Szoh>>dO@@&?ye@PBze&UsP%V?*ycl}ZS zG|qYOBcAJib2wiGAL8wFoA01ICfSb!pQ#&3h#MX|qYdFZS`znz{apQRjiEV@*Wcq{ zo-tB3a8@1AN&jPc8MO!Ai2V7N9FN^R=>&$lWD1YHWrkz{1v(5$l08Cqo1vJER)mbt zN7!9DbwA9hwAv?UV~Bl*E9X?`TgxgrU!1H*RIa7fsb68!c3~7~0Jxz)By9k^h(9LD zCpRbXeswT^z~Nno{VsZSG+zv^Ka}&6pZ5h$`qs%r=!+Ba_GZ`clhp0=XUU5v%Y@MY zieNbXm*Dk@(C?6U4*sctnDQ4T=b$h2^yk@I(tsb$?^w?yUljf$0kK>!PPcrYl-v9L zBOC8eUg=+;S}%I^zrX%)f1&Bkeof&%8|lymWV_#at|EWo@nIu2nS6St9eo*N2Ba(8 z1vDSL=U;+sJ7Du!ctQ0kA)00b__8zyGLJ}yN&Hm{1LD)Xe~!{bf3{w-oY zsEK0Ar#rS7{^VsE=|C``ion|Qfw0{YS4pxEb z>B;DSE7>LQ6%vK-M0OC`f9Cn}{Ez1g=Z3F=^LagWJ#%T91?XH$J6a-6bzEqnp+T_G z{h^SxP%0zVZL>&umtkKv4)81KZdL%(9!U$wv_nxw_5L%7uHGQs7Ah)I!+5zPsp?Q9t{)#-xpjx&Q`f%{A?e#2 zQ1n$BVZ`8qzSX03RCh^^%D%sK@Rb^2*uT_b-X*cw!ARE|IpD--ukH{d?x!O3r0tjt zG1aFa^sMfX8tDc5@^c}Y8gkrB4}SyxfDl4IiATrY|M!D1|N;dw5mm*TuX-V{~h651UBCGp|Wx z$CIB#ZXhucq=Uy2t6h~X0yk`GS;T2do-BId_?4nsPMVP` zHk+hBpNC(GKVUbG1K9ruAGhw+JALTk&Jq7`;W>H+_ZLAN~@VayI2;Tum>DiAz$#%2mdTFDX(#zM|~ps9lui zjK!t?MQ)~HR99jt7q-v(@GZR!Ls+tJyS@fL1Bu4mHwK`6K3L zB{5J<6xH&3d0)~2;I}Rw7CS@`6}A$E=y6m-M6IXk%n2MJ0_f$Ev!JG}b`+B}H`dAb zq9t5}R_(e%L^^c-A`|R*+ST$s7XBG#GgJ4K5>5wJG|^@MsGrUjWfaSM-PEkS86VN4hP$|&AF!A0Ch#>s4Uu4uwkhs4S$-Lt`0 zzJ)^w2f}BX(CIeT_4(&;7PZym`bSz-nk++|XW0mXb3taGWNX3>I01tJSimH}&fXLG%0x<~RA}R$K5H)=DfV|zsXsuO$dy~zPicv~ z7P@NbzaTa!;Q%d&9hIK4U3Y|lK|I*)zqe`1es`gkwP(%pKIS#CPtX_J%eRQ1^hF<7 z5M%5;(N^s58lib7)D*Z4YBQ1Jylk-+%i{Zmlh~MqW6#DFIj)c=_H2$Jyt%u+viFcFz1uy?J0*hM1WJ@g33$f81hty@8S5JXV5kiJWUt~=F7$i)e z-*OmT$C3R=mhu6TtCtZ;cXsh$v`;;PxM0d(8vn8zVSD&H@HwtJyqeMDSdlVq$d=MH z#X-Y1KeqejmQ0Bl+Jm@QG}>el+id+8KE0F2LOdy-b)NM7}tU$zf!1 zWZMb21ZfhD8yQbu*Qk7sOb~81S`ao1taif; z2>`|~IXc07>fa*ZQ@*7r-YYJiII4AC5n&%*VqXSL;$g2ZwC~nnZbY&ODc3e4pHWk7 zIo3mcIW|pWIkrvn`?;~IP!s@y;8sU@ipi_N`$19aGa!46C_QM)f*o8ue1ad` zJbZy0Ts>S4FS2GPXWdd;?8N+Gp)Y;A9s^$^GPk@(G*4YXS<~$P>R@D!hw9I5Fa5mR zLSoWC2?)J{T}Hbk#tC!dG!q*&)M8V?0=b*6DLgchMiSGou)@6t)tC45CgR6?B2`*h z$Vl_fSDM>oFN+sDg~+TH`%N`RhTw;-FFHibS-;$SzmSnQI_1xOBG9Op*GQ%J5IM&5 zYgBxGp-;fIRevvmE@yb3KZ4)ol1R9(cwJ@BS)CiIQMS(6+ko?vQT;*?)Z5_5CP$nV zf9Z964I0bktX%##cYF8h?%115oPJ?Uw62h>>_4?|m#k1&Qguid)l}W8*@@8#4M$Tm z4ccngbi@!r#@Dr@^8@bhe$np*I$vVStHgIH&ilmysbodN3gM>osi1X?O^$1|Dcb-2{6`)L!avW zPYtbv%GQ|P_rtUmf}HjC2ZPN~s0Daba}oLkTC zM?3I~_3uLjJu%ZaPV#U|-E zy5LuZId*8XEw5b%QvlK?yM5NYr~=-I7`7;h-uQAOf?Hby;hMl_)!htZ^<>g1d~z`><-A;nRoS zm*jb~Q7>+q6S*}xSWOa}le91LZAtlq%Xf>bynTTVyUp5gOeR-7Dekwd%OfX^(D}3b zz9e$D%{oz94Ylw1ZMj-a8{Qb**-R!#x25(GTFp`~otGf>CiS*B+QUeX;$qdb)GGgScK@S_R=mByj zzsb6pksMO&;(KxmJV5sv*rAiT&H3rJLKMJxZhPFQc%faJBo6?k(67G`feGW0s{fz`44L2WZW!VP28MZwQSt1#q2Fi9NnG&o1>~4 z$PF>03uG>J@w)p@-PDg09)r_GC`BPDLKM=ns@yVM1y7zXtXb~+ry-F(?;_nwMRI9~ zOJHXRulu;(@KAMn`}z2THUw!vVIDW14h6?j;7!8+=psp8pcI>jD@xlqr))3WsCf(W z`OWdjx?qIW^Ng{%vy-a(i8*9X4Tb#|gv4ze0|31X;%DwX@H#TUiMS%}7H8LcIT0T5}%U|LuFEPF1=fv)eq4&P~3Dz1;?gIMS>5R6m|58!~>EwQ}gWiO|{QGW%Wz&F;d}T7d?& z|Gh~&YzLB4UIH-$d$y412WJ$#-WT(9!dI<=EseRC?aB5E33i$fw6?@AD9m0s+aMPS zBRorOcBsVC)k13|oUA}KZ?NhbA<}zc6-cp`EL>wE9^G=mCgvF5iG5$^q~F*;H99rR zE@4sFln=Db(J9Z+4okIEo|rQIzYz4M!%f@&Cze02ybFr)eYv#XHL61Y!3E1ZnVHy& zIGU?kSX#JRIGS0Qi#gf5J2?J#$7-(Hh9jy7_9wuskWQJNmQc1D{jANx$IezBe$+ac z10`fE+XUw<$%6A5k@BCnFDMfyrQtJ(UU!X`4vGJN=gEK zj@}rdTeqd9qgFyMT7cn_AMuXcoVqh8M*WXKrQ)+Xv$_x3XAqxYx>s8U=!4z2&L zYd_v|b7jmg!xCwZelE4V8*7BEb?6a36xg#Um2|pmC^Nu%u;YA>Z(YDlxFEz#r5ckh zA<3$=V%VKNYtMy@(w5ots-aD1&O`o- zDe$Xk4UgHpYapVE`iY-L(Q>g6I=QP#V5=JxNnjeyLK16Inak?w=yc6B9lK^sHLBs_ zo*Gp=UTbOjy_)I#|1ow>-I+j3w|?V}ZQHhO+qP|VY}>Z&bdrv3+qTs?8DpPw@$H-Q zU9CSbN3B{_Yd$lrg+m~e$n~3@GM$_u?+@oIYZoh#z3Ja8f^pZ~Px4{Nd-K9lZLTla)Y(Qq*2aK;u{gBj zkncq_Q+iS!oO`GPRh=jdIxJjb*2t{u^oZ}lDEG~6m-GhDe$mOk2*kGd!=tNDGSSt# zGee_mPd3q?=A9XTO%t_;tpqZ<^ULYSUZ@xEuwc9U>9+Twa`-a6$-Z2XJ5mk{=3vJe zOlQ#wngwCU*^Fn|3aSOUgPmL+N+W!rS7er06fX~`Zjt|INg=gWJJkMB+}@Ak*#8%b zQ!;gSwQ*54b@_j_$Gj}$efVMnI8d{P-h(|udC2JZ^3(pj%J6F z6&EGC;7w?)U;|16(1X+YJ4kcZ+xL)TEJA4?T|D=TFN7AAT9~QiM6Q%XbOYi2wGaW} zR(x^Bg2^$Oq^PAV<-Ej&v&HPs^k?seGC!@Ps)d*LX(aDih@j0LUC`3eT`Y!F&v&X6 z^rLvI2G+~@L%y=_+&QFrMz&pO&?xE*&ywi12Q4b9p)n>l8(M?Oz%V7YC5^^vvm+)o zn_5DfBm4_3kAcSb&Gu-#CZqTwd+z13Pk&H9-arQO+~y%m7CknyJ_b}1ePAOKvoGeU znQJi4hUojydjy?cPC+cs7bfMqITFh#UwK$}F=tUU*nnkB21_br5xC`1|E$C`^of2cPJ)I&)<&CE- zkcyUV;YAvjC)7v~5=@_CDa(qyR>wWlhH)8ToVBNDqwrq(MWrKNS>NYVj6RvCQ)f8_ zq03aY@>a|&){2&M4Dbe+uRb#L@6z^;QZoXA5B9s=ZZr7<6}vcBrKdf1nZ5s2Apv*_ z2n;`ZHT=;l*Z)GV%9eKKHm1rhPCw`Wlx$9-t~IhCO6bm-O{1Bvwk>jRiZwxzqC5uH0Y`9bA^_HAXSh93ONT7`M?Jz-3# zr*Oj(HdW8hy?3&pwdmIJ>a|puq4)e9#5?D0$ax{+Jculw)c0&KSzQX@3fX&sXa;Mk zK^;-XpeD3XB0F#%Nl?=o8R`lyNMSh4hzCCe(nq7((yHdX%QqwOF$x))_Qef4`Q@Qp zshf%}vvfSEmiP3D7&-aZNDnt|tieATDeFRS7N`?idj{aJ5afFt^$vdp5nDq@L%qKb z0`{(1)^--rm0Ys|cJ~az4E>Cnv$f{SpPQBqi7_e{zMZ$aLMSE6XVtayZ#cz+x`n?- z`KFvZ2@N<>hGnpr(@P#K*LwmJsK)IMxYIW<{yIz%I$h5r9J6;aIFN~2tZD!4Aw1(w zzRfl2Ye~R(;K=$rv8L?h9@_}Jo-+cb^<)f-^&a~LfG=ZapciMrA7OZdOs~=yWq7e%(rnFIFoQSn<28w?{3jATW6bk`F+=d8rA%1Y zDGW}DR>4fB+7#Yt`R~7UxH2gVbqWmt-2dPjSpF9}RPl5$6)|--cCvK%X~_O>7p4yB zgK~uW-OJgSG({2|02=g55HZn|z<_WmKUsU_SOJ*AXld-41ambfrmG2y=XRM&?HmZ} zBA|p-%ZT-q$ytlH(Ozhgo#z&=6|>=qrAF^U|U zEbI`cY66|LG1?Ad8N6nx(d>|9^Fp~p`gDbM?O_8rCHywy}tA&T~aqI{Ck@Dw1T3CB)5Ax{VU0uT~Z>(+f)-P2VK7^?- ztbb^KcZ6TV^V>|cwXa-yu39~>KqHYt2iI#{lqZ{dcvx|yNgE~G);RmgV5;=(aLt!U zXxeJX&b{2Sa&iS{_fySjwbuH97iB17HyFt+Nsl>gW77;l$rsXPNvcypp)ocHS-dSr zY>oYiR!+DfN3_SxI@S&eExB7~Be`>;uNj?+QVxf}^tzHT*+Upw`BJ5pNz~0^Wfy7U z+6JwT8^CDQhVANkrK2&M>pe>@S~hZ#4?;e;YY(PKa8#aps3EX8;+1-W^CxA8)=CMV zVy)TDl4#w$6#b$q(o-~yN^lux5K(93-0BtetU|6D=@){xKsKvSNSxZE?qv-9=FcZb z@)?Z1VOtgUKBzeP4asfQUt3q*etuS4Zp3stb}5$|!XrwFupF;tXsn;zDs@Z6b=KzO zX4NxcX1yu@nSnlV15HnW7GAWKy-RI_Ru`arEC@uQurswAXnm6qPhVc_T%F>ut;LP& z++gHnzju+#B~EAPWj1s7kQ<*0zGa-rQeJbJ)Z6_@aK_`te!FE=2ASLi<>8-kX0s^(Ww6`@AMTVFXUDp_s7l$yc$@E@UP@R z+Nb2e+Gn6^`nVc;Z-?v8kbCg`zcq#teo?O0TQ3x~WA#%Jk~5MdBqG%^V5ks@g^KvU zT&M|ng+@72!G#<)xYT`)YBq4Sa>C`w1(mK?k#)aNxu=lOm^>d$PFbRbxM0!W$IE#{ zh+WoWsDxOQ%C;<%W6=g(ngitnCo75<@KkCSED|vc1Lcg%mC71aFbjEI*Q16T2n%6e zB{$9-R}v*!ZV9a%b*QHxRO}ovjO`1Ycv6ssat~@Lqnm9>J=QZNG=-Sd z%{&J6nil?X#+5bxbA-k<^a66r0X$Ue%+v_VfC?r*~ z)3&1!0seg`5*R^G6iOI*%94N^RV0cuE`7p&VKPsG3l}>#M+Qv8%7#exZEqf@&`Eoc zsg=6HxU6-Y1S;}S@T46VeOpf=79` zwRiz|Al$K>$6I_stJ1Bc@jCJP{9Uk(-xxw2%->J!?I|pWEgWn~QBkjnHY3}`QMPy@BWj%MI7A}?aX9V)t03410>}i;Otm2a_ zOdZy$8A-b1@}2RkhbwI?Tl{a$SS%>?^_@Q0Ds48sa}C@`6OxW6+L7I1be@Cw;nwvE z#rHijxr5(9z|-7uP^;eChT~AmO$pjV?Lt7^usUoqri*abQ`17P)bU!4%~<>{oD}Y4 zRp5jv2mVKM8t3HQ`gdI4ZENJ~pU1+t$F(6>pMQ}XH8LO<57ew#YNt-Vx8yjNBG*dh zGme+itw1aqd>J>sbWTLDMIbK|j(f6i>c1sxmFOCfG__YpDzte|KdLEG$2;}5F+#3n zoDesTvvaax-28_vGmtU40Bd!PoLfO}W)8+uoJnYol&0e<nyvE-F%;}$ZGc6|o&_S4L%j*I;*7%!FwO_{P#y_gdJC2)Rmw8O z4C(*QFJYLC_qU^qx=OJ_O>&h8F+TF4te_>M)(^%*iPBLk?EmrC!DjL$V;E)fTMoQpCZInnVl#%q-e#Y%*9!8pfK3R=`q%E*cl!w};esMuinNf5qTp*`TI1JJEXv7}M7Xq;+U zXDb?SzJi6?=ZNt|>;O6NX4KV;^OadEzZ!t=Qb4VLF*O&Fk`^_H`QoVG!a$<@8qZsf zsCZ1IM4Q}Iupi2@!}@@Dmf3_1Z}t<9hb9K&OdI#(FVNO9#e#TkKSHeGuNz`9d+%;Y zXjDLNR;t0avMldig;{t_pl1t&m;HTgv5?-POqMZxiHib*4i)-@Tr^e6NFK-N?^$O# z`IK?Vz-!>PAhwXs?(flHIf*ZD_(hK)aQMm3AWt)cjQ$2WFqjygST@BJ6Xc_1X+qI@ zSb?|@ew+qBfjl8|unQ!TJ{&HyF-8MFCyh1i=YQs*4qo3-VnM6uJ$c>$SqmQJ}p+5y9L#DiKR!L*)B+C z2s~wE+^NF9VZBg!ijWx#RKBvM&mm99Kc&>K2QOMa((rfcS6QF1A9R$DgdxR{Dnv^P z6)ZWSQp^_Zi!xo3mRO`YBHj{Z3l^5Fs#56l8fQ*eD^JJL>yb`MO2P(9@;>aaw zqse+@SZBPMM7~lV5<9ajnx$t>kW1sl7W$k*A7cv@a=DTp6A<%2_d=PJ^hKIZ*=7@z znZ)k%Jf5smX)ANUZ&q9q+Y*XzZd@9F!p@J#%LV;%GY?lz5#DsQD1J*#-Lp5R^Y^Av zl(@7rMW#}DFEE)x;Z|IVi&H|MT9ic4m}0h2I7U+Anov_$$Z|%lr$AeDIB}9D!yZz# zDM)oB#j4_!G~dH`j+>2B*)QCUk1SUBNRpRR<&>w+j-5+rm0XLKRkFHdcGBk*OcyaP zfpcl|22Lv)yVPbDvsQ|uSCG$YxuVu6&lE^6J)AMQ(&`rI$*EUjTl91$)GFE+!j3w$ zZu%GCtZ;dJ^2~B{CdCgqW(#H^_TPQF{Bk}dD@f|#8ezvCbxhs>;f!s`Ny_T)XigLt zRf2Vv-%TLHL*_uN8q^LF?_Us({+Z&A;pdDKXVCXPaDJ>87<7Bl$(Rwv>DQzRv&ldmaL5TELerI7k38lqbyNJ)Rerc-@F{@x@*3?O^FiU)8|VA?m5}s1T!_DPME>+n zIq)iV7=({)#$(o;$Am}6h{uRWDsIH*Qs%(1!anJpLG>OKgP-_y#&c8N z?;U0@>-Hm-J*K^~a4(3j1XeG^0X$#p-`66Rf1ty8zBHCLAP2a>U+}#DgswhOqkG?? z-D7%{4|y53%U<|T?|^vuKo9aB|NV;QeMO7L!%}r6=L-%K>IE(^Mh#TX1QPO(C-67Y zL*PRoCHN$ef>Z!6+#F$xf}*6lv)zOwA`nFlw-O2a6`1b-g^pa34oXy<*JTdh`VPs6 zIf#OwT(QeC*p)68iz{)2g(?=4WY;if$TvP0tciBZNwJNh2Si(7?cie zgctrs00-6p7!*Q?5}*Nh#0UpR2n*r>9z;TjA&3QaL5e|302<7F1L;^$vSqMESg-|6>4L%2J z1Y2+iia;L75fMnPJj6>NSKtmcsFin$>Z?@jd&$@k>wh6V2(Ac3B)leHGRopbV8<4C z3c&~ZMPOu|9>kF|yoR6_aOaAk9{36#UL~LdyN^ZXMH_z6z3+7=E40^E{K^(?tMUe` zw0XJ!ywClp0kz*nUu_+Z-lAj0Vh4$z-%kJ;TbZRZg5B7*Gcmu)< z|86zA;{ONkF=Y{l@s}fa_|3uxoY&?V^2QLH*Cl8J^q{WN=G6jP1pe&L|7~7^>k{@m z2uJ>uw*nOYdrNU5#$Dl~w+0mcJIj&Cym^qWF6==N0zA+=gzzvy9^idNgt#-CncSD~ z(eG>IxF~XgPnpQPk7f*26lQ9#L_GNb53E6Y0UnTjO@x^M54=HW0=?qFG=XlJ8}-w> zO8HNv&q#{h7Nk4tJ1*XBz#TS1FW4Pfc$+{s?7q9w=XRNCGaVvY>3BM({%*0`ou~ghQHmhyWgpLqY;;!D(HQ5KM?QASbXHU$#`7?^*|jkC)QEBcx!=Nz`ck_4iDtv z*yD8pM2&q0a0i+R{U~3&W&DLeEkuXlc(lB?cCOSK+k6o|dLvH0LMmPmLD;D;mMS9* z69f~yQ?Ni*G0#?654qZG5i-6L^C&IB48XHA*?f;?yh$)u7;L6wlw80MDWrx6{;;f= zM}J)Y!vT(;_{dz)5AN_pP!DhqP0;)6UMLaa6MytW@E^iqoWMVf zLwSLJD2I0O@cupshr$H-;BUW1#Rd7m?;Ydi{Xa2B^MZVk4wVV=z~7+bXZ(H84xI_| zAl`sS(FOm2-kZkP`TL+A(hL5BIumk?a9p4M_1`+=o z^o>0JH~1Ue=r_fDZ1N1I|e-IEHP&rsStO5iBL_VGYT_2DC8z2mr2B7h){+9t`pCJGi5C(z+ zR1cbuxGUjb1c(La0N>T{KLGp%$O5JSv;ahZHUAR81fUQw0zv~}0b&6W4m1eF1yBRH z0FwX`0lENcAT^+B@KbON5C`DC2mm=yHq0!D1C#)i0j&VN0KNd00dAj{KP&*#{|90W z{0IUAFaZJw3I)i4V1SPT9Ri5~*nqO(>M;$V`!E6Kz}a99Y<--76JQ_U-6X&XkPp93@VwZl%t| zUvDB@`u-v7;NHq#dp7#!Ubs5?N zX%ku{nC2JOme2^}<&7I%J>_XOYYRy=s$D&uyKAa=j{&4;*1EYc>@A{RnFEr*j)Up2 zjZKiM%fY0XX`<_p76xAv#9O=(qfn8+V%$(uZw(S7r^hZfwMFfmp;NBWR?|h}u~u>e zjS;o6u^#43a|@l>WLl=b$h|T5#V~Op1HVU5q5v#idt6aOqncn6NaD z#*ujblvH$>JIYHddrQk3Y5J(jJ2P!pG+@?pV$0QC$iEz)RB2-3oeiyxKvp}YMUz!K zb-OcUmF)Kffjpq9PV%?d+tQ~@8R2I1+qf8%<3|bWQ{`!8jh8TbtdAP-ZJ}QY3(4AF z%feUKXp*o%AuHmsbasw%tkuthct`A;8y;&?J`U!($a~bf1 z^HVPE>@f0#>zJExF7-$A3R3Y3kAWP>fq(rR$W9$z?dWQ}E8$fND* zS(C1BnnD>9XC7zZ;o-|#n@yeGh|STxZWaT+5HHGqx%utuQ4P$&!so_f1|F#WBr)|a z#rRJ4>3KmWr znb4Cx!tc*Nz;lYsNdnvY@TizCoc+;p{tX@?Z(WM78Kl*g%V*=(s4PrAt?ttfU!twQ zfYyY3R0JNlHEJZpvXLe>o*QtH+rDLlZQmd$8rYhy)Ewbt?Sz%cXtH&?>)*i@POY^?rG%6igi9A}VIzD6DSO~h&1(JJVr7oH;(eHT z`eTNMfzuY+OjTZ~SlQEANadlV*e+Ofuz$5FC?H|UG+p)MwT%`wGi_+nWM0b$( z#A494q+kiQ&~RptA1kRHfPi3TR_y!CJ*^3n%v&s{pn7AR4n#~*gRchO=q2ZjhFBF1 z;(6*h28{Uzo#}X6G4FFHaDtq*xBV`r-&*8vN1F(n&w3cpz=jHSG4n-RVuR7#FYa;k zX=Q=Si6w^BF{QmGpI`eED`?YfLlUN$snmm=l(8N2%fIF9DWh7d3Jb5qTC9krSk@a=DwDmq{yDRuIXJtlW0p3C^;)$% zTA16I1REIX4P{Co1L<+BKYXn)GxPBl?Na`azZ$cRlTPjg{9%+yNM%H56~^bNe}x3W zv_nkT!)ihcaU^a|x4!N__|PHcfeUz6edx&*p@)`VA5l4$QYYc+VjuN&n8}CXXR9NZ z$}UseDp}bjh*+uMriWe-5uO5WgUcO<^;7~fAl{;#8o-W~uk=p2hDMd?XkT%&ss`vJ z%YCV^;o*c`xRLI~_ZUQLX3rJMmb$3Mn$vgRCEL{n*S85QXRQ!f5gGk&x@()Gv$MMl zOj{DI?g*koUTu{Z*q3eU{6_GK+qKD_-}Oj3oYsnIrDK28;?efGP<<_%IcIB!rQ*fH z60D>{b6jwoLolhC?r`7gD$6H1n&)$|w$sU;89D&MLEAW`NgAQfIj+u`W2=-yV#*-2 zA=erav+U_@fra)pocyHEDwM~HrXz(Ns|J1{OlJ~{WuXyw=qkv)Oy~}e*vTHWgaM+@ z5tX2q>BFU0!V%>-Sd&Lg5+%4`O9huMEICUAidBVc4s2Qd!R@OxyLp}=RuqFw@BjU2IqV!{9eC(rTgAKT6xR_)R zv5C`sf63gu!Y{)i%d-gfUJ}|>9wWdXe?@Gre`&cYo-1*>j;V%er?HOt?#BlKn4^xg zg!U(rZixvysD2SR(3QqJm0do{ON*qn2C>bmug#=%f3>Zn?Pu>MI7 z$+7CHQC!d+&6a_O*C zl>(?s1p&1<&`qtf8#yGBw^<{wHn&4m(6qor(5)g>O~WfHGTmwN#3g$XQJIOmgbD|& zOaW2tTBK5jb(U(!%9BQ@rRn9oi9&U1trkqj;ktu{WR`;BgrQMu1i!lB;h**S-0ys$ zl)YlO;?OpZ`PN0?)mXY-)V9UhM%U6vtx`%4LasGZ0s|&G0rN#-H?nJ>;n!Lq| zpaE*d+)NFZGLy#IWXM{SWO!fVo>VM+tgKy>OgYOlS4y152|)BQ_y;W`LNSa)EXn=W zmqUM)m*RQf)G&2+ds2yxW>=|SkPLd*#xo}z z7kGDAB6$My+T2X?ACr?}$#A%K@`CYz_6D_7ObWa-ea>>l;4G@e5mwCQ%PEteX1>XZ zF>xv%DD+esw%~O;+B&AXIlsduTW__hbo{;mRk;#`woq9M<*H&zHiL$4rxixB)Ndn! zb56!tbG1m>VO%UF!=QxY(_<4*fV_qh7K|fKLt0WZ{Cw6;^TfP1pDm zsWsAjNl?^0`evWlz96scO7gs?(g-v4y0|X$o2++;L?P-V6FZ#zU!5fNkuwFQ6Ll&~ zmvQ`9#{5F_gwr7|nH`VWfkkv+?~1Rlh{h0wxtUx7{4q6f!lF#Ee3PxnVC0xG4MZj; zV}j%-QGy)oiyZ?5njmq6j&$(&U?kf|u|MTGLcT{#M}X*Zf~Lg}T__qxQ@g+|2+E){ zU!{VU(?p|IX)qKgwFCycWyj~Xy>yx5Sk%Cs=ng(MADFFsP{U53H7OE#Ym8v*uV9R8 zYsOZiXdFOVShAurlV}jeRg=b z1R(*w#n^udIxuTY;6z!)rx*T<_T!BReYTN-vuZ@#l^AM2%wpK}2481@j z^ZPb1HIo!O=}Abg;A~t&m#&IZPrGMpj+I2W98U-y*;2<;&nC9A#rMRkA)mW?8S%sW z_!B_)b?up^{wK-3v`OmoE|o1I2Ofj#P}y<6`b;rM6v;6OfYZ(FMG_WlvW1YvoaMFS zUeMiA%daGhHm;jBXr@EPY-!a)y}3tfiRbdhZ56bH35)JS>YS&;WH1)wtM(v^JUetd zvc^tiI&RRw(8_H%cp2I$d;W5k6wP7jv-6}+jjYs6%xOaJtgGCJaVr%*huM_K&(P|0 zu~Sz_8YhiGW=<2LF4Q}n1xg0TEJjN;ckPZFrP$Bdl-jo4O>jqe)9n*|1ow$BiWRGMt!&<+F%yQNafrD_m$ni!H~iFc9rP;SK)B6bKnT2a&e z2Fp`}QP-Z9sK?Zapz2wdvzI#ZX4jBbF=n={KOmZ%SF(~fWfmrGwKmL_k-A1_D{CkX z8ZmP!Hc}kUyklC2@`mbIYlo#$L0w|*A1g*czn&>}Djm|1P!PvepjZ}L3gwuU{H5H4 z@FvK-TWOZA(Bi_u${^5{p{xrzU^yt-Nzd4r+KR~>+%a%@m|AG-Wx`*CsL^exe?iyQ zW>d=GsIZ=>S;nEY&1GryJfd{(Tw7bn6;2{$G-(?zM@Mq9z~Sh7ZOC;%t`r$Zu!h5* zUJxtSh^$bfpE;fQZs1LT1H;XBpR5>P`k2~plV=Mohn2FP(t=Rgpy`IBc=>L)*g(7n z>rxuqZf9M&qSTdxwa$dSPzr2m&lU_NIl8*wd(FsUdBwpCLJV>+ee-&0bew+Zh}O+~ z>9)wpB>ZJ*bP{{a?&(rll+}JRDMv$=6ye4s>zLQ{a8SE6PbQOCKNvR@l$I^ z(`tOH5B+_se=J|aBlkSz(;n!?14$c`Li zPRPJxC7Ju^aT#a(3{|_>SQ~Rz2wNX}iAryaRRuYk`*DLqe4wVelFoIIwC(AirVRY- zvz*DU-KPgbGJTxJ<_k#!|ClhMA8yS%cy zt%Qex-A$K#)KG>7idP}Ta8TO~xIoXc)0EJ(9f`PcWNWH_*=5uj`zWhk3_o1RG~h4} zb=dx1SuEJ=m(BR&B6r0&w2~Xi+rYtjWsj@F6BIkOENY~Jd$XE2RmN83W$`kl*o<7^ zY8ghrvRuzU?iHpfn)k676I&5}P3X+;d;AXt@z~Kuhw!6*2>5B=1OyQiKf(Q`kiCx^M%coCkuVv7?Brk;hT!HU{)+uY|1E~nr#q}x-;Nnlu+WI7?Eh>7_ z3zh`x@beTalGZLYhafs<4gG@>H{dw?q5XwRdI6s`zS0RF4Jch*CIu6?oV!vZj)cf= zuq>R}a#>{q6I(~ahuWc~of$L2T1oar8S*&}_oU$Bq23FFFN%E8xpAH<5&ApD@E=b& zymCb&uJ2ENUmx$dettkFetvBHBQyL%GcVYD|B~~1XTJAN1-}Vf@l=yjofM5uKd{(Cuit>5>1*=yfXjUu zfL57UoFku|q(_zDF!h2Iq?hs-tILC@m-ZNfuR{v-gY3N@u)ekKRkTx?MTaS6hD3f< zM$&s3z)lzJmF>+T@pOE0LDR$S7PMQdHZ3!;YRcWKwhkw1p3ZA zsS<9XMGeJ|UY~kf6JL5k#3!?6Mt#(udS_t0E7GTQmND*Ph0?~XKf^M=I(WaZj`Oc= zq`|V48`>xDiS8o}Q*vK3j0je7BtQF*w!}(E138>BwW#lhdZ|~`TAOnvOE-p{Al(^_ z5mQ6A7%I7*oSPT5irmH5o~2vsLxcmI>XE~sNQv#|Nz8L?KK|dS{9(RSK2)bK;4#n& z^0;wpM9!qLh>qtu{)P)?390N0H#y|xOs@t5$6Se-fHnAWxm_)Lpq6%~AI!<|cr7A0ZAlE&n? zH<9E*y(th;^}+Cy7!h@aBWM$jExg-n%1Ap|GDRwBqg-2FTwKI5y}1Tx=a$mBmzS1H zJ0n3ZqMO6G(~Q{^T$@F-9EBWeUfS2I>h}{&nsK?;LlVmxJvG~#$hV^zPKp*HJaP6Y#m(q8ls}jP_h-Fb_Gc%}>?rNux!@Ka8r0(hj zohrs)OT1Igm}ay%rB7v#8t_)yibB#Oa^_2Gm(^Cn8cT2^B-Ew5M<#=j9Q4Qcf%)zC z5DQ~LKDRSQg*&DbZs8Z{MN?+)*e2OoN3q^NAu)rQxZ(v(RCiWNt$&fTjtb6$2*1&? z1lO8eY!W*(Ah%_;@Rt>TZEH41!Ut|~U`9x27jtR~ms>%R6SXvbZ3jij!QU;v_cT>l zBX7E_&tclfHoLeY0fBBovi%nE=y-b)l-(P33;}b5QIpM*!xm(HOo_%?1!p<6mZ2>s z$Ofua)OLKZD!i}?WxilPbhcZpIPg3B z^Paigf7vv8bSSqeUtK8c-%k1IA;;#blCSZt`td`eBK zodvo44pqV9meUj5Kb+I(rjF1h`;%BTmhall$GW*9PmHS*W;`92uY$n~co>Mv1#)%E zNcz2YQ}Zw_*y=tmbEp~i+ViyC;rC;sk)yxwHc>aHQ9L+_;Fle!S#+1Aw|WbUOVB&J{P&B#*F7OkCJ2kZGBF%1#?@ys)5;2hi8H0bpHhpE zqIV42oT%7)%n_6r9*Zv znp_qAEppC}0AB&aXaJ~MRe^zw@2V{Yxf0D?$fsa4;6;9 zWKf>?+nve~qTdZt;z`Uc50o@(1sk#G(UHWBB1!U96h!fhMehs7O#_9xP8-ZmfX<*KHAj3S_B+_w4>^&%@~@%YCEgPll@X{X_MSw>qDB@llN& z!pkBJ3vv+n*K(axC&bv<+vjkQxFYF?^*gKep-S=5nppl zac3PZ&VBhO4*44zuErj|u2#HMFV3dx53$w`qQ2;N!nBuCv*P9f_p;JX#8c~{a!>?n z&X|`K%UVQas!{33;PRfIAF}?*3HyV#gm%kNv?XUU`aT*y6}3R*l0I^PUL!~$84w)5uvhOZCk`*Q1#R+%Cp6(~zne2Oy?rq^t*L;_hm-m9XDUgvC9! zUhMOgBo2#PqSH2qR=^XhFl>&6;MUUiN5xDfwW!34GC40w9*s|wjxpnIW^@I{346X) z0En>YwTV;frF(o@`bv~P($vt1Vp9MqZKr}vWsaka@Q=TZYNBEif>sZpWp>#SJr91&FaeW zbF3GOl;l8PNLO9~-jLq8YK*Q`wJt91p!+zo?kn9ZRJa!EV8hA;w4?VDDuG!-dX3I|mH-2;p zYQmqU0e}4?u4{tL?nFYj!H#$skshO$Rc0eEqs_a z{ZPnHH92=~%*Ax!Rx$2GLo3we5vX?8=fxym?uEm%#^MxlASwwMQ1B#4g`3Io5}^s* ziZZosqN)R+%AyTTysM;QT?n5(;SVptx5I0YTH=cn35foohm8MG#Y_9tj4u2GeS0% ze=C<%RW-GFTAR&G+mSn15J`i;V8ihJUjKqMM=ax6M!2=Gw+v;C5)4M0#b?nM?bQ#U zC8WsrFbcl^9YEN1RV_1)s&qG7v}YIp+_ogd)XZttVhGv{RG2~=q#-cYy^EEuy(2z?UKoi(KCOvPq==Bxn z$()MP3zV*aW4`fM;=%4Rf}i> zZM+uZixvKY-%7>{VkvZg&Zq2cSl++h%P7j$@iWCyCz-z_{BHc&qbN4=p2cm43*+C= zxzDh&bR@2D#*Udm&H@kc%pDYrnV%aLVn0bYH)T2t|E9!p{o);~GYcN;6O}^~+i3HS zk%~!3he|qNkST4Tzf9aKq!h|>)5xbx6!9f5JtWig%PqA_gsW6L<9Ohp1k!-%Fp2h2 z*BjaGYfXU3OrxGL(athT{kzR|$A#9`QGyYrG0l5)CDKDx7&)X+Cac6);;9gma|i0S zd9$3LqnHGw9y=GIqZz)V6r-C1dEXaMXYEP&dS!}4SLD)b#k9BP&U8$hmu1$&1dXtis3z?5jB_S0aKf^9oJA=f%im5O9 zBz9(&ojUCS(bFlxb|=y9iP^Kh2s%qGg-6*8w_abhnm8CafLl2=YE?}q*r6_7!EUkB z5;7)k(;TYmS;U%Hd>)*bA9V$gd{z6K6fk3kmC#ZWrJ7(=@jSM%F0<6HASeA4>uxAM z)Oah^oEwiwBisek^2efExkI1oSJMy&ZG!-r(o}lRae*VGjS6CEK{O-q;Ao$UKgN_L zWQGu!5F0G0LI)K-b| zv;cBcT3w7f##il9r8B`AcOv7ZTA!asQ+!wK6ER_ol%~xWuD)_4O4Q(3TapxpAKd4y zs+TiG&d003f!%bO@m^eyb~o5rTrSVg*XlL{bO^B@72Xv@RI2^%o;c)rWh0j|D%(hL zvvP59rDN@pV0?&?5Xts9+d__0H0488!&QnLRw~wPNeQr!OD9<1K`3PwD4}%shpIV^ zL~0Q*WCwbviLRnlv;+3aQYN{SHMImsYF4d_SBVxdth8})wGEhNkO5EdM5VX=rND~2 zXOgS{)p`?oxE9$udVU-p!k#bBkQCYOgQ0_Z9Zg9@RdnUdLgiJz6X~de2≧oEoIN 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 z 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