|
|
@ -11,19 +11,17 @@ import com.storeroom.modules.device.service.mapstruct.DeviceTypeMapper; |
|
|
|
import com.storeroom.service.ApiService; |
|
|
|
import com.storeroom.utils.*; |
|
|
|
import lombok.RequiredArgsConstructor; |
|
|
|
import lombok.SneakyThrows; |
|
|
|
import org.apache.http.HttpResponse; |
|
|
|
import org.springframework.data.domain.Page; |
|
|
|
|
|
|
|
import org.springframework.data.domain.Pageable; |
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
import org.springframework.transaction.annotation.Transactional; |
|
|
|
import org.springframework.util.ObjectUtils; |
|
|
|
|
|
|
|
import java.util.HashMap; |
|
|
|
|
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.List; |
|
|
|
import java.util.Random; |
|
|
|
import java.util.Set; |
|
|
|
import java.util.concurrent.ThreadLocalRandom; |
|
|
|
|
|
|
|
|
|
|
|
@Service |
|
|
@ -92,7 +90,6 @@ public class DeviceImpl implements DeviceService { |
|
|
|
|
|
|
|
@Override |
|
|
|
public Object queryAll(Pageable pageable) { |
|
|
|
// PageRequest pageRequest = PageSort.pageRequest(pageable.getPageNumber(), pageable.getPageSize(), "sequence", Sort.Direction.ASC); |
|
|
|
Page<DeviceInfo> page = deviceInfoRepository.findAllList(pageable); |
|
|
|
if (getState()) { |
|
|
|
|
|
|
@ -111,53 +108,62 @@ public class DeviceImpl implements DeviceService { |
|
|
|
@Override |
|
|
|
@Transactional(rollbackFor = Exception.class) |
|
|
|
public void createDeseCabinet(DeviceInfoDto deviceInfoDto) { |
|
|
|
DeviceInfo deviceInfo = deviceInfoMapper.toEntity(deviceInfoDto); |
|
|
|
List<DeviceInfo> deviceInfoList = deviceInfoRepository.findByAreaNoAndAndDeviceIpAndAndDevicePort(deviceInfo.getAreaNo(), deviceInfo.getDeviceIp(), deviceInfo.getDevicePort()); |
|
|
|
if (deviceInfoList.size() != 0) { |
|
|
|
List<DeviceInfo> deviceInfoList = deviceInfoRepository.findByDeviceIpAndAndDevicePort(deviceInfoDto.getDeviceIp(), deviceInfoDto.getDevicePort()); |
|
|
|
List<DeviceArchivesTag> deviceArchivesTagList = deviceArchivesTagRepository.findByAreaNo(deviceInfoDto.getAreaNo()); |
|
|
|
if (ObjectUtils.isEmpty(deviceInfoList.size()) && ObjectUtils.isEmpty(deviceArchivesTagList.size())) { |
|
|
|
throw new BaseException("区号IP端口不能重复添加设备"); |
|
|
|
} |
|
|
|
DeviceArchivesTag deviceArchivesTag = new DeviceArchivesTag(); |
|
|
|
//创建密集架id |
|
|
|
deviceInfo.setId(NanoIdUtils.randomNanoId()); |
|
|
|
//生成架位 |
|
|
|
String position = deviceInfo.getAreaNo() + |
|
|
|
"-" + |
|
|
|
deviceInfo.getFirstColumnNo() + |
|
|
|
"-" + |
|
|
|
deviceInfo.getPartNo() + |
|
|
|
"-" + |
|
|
|
deviceInfo.getRowNo() + |
|
|
|
"-" + |
|
|
|
GenerateNum(); |
|
|
|
String leftOrRight; |
|
|
|
if (GenerateNum().equals("1")) { |
|
|
|
leftOrRight = "左"; |
|
|
|
} else { |
|
|
|
leftOrRight = "右"; |
|
|
|
deviceInfoDto.setId(NanoIdUtils.randomNanoId()); |
|
|
|
|
|
|
|
for (int i = deviceInfoDto.getFirstColumnNo(); i <= deviceInfoDto.getSumColumnNo() + deviceInfoDto.getFirstColumnNo(); i++) { |
|
|
|
for (int k = 1; k <= deviceInfoDto.getPartNo(); k++) { |
|
|
|
for (int n = 1; n <= deviceInfoDto.getRowNo(); n++) { |
|
|
|
Boolean boolLeftOrRight = GenerateNum(); |
|
|
|
|
|
|
|
String leftOrRight; |
|
|
|
Integer numLeftOrRight; |
|
|
|
if (boolLeftOrRight) { |
|
|
|
leftOrRight = "左"; |
|
|
|
numLeftOrRight = 1; |
|
|
|
} else { |
|
|
|
leftOrRight = "右"; |
|
|
|
numLeftOrRight = 2; |
|
|
|
} |
|
|
|
//架位 |
|
|
|
String position = deviceInfoDto.getAreaNo() + "-" + |
|
|
|
i + "-" + k + "-" + n + "-" + numLeftOrRight; |
|
|
|
|
|
|
|
String positionName = deviceInfoDto.getAreaNo() + "区" + |
|
|
|
i + "列" + k + "节" + n + "层" + leftOrRight; |
|
|
|
//生成架位标签表id |
|
|
|
deviceArchivesTag.setId(NanoIdUtils.randomNanoId()); |
|
|
|
deviceArchivesTag.setPosition(position); |
|
|
|
deviceArchivesTag.setDeviceInfoId(deviceInfoDto.getId()); |
|
|
|
deviceArchivesTag.setPosition_name(positionName); |
|
|
|
deviceArchivesTag.setAreaNo(deviceInfoDto.getAreaNo()); |
|
|
|
deviceArchivesTag.setFirstColumnNo(deviceInfoDto.getFirstColumnNo()); |
|
|
|
deviceArchivesTag.setColumnRowNo(i); |
|
|
|
deviceArchivesTag.setPartNo(k); |
|
|
|
deviceArchivesTag.setRowNo(n); |
|
|
|
deviceArchivesTag.setSumColumnNo(deviceInfoDto.getSumColumnNo()); |
|
|
|
deviceArchivesTag.setStoreroomCode(deviceInfoDto.getStoreroomCode()); |
|
|
|
deviceArchivesTagRepository.save(deviceArchivesTag); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
String positionName = deviceInfo.getAreaNo() + |
|
|
|
"区" + |
|
|
|
deviceInfo.getFirstColumnNo() + |
|
|
|
"列" + |
|
|
|
deviceInfo.getPartNo() + |
|
|
|
"节" + |
|
|
|
deviceInfo.getRowNo() + |
|
|
|
"层" + |
|
|
|
leftOrRight; |
|
|
|
DeviceArchivesTag deviceArchivesTag = new DeviceArchivesTag(); |
|
|
|
|
|
|
|
|
|
|
|
Integer num = deviceInfoRepository.findByMax(); |
|
|
|
if (num == 0) { |
|
|
|
deviceInfo.setSequence(1); |
|
|
|
deviceInfoDto.setSequence(1); |
|
|
|
} |
|
|
|
deviceInfo.setSequence(num + 1); |
|
|
|
//生成架位标签表id |
|
|
|
deviceArchivesTag.setId(NanoIdUtils.randomNanoId()); |
|
|
|
deviceArchivesTag.setPosition(position); |
|
|
|
deviceArchivesTag.setDeviceInfoId(deviceInfo.getId()); |
|
|
|
deviceArchivesTag.setPosition_name(positionName); |
|
|
|
deviceInfoDto.setSequence(num + 1); |
|
|
|
DeviceInfo deviceInfo = deviceInfoMapper.toEntity(deviceInfoDto); |
|
|
|
//创建联动操作状态对象 |
|
|
|
IsLinkageState(deviceInfo); |
|
|
|
IsCallbackState(deviceInfo); |
|
|
|
deviceArchivesTagRepository.save(deviceArchivesTag); |
|
|
|
IsLinkageState(deviceInfoDto); |
|
|
|
IsCallbackState(deviceInfoDto); |
|
|
|
deviceInfoRepository.save(deviceInfo); |
|
|
|
|
|
|
|
} |
|
|
@ -166,20 +172,19 @@ public class DeviceImpl implements DeviceService { |
|
|
|
@Transactional(rollbackFor = Exception.class) |
|
|
|
public void updateDeseCabinet(DeviceInfoDto deviceInfoDto) { |
|
|
|
DeviceInfo deviceInfo = deviceInfoMapper.toEntity(deviceInfoDto); |
|
|
|
List<DeviceInfo> deviceInfoList = deviceInfoRepository.findByAreaNoAndAndDeviceIpAndAndDevicePort(deviceInfo.getAreaNo(), deviceInfo.getDeviceIp(), deviceInfo.getDevicePort()); |
|
|
|
if (!ObjectUtils.isEmpty(deviceInfoList)) { |
|
|
|
throw new BaseException("区号IP端口不能重复添加设备"); |
|
|
|
} |
|
|
|
// List<DeviceInfo> deviceInfoList = deviceInfoRepository.findByAreaNoAndAndDeviceIpAndAndDevicePort(deviceInfo.getAreaNo(), deviceInfo.getDeviceIp(), deviceInfo.getDevicePort()); |
|
|
|
// if (!ObjectUtils.isEmpty(deviceInfoList)) { |
|
|
|
// throw new BaseException("区号IP端口不能重复添加设备"); |
|
|
|
// } |
|
|
|
DeviceInfo deviceInfo1 = deviceInfoRepository.findById(deviceInfo.getId()).orElseGet(DeviceInfo::new); |
|
|
|
if (ObjectUtils.isEmpty(deviceInfo1)) { |
|
|
|
throw new BaseException("数据不存在"); |
|
|
|
} |
|
|
|
deviceInfo1.setDeviceName(deviceInfo.getDeviceName()); |
|
|
|
deviceInfo1.setDeviceIp(deviceInfo.getDeviceIp()); |
|
|
|
deviceInfo1.setDevicePort(deviceInfo.getDevicePort()); |
|
|
|
deviceInfo1.setStoreroomCode(deviceInfo.getStoreroomCode()); |
|
|
|
IsLinkageState(deviceInfo); |
|
|
|
IsCallbackState(deviceInfo); |
|
|
|
deviceInfo1.setDeviceName(deviceInfoDto.getDeviceName()); |
|
|
|
deviceInfo1.setDeviceIp(deviceInfoDto.getDeviceIp()); |
|
|
|
deviceInfo1.setDevicePort(deviceInfoDto.getDevicePort()); |
|
|
|
IsLinkageState(deviceInfoDto); |
|
|
|
IsCallbackState(deviceInfoDto); |
|
|
|
deviceInfoRepository.save(deviceInfo1); |
|
|
|
|
|
|
|
} |
|
|
@ -191,59 +196,62 @@ public class DeviceImpl implements DeviceService { |
|
|
|
if (!ObjectUtils.isEmpty(rotaryCabinetList)) { |
|
|
|
throw new BaseException("同一IP和端口号下不能重复添加设备"); |
|
|
|
} |
|
|
|
DeviceInfo deviceInfo = deviceInfoMapper.toEntity(deviceInfoDto); |
|
|
|
deviceInfo.setId(NanoIdUtils.randomNanoId()); |
|
|
|
|
|
|
|
String position = deviceInfo.getCupboardNo() + |
|
|
|
"-" + |
|
|
|
deviceInfoDto.getRowNo() + |
|
|
|
"-" + |
|
|
|
deviceInfoDto.getRowNo() + |
|
|
|
"-" + |
|
|
|
deviceInfoDto.getColumnRowNo(); |
|
|
|
|
|
|
|
String positionName = deviceInfo.getCupboardNo() + |
|
|
|
"柜" + |
|
|
|
deviceInfoDto.getRowNo() + |
|
|
|
"层" + |
|
|
|
deviceInfoDto.getColumnRowNo() + |
|
|
|
"列"; |
|
|
|
deviceInfoDto.setId(NanoIdUtils.randomNanoId()); |
|
|
|
DeviceArchivesTag deviceArchivesTag = new DeviceArchivesTag(); |
|
|
|
for (int i = 1; i < deviceInfoDto.getCupboardNo(); i++) { |
|
|
|
for (int k = 1; k < deviceInfoDto.getRowNo(); k++) { |
|
|
|
for (int n = 1; n < deviceInfoDto.getColumnRowNo(); n++) { |
|
|
|
String position = i + "-" + k + "-" + n; |
|
|
|
String positionName = i + "柜" + k + "层" + n + "列"; |
|
|
|
|
|
|
|
deviceArchivesTag.setId(NanoIdUtils.randomNanoId()); |
|
|
|
deviceArchivesTag.setPosition(position); |
|
|
|
deviceArchivesTag.setPosition_name(positionName); |
|
|
|
deviceArchivesTag.setDeviceInfoId(deviceInfoDto.getId()); |
|
|
|
deviceArchivesTag.setCupboardNo(i); |
|
|
|
deviceArchivesTag.setRowNo(k); |
|
|
|
deviceArchivesTag.setColumnRowNo(n); |
|
|
|
deviceArchivesTag.setStoreroomCode(deviceInfoDto.getStoreroomCode()); |
|
|
|
deviceArchivesTagRepository.save(deviceArchivesTag); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
deviceArchivesTag.setId(NanoIdUtils.randomNanoId()); |
|
|
|
deviceArchivesTag.setPosition(position); |
|
|
|
deviceArchivesTag.setPosition_name(positionName); |
|
|
|
deviceArchivesTag.setDeviceInfoId(deviceInfoDto.getId()); |
|
|
|
Integer num = deviceInfoRepository.findByMax(); |
|
|
|
if (num == 0) { |
|
|
|
deviceInfo.setSequence(1); |
|
|
|
deviceInfoDto.setSequence(1); |
|
|
|
} |
|
|
|
deviceInfo.setSequence(num + 1); |
|
|
|
IsLinkageState(deviceInfo); |
|
|
|
IsCallbackState(deviceInfo); |
|
|
|
deviceInfoDto.setSequence(num + 1); |
|
|
|
IsLinkageState(deviceInfoDto); |
|
|
|
IsCallbackState(deviceInfoDto); |
|
|
|
DeviceInfo deviceInfo = deviceInfoMapper.toEntity(deviceInfoDto); |
|
|
|
deviceInfoRepository.save(deviceInfo); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
@Transactional(rollbackFor = Exception.class) |
|
|
|
public void updateRotaryCabinet(DeviceInfoDto deviceInfoDto) { |
|
|
|
List<DeviceInfo> deviceInfoList = deviceInfoRepository.findByDeviceIpAndDevicePort(deviceInfoDto.getDeviceIp(), deviceInfoDto.getDevicePort()); |
|
|
|
if (!ObjectUtils.isEmpty(deviceInfoList)) { |
|
|
|
throw new BaseException("同一IP和端口号下不能重复添加设备"); |
|
|
|
} |
|
|
|
// List<DeviceInfo> deviceInfoList = deviceInfoRepository.findByDeviceIpAndDevicePort(deviceInfoDto.getDeviceIp(), deviceInfoDto.getDevicePort()); |
|
|
|
// if (!ObjectUtils.isEmpty(deviceInfoList)) { |
|
|
|
// throw new BaseException("同一IP和端口号下不能重复添加设备"); |
|
|
|
// } |
|
|
|
DeviceInfo deviceInfo = deviceInfoRepository.findById(deviceInfoDto.getId()).orElseGet(DeviceInfo::new); |
|
|
|
if (ObjectUtils.isEmpty(deviceInfo)) { |
|
|
|
throw new BaseException("数据不存在"); |
|
|
|
} |
|
|
|
DeviceInfo deviceInfo1 = deviceInfoMapper.toEntity(deviceInfoDto); |
|
|
|
deviceInfo.setDeviceAccount(deviceInfo1.getDeviceAccount()); |
|
|
|
deviceInfo.setDevicePassword(deviceInfo1.getDevicePassword()); |
|
|
|
deviceInfo.setDeviceName(deviceInfo1.getDeviceName()); |
|
|
|
deviceInfo.setDeviceIp(deviceInfo1.getDeviceIp()); |
|
|
|
deviceInfo.setDevicePort(deviceInfo1.getDevicePort()); |
|
|
|
deviceInfo.setStoreroomCode(deviceInfo1.getStoreroomCode()); |
|
|
|
IsLinkageState(deviceInfo1); |
|
|
|
IsCallbackState(deviceInfo1); |
|
|
|
|
|
|
|
DeviceArchivesTag deviceArchivesTag = new DeviceArchivesTag(); |
|
|
|
deviceInfo.setDeviceAccount(deviceInfoDto.getDeviceAccount()); |
|
|
|
deviceInfo.setDevicePassword(deviceInfoDto.getDevicePassword()); |
|
|
|
deviceInfo.setDeviceName(deviceInfoDto.getDeviceName()); |
|
|
|
deviceInfo.setDeviceIp(deviceInfoDto.getDeviceIp()); |
|
|
|
deviceInfo.setDevicePort(deviceInfoDto.getDevicePort()); |
|
|
|
|
|
|
|
deviceArchivesTag.setStoreroomCode(deviceInfoDto.getStoreroomCode()); |
|
|
|
IsLinkageState(deviceInfoDto); |
|
|
|
IsCallbackState(deviceInfoDto); |
|
|
|
deviceInfoRepository.save(deviceInfo); |
|
|
|
} |
|
|
|
|
|
|
@ -270,14 +278,14 @@ public class DeviceImpl implements DeviceService { |
|
|
|
@Override |
|
|
|
@Transactional(rollbackFor = Exception.class) |
|
|
|
public void updateCamera(DeviceInfoDto deviceInfoDto) { |
|
|
|
List<DeviceInfo> deviceInfoList = deviceInfoRepository.findByDeviceIpAndDevicePortAndVideoRouteAndDeviceTypeId(deviceInfoDto.getDeviceIp(), |
|
|
|
deviceInfoDto.getDevicePort(), |
|
|
|
deviceInfoDto.getVideoRoute(), |
|
|
|
deviceInfoDto.getDeviceTypeId()); |
|
|
|
|
|
|
|
if (!ObjectUtils.isEmpty(deviceInfoList)) { |
|
|
|
throw new BaseException("同一IP和端口号下不能重复添加设备"); |
|
|
|
} |
|
|
|
// List<DeviceInfo> deviceInfoList = deviceInfoRepository.findByDeviceIpAndDevicePortAndVideoRouteAndDeviceTypeId(deviceInfoDto.getDeviceIp(), |
|
|
|
// deviceInfoDto.getDevicePort(), |
|
|
|
// deviceInfoDto.getVideoRoute(), |
|
|
|
// deviceInfoDto.getDeviceTypeId()); |
|
|
|
// |
|
|
|
// if (!ObjectUtils.isEmpty(deviceInfoList)) { |
|
|
|
// throw new BaseException("同一IP和端口号下不能重复添加设备"); |
|
|
|
// } |
|
|
|
DeviceInfo deviceInfo = deviceInfoMapper.toEntity(deviceInfoDto); |
|
|
|
DeviceInfo deviceInfo1 = deviceInfoRepository.findById(deviceInfo.getId()).orElseGet(DeviceInfo::new); |
|
|
|
deviceInfo1.setDeviceName(deviceInfo.getDeviceName()); |
|
|
@ -311,10 +319,10 @@ public class DeviceImpl implements DeviceService { |
|
|
|
@Override |
|
|
|
@Transactional(rollbackFor = Exception.class) |
|
|
|
public void updateInsideDevices(DeviceInfoDto deviceInfoDto) { |
|
|
|
List<DeviceInfo> deviceInfoList = deviceInfoRepository.findByDeviceIpAndDevicePortAndDeviceId(deviceInfoDto.getDeviceIp(), deviceInfoDto.getDevicePort(), deviceInfoDto.getDeviceId()); |
|
|
|
if (!ObjectUtils.isEmpty(deviceInfoList)) { |
|
|
|
throw new BaseException("同一IP和端口号下不能重复添加设备"); |
|
|
|
} |
|
|
|
// List<DeviceInfo> deviceInfoList = deviceInfoRepository.findByDeviceIpAndDevicePortAndDeviceId(deviceInfoDto.getDeviceIp(), deviceInfoDto.getDevicePort(), deviceInfoDto.getDeviceId()); |
|
|
|
// if (!ObjectUtils.isEmpty(deviceInfoList)) { |
|
|
|
// throw new BaseException("同一IP和端口号下不能重复添加设备"); |
|
|
|
// } |
|
|
|
DeviceInfo deviceInfo = deviceInfoMapper.toEntity(deviceInfoDto); |
|
|
|
DeviceInfo deviceInfo1 = deviceInfoRepository.findById(deviceInfo.getId()).orElseGet(DeviceInfo::new); |
|
|
|
deviceInfo1.setDeviceName(deviceInfo.getDeviceName()); |
|
|
@ -327,10 +335,10 @@ public class DeviceImpl implements DeviceService { |
|
|
|
@Override |
|
|
|
@Transactional(rollbackFor = Exception.class) |
|
|
|
public void createOutsideDevices(DeviceInfoDto deviceInfoDto) { |
|
|
|
List<DeviceInfo> deviceInfoList = deviceInfoRepository.findByDeviceIdAndDeviceTypeId(deviceInfoDto.getDeviceId(), deviceInfoDto.getDeviceTypeId()); |
|
|
|
if (deviceInfoList.size() != 0) { |
|
|
|
throw new BaseException("同一类型和同一设备id不能重复添加"); |
|
|
|
} |
|
|
|
// List<DeviceInfo> deviceInfoList = deviceInfoRepository.findByDeviceIdAndDeviceTypeId(deviceInfoDto.getDeviceId(), deviceInfoDto.getDeviceTypeId()); |
|
|
|
// if (deviceInfoList.size() != 0) { |
|
|
|
// throw new BaseException("同一类型和同一设备id不能重复添加"); |
|
|
|
// } |
|
|
|
DeviceInfo deviceInfo = deviceInfoMapper.toEntity(deviceInfoDto); |
|
|
|
deviceInfo.setId(NanoIdUtils.randomNanoId()); |
|
|
|
Integer num = deviceInfoRepository.findByMax(); |
|
|
@ -348,6 +356,7 @@ public class DeviceImpl implements DeviceService { |
|
|
|
DeviceInfo deviceInfo = deviceInfoMapper.toEntity(deviceInfoDto); |
|
|
|
DeviceInfo deviceInfo1 = deviceInfoRepository.findById(deviceInfo.getId()).orElseGet(DeviceInfo::new); |
|
|
|
deviceInfo1.setDeviceName(deviceInfo.getDeviceName()); |
|
|
|
deviceInfo1.setDeviceId(deviceInfo.getDeviceId()); |
|
|
|
deviceInfoRepository.save(deviceInfo1); |
|
|
|
} |
|
|
|
|
|
|
@ -385,9 +394,9 @@ public class DeviceImpl implements DeviceService { |
|
|
|
* |
|
|
|
* @return |
|
|
|
*/ |
|
|
|
private String GenerateNum() { |
|
|
|
ThreadLocalRandom tlr = ThreadLocalRandom.current(); |
|
|
|
return String.valueOf(tlr.nextInt(1, 2)); |
|
|
|
private Boolean GenerateNum() { |
|
|
|
Random random = new Random(); |
|
|
|
return random.nextBoolean(); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
@ -405,7 +414,7 @@ public class DeviceImpl implements DeviceService { |
|
|
|
* |
|
|
|
* @param deviceInfo / |
|
|
|
*/ |
|
|
|
private void IsLinkageState(DeviceInfo deviceInfo) { |
|
|
|
private void IsLinkageState(DeviceInfoDto deviceInfo) { |
|
|
|
|
|
|
|
if (StringUtils.isEmpty(deviceInfo.getIsLinkage().getId())) { |
|
|
|
OperatingState isLinkageState = new OperatingState(); |
|
|
@ -436,7 +445,7 @@ public class DeviceImpl implements DeviceService { |
|
|
|
* |
|
|
|
* @param deviceInfo / |
|
|
|
*/ |
|
|
|
private void IsCallbackState(DeviceInfo deviceInfo) { |
|
|
|
private void IsCallbackState(DeviceInfoDto deviceInfo) { |
|
|
|
|
|
|
|
if (StringUtils.isEmpty(deviceInfo.getIsCallback().getId())) { |
|
|
|
OperatingState isCallbackState = new OperatingState(); |
|
|
@ -460,4 +469,6 @@ public class DeviceImpl implements DeviceService { |
|
|
|
operatingStateRepository.save(isCallbackState1); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |