|
@ -3,6 +3,7 @@ import cn.hutool.core.date.DateUtil; |
|
|
import cn.hutool.core.util.IdcardUtil; |
|
|
import cn.hutool.core.util.IdcardUtil; |
|
|
import cn.hutool.core.util.ObjectUtil; |
|
|
import cn.hutool.core.util.ObjectUtil; |
|
|
import com.ccsens.mt.bean.dto.CompeteDto; |
|
|
import com.ccsens.mt.bean.dto.CompeteDto; |
|
|
|
|
|
import com.ccsens.mt.bean.dto.ProvinceCompeteDto; |
|
|
import com.ccsens.mt.bean.po.*; |
|
|
import com.ccsens.mt.bean.po.*; |
|
|
import com.ccsens.mt.bean.vo.TableVo; |
|
|
import com.ccsens.mt.bean.vo.TableVo; |
|
|
import com.ccsens.mt.persist.dao.*; |
|
|
import com.ccsens.mt.persist.dao.*; |
|
@ -60,6 +61,10 @@ public class ExcelService implements IExcelService { |
|
|
|
|
|
|
|
|
@Resource |
|
|
@Resource |
|
|
private CompetePlayerMapper competePlayerMapper; |
|
|
private CompetePlayerMapper competePlayerMapper; |
|
|
|
|
|
@Resource |
|
|
|
|
|
private CompeteProjectConfigDao competeProjectConfigDao; |
|
|
|
|
|
@Resource |
|
|
|
|
|
private CompeteProjectDao competeProjectDao; |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
public String dasaiduiwuxinxiWPS(QueryDto<CompeteDto.CompeteTime> params) { |
|
|
public String dasaiduiwuxinxiWPS(QueryDto<CompeteDto.CompeteTime> params) { |
|
@ -303,6 +308,9 @@ public class ExcelService implements IExcelService { |
|
|
return path; |
|
|
return path; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private List<TableVo.CompeteJoin> getCompeteJoin(CompeteDto.CompeteTime params) { |
|
|
private List<TableVo.CompeteJoin> getCompeteJoin(CompeteDto.CompeteTime params) { |
|
|
List<TableVo.CompeteJoin> competeJoinList = new ArrayList<>(); |
|
|
List<TableVo.CompeteJoin> competeJoinList = new ArrayList<>(); |
|
|
Long competeTimeId = params.getCompeteTimeId(); |
|
|
Long competeTimeId = params.getCompeteTimeId(); |
|
@ -632,6 +640,7 @@ public class ExcelService implements IExcelService { |
|
|
return path; |
|
|
return path; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// private List<TableVo.CompeteAllCount> competeAllCountList(CompeteDto.CompeteTime params){
|
|
|
// private List<TableVo.CompeteAllCount> competeAllCountList(CompeteDto.CompeteTime params){
|
|
|
// //根据大赛查类型
|
|
|
// //根据大赛查类型
|
|
|
// Long competeTimeId = params.getCompeteTimeId();
|
|
|
// Long competeTimeId = params.getCompeteTimeId();
|
|
@ -759,5 +768,281 @@ public class ExcelService implements IExcelService { |
|
|
return path; |
|
|
return path; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
public List<TableVo.DailyScheduleProcess> dailyScheduleProcess(CompeteDto.CompeteTime params) { |
|
|
|
|
|
List<TableVo.DailyScheduleProcess> dailyScheduleProcessList = new ArrayList<>(); |
|
|
|
|
|
//查询项目
|
|
|
|
|
|
CompeteTime competeTime = competeTimeDao.selectByPrimaryKey(params.getCompeteTimeId()); |
|
|
|
|
|
CompeteProjectExample competeProjectExample = new CompeteProjectExample(); |
|
|
|
|
|
int level = 2; |
|
|
|
|
|
competeProjectExample.createCriteria().andTypeEqualTo(competeTime.getType()).andLevelEqualTo((byte) level); |
|
|
|
|
|
//项目集合
|
|
|
|
|
|
List<CompeteProject> competeProjectList = competeProjectMapper.selectByExample(competeProjectExample); |
|
|
|
|
|
for (CompeteProject competeProject : competeProjectList) { |
|
|
|
|
|
//判断是否团队
|
|
|
|
|
|
if (competeProject.getTeam() == 0) { |
|
|
|
|
|
//不是团队
|
|
|
|
|
|
CompeteProjectPlayerExample competeProjectPlayerExample = new CompeteProjectPlayerExample(); |
|
|
|
|
|
competeProjectPlayerExample.createCriteria().andProjectIdEqualTo(competeProject.getId()); |
|
|
|
|
|
long count = competeProjectPlayerMapper.countByExample(competeProjectPlayerExample); |
|
|
|
|
|
TableVo.DailyScheduleProcess dailyScheduleProcess = new TableVo.DailyScheduleProcess(); |
|
|
|
|
|
//队伍/人数
|
|
|
|
|
|
dailyScheduleProcess.setJoinNum((int) count); |
|
|
|
|
|
//项目名
|
|
|
|
|
|
dailyScheduleProcess.setProjectName(competeProject.getName()); |
|
|
|
|
|
|
|
|
|
|
|
CompeteProjectConfig competeProjectConfig = competeProjectConfigDao.selectByProjectId(competeProject.getId()); |
|
|
|
|
|
if (ObjectUtil.isNotNull(competeProjectConfig)) { |
|
|
|
|
|
//单项时间
|
|
|
|
|
|
dailyScheduleProcess.setSingleTime(competeProjectConfig.getProjectDuration()); |
|
|
|
|
|
//场地
|
|
|
|
|
|
dailyScheduleProcess.setSiteNum(competeProjectConfig.getSiteNum()); |
|
|
|
|
|
//场次
|
|
|
|
|
|
long times = count / competeProjectConfig.getSiteNum(); |
|
|
|
|
|
dailyScheduleProcess.setGames(times); |
|
|
|
|
|
//总时间
|
|
|
|
|
|
long second = competeProjectConfig.getProjectDuration() * times; |
|
|
|
|
|
dailyScheduleProcess.setTimeSum(second); |
|
|
|
|
|
//项目开始时间
|
|
|
|
|
|
dailyScheduleProcess.setStartTime(competeProjectConfig.getStartTime()); |
|
|
|
|
|
//项目结束时间
|
|
|
|
|
|
dailyScheduleProcess.setEndTime(competeProjectConfig.getEndTime()); |
|
|
|
|
|
} |
|
|
|
|
|
dailyScheduleProcessList.add(dailyScheduleProcess); |
|
|
|
|
|
} else { |
|
|
|
|
|
//是团队
|
|
|
|
|
|
CompeteTeamExample competeTeamExample = new CompeteTeamExample(); |
|
|
|
|
|
competeTeamExample.createCriteria().andProjectIdEqualTo(competeProject.getId()); |
|
|
|
|
|
long count = competeTeamDao.countByExample(competeTeamExample); |
|
|
|
|
|
TableVo.DailyScheduleProcess dailyScheduleProcess = new TableVo.DailyScheduleProcess(); |
|
|
|
|
|
//队伍/人数
|
|
|
|
|
|
dailyScheduleProcess.setJoinNum((int) count); |
|
|
|
|
|
//项目名
|
|
|
|
|
|
dailyScheduleProcess.setProjectName(competeProject.getName()); |
|
|
|
|
|
|
|
|
|
|
|
CompeteProjectConfig competeProjectConfig = competeProjectConfigDao.selectByProjectId(competeProject.getId()); |
|
|
|
|
|
if (ObjectUtil.isNotNull(competeProjectConfig)) { |
|
|
|
|
|
//单项时间
|
|
|
|
|
|
dailyScheduleProcess.setSingleTime(competeProjectConfig.getProjectDuration()); |
|
|
|
|
|
//场地
|
|
|
|
|
|
dailyScheduleProcess.setSiteNum(competeProjectConfig.getSiteNum()); |
|
|
|
|
|
//场次
|
|
|
|
|
|
long times = count / competeProjectConfig.getSiteNum(); |
|
|
|
|
|
dailyScheduleProcess.setGames(times); |
|
|
|
|
|
//总时间
|
|
|
|
|
|
long second = competeProjectConfig.getProjectDuration() * times; |
|
|
|
|
|
dailyScheduleProcess.setTimeSum(second); |
|
|
|
|
|
//项目开始时间
|
|
|
|
|
|
dailyScheduleProcess.setStartTime(competeProjectConfig.getStartTime()); |
|
|
|
|
|
//项目结束时间
|
|
|
|
|
|
dailyScheduleProcess.setEndTime(competeProjectConfig.getEndTime()); |
|
|
|
|
|
} |
|
|
|
|
|
dailyScheduleProcessList.add(dailyScheduleProcess); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
return dailyScheduleProcessList; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
public List<TableVo.DailyScheduleProcess> updateAndSearch(ProvinceCompeteDto.UpdateAndSearchList params) { |
|
|
|
|
|
List<TableVo.DailyScheduleProcess> dailyScheduleProcessList = new ArrayList<>(); |
|
|
|
|
|
List<ProvinceCompeteDto.UpdateAndSearch> updateAndSearchList = params.getUpdateAndSearchList(); |
|
|
|
|
|
for (ProvinceCompeteDto.UpdateAndSearch updateAndSearch : updateAndSearchList){ |
|
|
|
|
|
//根据项目查项目id
|
|
|
|
|
|
CompeteProject competeProject = competeProjectDao.getProjectByProjectName(updateAndSearch.getProjectName()); |
|
|
|
|
|
long projectId = competeProject.getId(); |
|
|
|
|
|
//查询数据库中现有数据对象
|
|
|
|
|
|
CompeteProjectConfig competeProjectConfig = competeProjectConfigDao.selectByProjectId(projectId); |
|
|
|
|
|
//修改单项时间,场地和开始结束时间
|
|
|
|
|
|
competeProjectConfig.setProjectDuration(updateAndSearch.getSingleTime()); |
|
|
|
|
|
competeProjectConfig.setSiteNum(updateAndSearch.getSiteNum()); |
|
|
|
|
|
competeProjectConfig.setStartTime(updateAndSearch.getStartTime()); |
|
|
|
|
|
competeProjectConfig.setEndTime(updateAndSearch.getEndTime()); |
|
|
|
|
|
competeProjectConfigDao.updateByPrimaryKeySelective(competeProjectConfig); |
|
|
|
|
|
//返回前台的对象赋值
|
|
|
|
|
|
TableVo.DailyScheduleProcess dailyScheduleProcess = new TableVo.DailyScheduleProcess(); |
|
|
|
|
|
//项目名
|
|
|
|
|
|
dailyScheduleProcess.setProjectName(updateAndSearch.getProjectName()); |
|
|
|
|
|
//参赛人或者队伍
|
|
|
|
|
|
dailyScheduleProcess.setJoinNum(updateAndSearch.getJoinNum()); |
|
|
|
|
|
//单项时间
|
|
|
|
|
|
CompeteProjectConfig competeProjectConfig1 = competeProjectConfigDao.selectByProjectId(competeProject.getId()); |
|
|
|
|
|
dailyScheduleProcess.setSingleTime(competeProjectConfig1.getProjectDuration()); |
|
|
|
|
|
//场地
|
|
|
|
|
|
dailyScheduleProcess.setSiteNum(competeProjectConfig1.getSiteNum()); |
|
|
|
|
|
//场次
|
|
|
|
|
|
long games = updateAndSearch.getJoinNum()/competeProjectConfig1.getSiteNum(); |
|
|
|
|
|
dailyScheduleProcess.setGames(games); |
|
|
|
|
|
//总时间
|
|
|
|
|
|
long second = competeProjectConfig1.getProjectDuration()*games; |
|
|
|
|
|
dailyScheduleProcess.setTimeSum(second); |
|
|
|
|
|
//开始时间
|
|
|
|
|
|
dailyScheduleProcess.setStartTime(competeProjectConfig1.getStartTime()); |
|
|
|
|
|
//结束时间
|
|
|
|
|
|
dailyScheduleProcess.setEndTime(competeProjectConfig1.getEndTime()); |
|
|
|
|
|
dailyScheduleProcessList.add(dailyScheduleProcess); |
|
|
|
|
|
} |
|
|
|
|
|
return dailyScheduleProcessList; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
public List<TableVo.CompeteJoin> getCompeteJoinDetail(CompeteDto.CompeteTime params) { |
|
|
|
|
|
List<TableVo.CompeteJoin> competeJoinList = new ArrayList<>(); |
|
|
|
|
|
Long competeTimeId = params.getCompeteTimeId(); |
|
|
|
|
|
CompeteTime competeTime = competeTimeDao.selectByPrimaryKey(competeTimeId); |
|
|
|
|
|
int type = competeTime.getType(); |
|
|
|
|
|
Byte level = 2; |
|
|
|
|
|
CompeteProjectExample competeProjectExample = new CompeteProjectExample(); |
|
|
|
|
|
competeProjectExample.createCriteria().andTypeEqualTo((byte) type).andLevelEqualTo(level); |
|
|
|
|
|
//获取参赛项目集合
|
|
|
|
|
|
List<CompeteProject> competeProjectList = competeProjectMapper.selectByExample(competeProjectExample); |
|
|
|
|
|
for (CompeteProject competeProject : competeProjectList) { |
|
|
|
|
|
String projectName = competeProject.getName(); |
|
|
|
|
|
if (competeProject.getTeam() == 0) { |
|
|
|
|
|
//如果不是团队项目,查询该项目下报名人数集合
|
|
|
|
|
|
CompeteProjectPlayerExample competeProjectPlayerExample = new CompeteProjectPlayerExample(); |
|
|
|
|
|
competeProjectPlayerExample.createCriteria().andProjectIdEqualTo(competeProject.getId()); |
|
|
|
|
|
List<CompeteProjectPlayer> competeProjectPlayerList = competeProjectPlayerMapper.selectByExample(competeProjectPlayerExample); |
|
|
|
|
|
for (CompeteProjectPlayer competeProjectPlayer : competeProjectPlayerList) { |
|
|
|
|
|
//查询每个报名人的详细信息下
|
|
|
|
|
|
CompetePlayer competePlayer = competePlayerDao.selectByPrimaryKey(competeProjectPlayer.getPlayerId()); |
|
|
|
|
|
TableVo.CompeteJoin competeJoin = new TableVo.CompeteJoin(); |
|
|
|
|
|
//姓名
|
|
|
|
|
|
competeJoin.setName(competePlayer.getName()); |
|
|
|
|
|
//身份证号
|
|
|
|
|
|
competeJoin.setIdCard(competePlayer.getIdCard()); |
|
|
|
|
|
//根据身份证获取选手年龄并赋值
|
|
|
|
|
|
String idCard = competeJoin.getIdCard(); |
|
|
|
|
|
int ageByIdCard = IdcardUtil.getAgeByIdCard(idCard); |
|
|
|
|
|
competeJoin.setAge(ageByIdCard); |
|
|
|
|
|
Byte gender = competePlayer.getGender(); |
|
|
|
|
|
if (gender == 0) { |
|
|
|
|
|
competeJoin.setGender("女"); |
|
|
|
|
|
} else { |
|
|
|
|
|
competeJoin.setGender("男"); |
|
|
|
|
|
} |
|
|
|
|
|
//查询单位,并赋值
|
|
|
|
|
|
CompeteCompany competeCompany = competeCompanyMapper.selectByPrimaryKey(competePlayer.getCompanyId()); |
|
|
|
|
|
if (ObjectUtil.isNotNull(competeCompany)) { |
|
|
|
|
|
competeJoin.setJoinTeam(competeCompany.getName()); |
|
|
|
|
|
} |
|
|
|
|
|
//查询组别,并赋值
|
|
|
|
|
|
CompeteGroup competeGroup = competeGroupMapper.selectByPrimaryKey(competePlayer.getCompeteGroupId()); |
|
|
|
|
|
if (ObjectUtil.isNotNull(competeGroup)) { |
|
|
|
|
|
competeJoin.setCompeteGroup(competePlayer.getName()); |
|
|
|
|
|
} |
|
|
|
|
|
//身份证明查询,并赋值
|
|
|
|
|
|
CommonFile commonFile = commonFileMapper.selectByPrimaryKey(competePlayer.getIdCardFrontFile()); |
|
|
|
|
|
if (ObjectUtil.isNotNull(commonFile)) { |
|
|
|
|
|
competeJoin.setIdCardPromise(commonFile.getVisitLocation()); |
|
|
|
|
|
} |
|
|
|
|
|
//一寸证件照查询赋值
|
|
|
|
|
|
CommonFile commonFile1 = commonFileMapper.selectByPrimaryKey(competePlayer.getIdPhotoFile()); |
|
|
|
|
|
if (ObjectUtil.isNotNull(commonFile1)) { |
|
|
|
|
|
competeJoin.setPicture(commonFile1.getVisitLocation()); |
|
|
|
|
|
} |
|
|
|
|
|
//学籍证明/俱乐部证明
|
|
|
|
|
|
CommonFile commonFile2 = commonFileMapper.selectByPrimaryKey(competePlayer.getStudentRecordFile()); |
|
|
|
|
|
if (ObjectUtil.isNotNull(commonFile2)) { |
|
|
|
|
|
competeJoin.setStudentPromise(commonFile2.getVisitLocation()); |
|
|
|
|
|
} |
|
|
|
|
|
//体检证明
|
|
|
|
|
|
CommonFile commonFile3 = commonFileMapper.selectByPrimaryKey(competePlayer.getHealthRecordFile()); |
|
|
|
|
|
if (ObjectUtil.isNotNull(commonFile3)) { |
|
|
|
|
|
competeJoin.setBodyTest(commonFile3.getVisitLocation()); |
|
|
|
|
|
} |
|
|
|
|
|
//人身意外伤害保险证明
|
|
|
|
|
|
CommonFile commonFile4 = commonFileMapper.selectByPrimaryKey(competePlayer.getInsuranceRecordFile()); |
|
|
|
|
|
if (ObjectUtil.isNotNull(commonFile4)) { |
|
|
|
|
|
competeJoin.setBodyProtect(commonFile4.getVisitLocation()); |
|
|
|
|
|
} |
|
|
|
|
|
//参赛项目名赋值
|
|
|
|
|
|
competeJoin.setCompeteProject(projectName); |
|
|
|
|
|
competeJoinList.add(competeJoin); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} else { //团队项目
|
|
|
|
|
|
//获取参赛队伍集合
|
|
|
|
|
|
CompeteTeamExample competeTeamExample = new CompeteTeamExample(); |
|
|
|
|
|
competeTeamExample.createCriteria().andProjectIdEqualTo(competeProject.getId()); |
|
|
|
|
|
List<CompeteTeam> competeTeamList = competeTeamDao.selectByExample(competeTeamExample); |
|
|
|
|
|
for (CompeteTeam competeTeam : competeTeamList) { |
|
|
|
|
|
//获取队伍下的成员集合
|
|
|
|
|
|
CompeteTeamMemberExample competeTeamMemberExample = new CompeteTeamMemberExample(); |
|
|
|
|
|
competeTeamMemberExample.createCriteria().andCompeteTeamIdEqualTo(competeTeam.getId()); |
|
|
|
|
|
List<CompeteTeamMember> competeTeamMemberList = competeTeamMemberMapper.selectByExample(competeTeamMemberExample); |
|
|
|
|
|
for (CompeteTeamMember competeTeamMember : competeTeamMemberList) { |
|
|
|
|
|
//查询成员详细信息
|
|
|
|
|
|
CompetePlayer competePlayer = competePlayerDao.selectByPrimaryKey(competeTeamMember.getPlayerId()); |
|
|
|
|
|
TableVo.CompeteJoin competeJoin = new TableVo.CompeteJoin(); |
|
|
|
|
|
//姓名
|
|
|
|
|
|
competeJoin.setName(competePlayer.getName()); |
|
|
|
|
|
//身份证号
|
|
|
|
|
|
competeJoin.setIdCard(competePlayer.getIdCard()); |
|
|
|
|
|
//根据身份证获取选手年龄并赋值
|
|
|
|
|
|
String idCard = competeJoin.getIdCard(); |
|
|
|
|
|
int ageByIdCard = IdcardUtil.getAgeByIdCard(idCard); |
|
|
|
|
|
competeJoin.setAge(ageByIdCard); |
|
|
|
|
|
//性别
|
|
|
|
|
|
Byte gender = competePlayer.getGender(); |
|
|
|
|
|
if (gender == 0) { |
|
|
|
|
|
competeJoin.setGender("女"); |
|
|
|
|
|
} else { |
|
|
|
|
|
competeJoin.setGender("男"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//查询单位,并赋值
|
|
|
|
|
|
CompeteCompany competeCompany = competeCompanyMapper.selectByPrimaryKey(competePlayer.getCompanyId()); |
|
|
|
|
|
if (ObjectUtil.isNotNull(competeCompany)) { |
|
|
|
|
|
competeJoin.setJoinTeam(competeCompany.getName()); |
|
|
|
|
|
} |
|
|
|
|
|
//查询组别,并赋值
|
|
|
|
|
|
CompeteGroup competeGroup = competeGroupMapper.selectByPrimaryKey(competePlayer.getCompeteGroupId()); |
|
|
|
|
|
if (ObjectUtil.isNotNull(competeGroup)) { |
|
|
|
|
|
competeJoin.setCompeteGroup(competePlayer.getName()); |
|
|
|
|
|
} |
|
|
|
|
|
//身份证明查询,并赋值
|
|
|
|
|
|
CommonFile commonFile = commonFileMapper.selectByPrimaryKey(competePlayer.getIdCardFrontFile()); |
|
|
|
|
|
if (ObjectUtil.isNotNull(commonFile)){ |
|
|
|
|
|
competeJoin.setIdCardPromise(commonFile.getVisitLocation()); |
|
|
|
|
|
} |
|
|
|
|
|
//一寸证件照查询赋值
|
|
|
|
|
|
CommonFile commonFile1 = commonFileMapper.selectByPrimaryKey(competePlayer.getIdPhotoFile()); |
|
|
|
|
|
if (ObjectUtil.isNotNull(commonFile1)){ |
|
|
|
|
|
competeJoin.setPicture(commonFile1.getVisitLocation()); |
|
|
|
|
|
} |
|
|
|
|
|
//学籍证明/俱乐部证明
|
|
|
|
|
|
CommonFile commonFile2 = commonFileMapper.selectByPrimaryKey(competePlayer.getStudentRecordFile()); |
|
|
|
|
|
if (ObjectUtil.isNotNull(commonFile2)){ |
|
|
|
|
|
competeJoin.setStudentPromise(commonFile2.getVisitLocation()); |
|
|
|
|
|
} |
|
|
|
|
|
//体检证明
|
|
|
|
|
|
CommonFile commonFile3 = commonFileMapper.selectByPrimaryKey(competePlayer.getHealthRecordFile()); |
|
|
|
|
|
if (ObjectUtil.isNotNull(commonFile3)){ |
|
|
|
|
|
competeJoin.setBodyTest(commonFile3.getVisitLocation()); |
|
|
|
|
|
} |
|
|
|
|
|
//人身意外伤害保险证明
|
|
|
|
|
|
CommonFile commonFile4 = commonFileMapper.selectByPrimaryKey(competePlayer.getInsuranceRecordFile()); |
|
|
|
|
|
if (ObjectUtil.isNotNull(commonFile4)){ |
|
|
|
|
|
competeJoin.setBodyProtect(commonFile4.getVisitLocation()); |
|
|
|
|
|
} |
|
|
|
|
|
//参赛项目名赋值
|
|
|
|
|
|
competeJoin.setCompeteProject(projectName); |
|
|
|
|
|
competeJoinList.add(competeJoin); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
return competeJoinList; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|