610 lines
26 KiB
Java
610 lines
26 KiB
Java
package taurus.newRobot;
|
|
|
|
import com.taurus.core.entity.ITArray;
|
|
import com.taurus.core.entity.ITObject;
|
|
import com.taurus.core.entity.TObject;
|
|
import com.taurus.core.events.Event;
|
|
import com.taurus.core.events.IEventListener;
|
|
import com.taurus.core.plugin.redis.Redis;
|
|
import com.taurus.core.util.ICallback;
|
|
import com.taurus.core.util.StringUtil;
|
|
import hunan.HuNanChangSha;
|
|
import redis.clients.jedis.Jedis;
|
|
import redis.clients.jedis.Pipeline;
|
|
import redis.clients.jedis.Response;
|
|
import taurus.client.Message;
|
|
import taurus.client.MessageResponse;
|
|
import taurus.client.SocketCode;
|
|
import taurus.client.TaurusClient;
|
|
import taurus.client.business.AccountBusiness;
|
|
import taurus.client.business.GroupRoomBusiness;
|
|
import taurus.util.ChangShaSuanFaTest;
|
|
import taurus.util.TinHuChi;
|
|
|
|
import java.util.*;
|
|
import java.util.stream.Collectors;
|
|
|
|
public class jiqiren {
|
|
|
|
public String wanfaId = "";
|
|
// 会话标识
|
|
private String session = "";
|
|
// 访问令牌
|
|
public String token = "";
|
|
|
|
// 客户端连接对象
|
|
private TaurusClient client = null;
|
|
|
|
|
|
private Map<String, Object> mapclient = new HashMap<>();
|
|
|
|
public TaurusClient getClient() {
|
|
return client;
|
|
}
|
|
|
|
public void setClient(TaurusClient client) {
|
|
this.client = client;
|
|
}
|
|
|
|
//进入真人房间
|
|
public void tcp_jiqirenzhenren(String id) {
|
|
Jedis jedis0 = Redis.use().getJedis();
|
|
Jedis jedis11 = Redis.use("group1_db11").getJedis();
|
|
Jedis jedis2 = Redis.use("group1_db2").getJedis();
|
|
|
|
String roomKey = "";
|
|
String roomId = id.substring(id.indexOf(":") + 1);
|
|
roomKey = "room:" + roomId;
|
|
//玩法id
|
|
String gpid = jedis0.hget(roomKey, "gpid");
|
|
//圈子id
|
|
String group = jedis0.hget(roomKey, "group");
|
|
//获取玩法对应的机器人 g{330800}:play:10
|
|
String playKey = "g{" + group + "}:play:" + gpid;
|
|
|
|
|
|
String players1 = jedis0.hget(roomKey, "players");
|
|
|
|
if (jedis11.hget(playKey, "leftover_robot") != null) {
|
|
//玩法配置的机器人数量
|
|
String leftover_robot = jedis11.hget(playKey, "leftover_robot");
|
|
//机器人主动找真人
|
|
if (players1 != null && !players1.equals("[]")) {
|
|
List<String> availableRobots1 = getAvailableRobots1();
|
|
|
|
String players = jedis0.hget(roomKey, "players");
|
|
players = players.substring(1, players.length() - 1);
|
|
|
|
String[] playerIds1 = players.split(",");
|
|
|
|
String maxPlayers = jedis0.hget(roomKey, "maxPlayers");
|
|
if (Integer.parseInt(maxPlayers) == 2) {
|
|
if (playerIds1.length == 1) {
|
|
//循环playerIds
|
|
for (int i = 0; i < playerIds1.length; i++) {
|
|
String playeid = playerIds1[i];
|
|
if (!availableRobots1.contains(playeid) && Integer.parseInt(leftover_robot) > 0) {
|
|
Map<String, String> stringStringMap = jedis2.hgetAll(playKey);
|
|
List<String> zeroValueKeys = getKeysWithValueZero(stringStringMap);
|
|
System.out.println("值为0的机器人ID: " + zeroValueKeys);
|
|
String randomKeyFromList = getRandomKeyFromList(zeroValueKeys);
|
|
System.out.println("随机给的用户id----" + randomKeyFromList);
|
|
|
|
|
|
wanfaId = jedis0.hget(roomKey, "game");
|
|
|
|
if ("22".equalsIgnoreCase(wanfaId)) { //湖南红中麻将
|
|
//client = new TaurusClient("8.138.242.190:6421", "game", TaurusClient.ConnectionProtocol.Tcp);
|
|
}
|
|
|
|
if ("10".equalsIgnoreCase(wanfaId)) {
|
|
client = new TaurusClient("127.0.0.1:6311", "game", TaurusClient.ConnectionProtocol.Tcp);
|
|
//TaurusClient client1=getClient();
|
|
client.connect();
|
|
mapclient.put(randomKeyFromList, client);
|
|
}
|
|
if ("66".equalsIgnoreCase(wanfaId)) {
|
|
// client = new TaurusClient("8.138.242.190:6841", "game", TaurusClient.ConnectionProtocol.Tcp);
|
|
}
|
|
|
|
ITObject object = null;
|
|
AccountBusiness accountBusiness = null;
|
|
accountBusiness = new AccountBusiness();
|
|
// 登录获取session跟token
|
|
|
|
if (jedis0.keys("{user}:" + randomKeyFromList + "_token").size() != 0) {
|
|
|
|
Set<String> keys1 = jedis0.keys("{user}:" + randomKeyFromList + "_token");
|
|
if (keys1 == null) {
|
|
try {
|
|
object = accountBusiness.idPasswordLogin(Integer.parseInt(randomKeyFromList), "123456");
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
}
|
|
ITObject validate = TObject.newInstance();
|
|
validate.putString("token", object.getString("token"));
|
|
token = object.getString("token");
|
|
session = accountBusiness.getSession();
|
|
} else {
|
|
Set<String> keys = jedis0.smembers("{user}:" + randomKeyFromList + "_token");
|
|
List<String> keyList = new ArrayList<>(keys);
|
|
session = "{user}:" + randomKeyFromList;
|
|
token = keyList.get(0);
|
|
|
|
}
|
|
} else {
|
|
|
|
try {
|
|
object = accountBusiness.idPasswordLogin(Integer.parseInt(randomKeyFromList), "123456");
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
}
|
|
ITObject validate = TObject.newInstance();
|
|
validate.putString("token", object.getString("token"));
|
|
token = object.getString("token");
|
|
session = accountBusiness.getSession();
|
|
}
|
|
|
|
|
|
String roomKey1 = "room:" + roomId;
|
|
|
|
try {
|
|
ITObject roomInfos = GroupRoomBusiness.joinRoom(Integer.parseInt(group), roomKey1, session, null);
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
}
|
|
joinRoom(Integer.parseInt(randomKeyFromList)); //进入房间
|
|
|
|
|
|
jedis2.hset(playKey, randomKeyFromList, "1");
|
|
String robortInfoKey = "{robortInfo}:" + randomKeyFromList;
|
|
jedis2.hset(robortInfoKey, "circleId", group);
|
|
jedis2.hset(robortInfoKey, "pid", gpid);
|
|
jedis2.hset(robortInfoKey, "room_id", roomId);
|
|
ready(); //准备
|
|
|
|
jedis11.hincrBy(playKey, "leftover_robot", -1);
|
|
lianjiejiqiren lianjiejiqiren = new lianjiejiqiren();
|
|
lianjiejiqiren.token = token;
|
|
lianjiejiqiren.session = session;
|
|
lianjiejiqiren.lianjie(client, wanfaId, mapclient);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
System.out.println(roomKey);
|
|
}
|
|
|
|
|
|
//进入中括号的房间
|
|
public void tcp_jiqirezhongkouhao(String id) {
|
|
Jedis jedis0 = Redis.use().getJedis();
|
|
Jedis jedis11 = Redis.use("group1_db11").getJedis();
|
|
Jedis jedis2 = Redis.use("group1_db2").getJedis();
|
|
String roomKey = "";
|
|
String roomId = id.substring(id.indexOf(":") + 1);
|
|
roomKey = "room:" + roomId;
|
|
//玩法id
|
|
String gpid = jedis0.hget(roomKey, "gpid");
|
|
//圈子id
|
|
String group = jedis0.hget(roomKey, "group");
|
|
//获取玩法对应的机器人 g{330800}:play:10
|
|
String playKey = "g{" + group + "}:play:" + gpid;
|
|
String players1 = jedis0.hget(roomKey, "players");
|
|
|
|
if (jedis11.hget(playKey, "leftover_robot") != null && players1 != null) {
|
|
//玩法配置的机器人数量
|
|
String leftover_robot = jedis11.hget(playKey, "leftover_robot");
|
|
//机器人进入退出的房间
|
|
if (players1.equals("[]")) {
|
|
String maxPlayers = jedis0.hget(roomKey, "maxPlayers");
|
|
if (Integer.parseInt(maxPlayers) == 2) {
|
|
|
|
if (Integer.parseInt(leftover_robot) > 0) {
|
|
int count = countValuesEqualToOne(jedis2, playKey);
|
|
System.out.println("count 数量 +++++++++++++++++++++" + count);
|
|
if (count < 2) {
|
|
Map<String, String> stringStringMap = jedis2.hgetAll(playKey);
|
|
List<String> zeroValueKeys = getKeysWithValueZero(stringStringMap);
|
|
System.out.println("值为0的机器人ID: " + zeroValueKeys);
|
|
String randomKeyFromList = getRandomKeyFromList(zeroValueKeys);
|
|
System.out.println("随机给的用户id----" + randomKeyFromList);
|
|
|
|
wanfaId = jedis0.hget(roomKey, "game");
|
|
|
|
if ("22".equalsIgnoreCase(wanfaId)) { //湖南红中麻将
|
|
// client = new TaurusClient("8.138.242.190:6421", "game", TaurusClient.ConnectionProtocol.Tcp);
|
|
}
|
|
if ("10".equalsIgnoreCase(wanfaId)) {
|
|
client = new TaurusClient("127.0.0.1:6311", "game", TaurusClient.ConnectionProtocol.Tcp);
|
|
client.connect();
|
|
mapclient.put(randomKeyFromList, client);
|
|
}
|
|
if ("66".equalsIgnoreCase(wanfaId)) {
|
|
// client = new TaurusClient("8.138.242.190:6841", "game", TaurusClient.ConnectionProtocol.Tcp);
|
|
}
|
|
|
|
ITObject object = null;
|
|
AccountBusiness accountBusiness = null;
|
|
accountBusiness = new AccountBusiness();
|
|
// 登录获取session跟token
|
|
|
|
if (jedis0.keys("{user}:" + randomKeyFromList + "_token").size() != 0) {
|
|
|
|
Set<String> keys1 = jedis0.keys("{user}:" + randomKeyFromList + "_token");
|
|
if (keys1 == null) {
|
|
try {
|
|
object = accountBusiness.idPasswordLogin(Integer.parseInt(randomKeyFromList), "123456");
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
}
|
|
ITObject validate = TObject.newInstance();
|
|
validate.putString("token", object.getString("token"));
|
|
token = object.getString("token");
|
|
session = accountBusiness.getSession();
|
|
} else {
|
|
Set<String> keys = jedis0.smembers("{user}:" + randomKeyFromList + "_token");
|
|
List<String> keyList = new ArrayList<>(keys);
|
|
session = "{user}:" + randomKeyFromList;
|
|
token = keyList.get(0);
|
|
|
|
}
|
|
} else {
|
|
|
|
try {
|
|
object = accountBusiness.idPasswordLogin(Integer.parseInt(randomKeyFromList), "123456");
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
}
|
|
ITObject validate = TObject.newInstance();
|
|
validate.putString("token", object.getString("token"));
|
|
token = object.getString("token");
|
|
session = accountBusiness.getSession();
|
|
}
|
|
|
|
|
|
String roomKey1 = "room:" + roomId;
|
|
|
|
try {
|
|
ITObject roomInfos = GroupRoomBusiness.joinRoom(Integer.parseInt(group), roomKey1, session, null);
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
}
|
|
joinRoom(Integer.parseInt(randomKeyFromList)); //进入房间
|
|
|
|
|
|
jedis2.hset(playKey, randomKeyFromList, "1");
|
|
String robortInfoKey = "{robortInfo}:" + randomKeyFromList;
|
|
jedis2.hset(robortInfoKey, "circleId", group);
|
|
jedis2.hset(robortInfoKey, "pid", gpid);
|
|
jedis2.hset(robortInfoKey, "room_id", roomId);
|
|
ready(); //准备
|
|
|
|
jedis11.hincrBy(playKey, "leftover_robot", -1);
|
|
lianjiejiqiren lianjiejiqiren = new lianjiejiqiren();
|
|
lianjiejiqiren.token = token;
|
|
lianjiejiqiren.session = session;
|
|
lianjiejiqiren.lianjie(client, wanfaId, mapclient);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
jedis0.close();
|
|
jedis2.close();
|
|
jedis11.close();
|
|
|
|
}
|
|
|
|
|
|
//创建房间,进入房间
|
|
public void createRoomsForCircle(String circleId, Map<String, Integer> playRoomMap) {
|
|
Jedis jedis2 = Redis.use("group1_db2").getJedis();
|
|
Jedis jedis11 = Redis.use("group1_db11").getJedis();
|
|
Jedis jedis0 = Redis.use().getJedis();
|
|
// 按玩法ID排序处理
|
|
List<Map.Entry<String, Integer>> sortedPlays = playRoomMap.entrySet().stream()
|
|
.sorted(Map.Entry.comparingByKey())
|
|
.collect(Collectors.toList());
|
|
|
|
for (Map.Entry<String, Integer> entry : sortedPlays) {
|
|
String playId = entry.getKey();
|
|
int requiredRooms = entry.getValue();
|
|
|
|
if (requiredRooms <= 0) {
|
|
System.out.println("玩法 " + playId + ": 跳过创建 (需求数=" + requiredRooms + ")");
|
|
continue;
|
|
}
|
|
|
|
boolean isPlaying = true;
|
|
//获取所有房间
|
|
Set<String> roomIds = jedis0.keys("room:*");
|
|
for (String id : roomIds) {
|
|
String roomId = id.substring(id.indexOf(":") + 1);
|
|
String roomKey = "room:" + roomId;
|
|
String players = jedis0.hget(roomKey, "players");
|
|
if (players != null) {
|
|
if (players.equals("[]")) {
|
|
isPlaying = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
System.out.println("玩法 " + playId + ": 创建 " + requiredRooms + " 个房间");
|
|
|
|
List<Object> roomsForPlay = new ArrayList<>();
|
|
|
|
for (int i = 1; i <= requiredRooms; i++) {
|
|
try {
|
|
String keys = "g{" + circleId + "}:play:" + playId;
|
|
if (jedis11.hget(keys, "leftover_robot") != null && isPlaying) {
|
|
String leftover_robot = jedis11.hget(keys, "leftover_robot");
|
|
if (Integer.parseInt(leftover_robot) > 0) {
|
|
Map<String, String> stringStringMap = jedis2.hgetAll(keys);
|
|
|
|
|
|
List<String> zeroValueKeys = getKeysWithValueZero(stringStringMap);
|
|
System.out.println("值为0的机器人ID: " + zeroValueKeys);
|
|
String randomKeyFromList = getRandomKeyFromList(zeroValueKeys);
|
|
System.out.println("随机给的用户id----" + randomKeyFromList);
|
|
|
|
jedis2.hset(keys, randomKeyFromList, "1");
|
|
|
|
ITObject object = null;
|
|
AccountBusiness accountBusiness = null;
|
|
accountBusiness = new AccountBusiness();
|
|
|
|
// 登录获取session跟token
|
|
if (jedis0.keys("{user}:" + randomKeyFromList + "_token").size() != 0) {
|
|
Set<String> keys1 = jedis0.keys("{user}:" + randomKeyFromList + "_token");
|
|
if (keys1 == null) {
|
|
object = accountBusiness.idPasswordLogin(Integer.parseInt(randomKeyFromList), "123456");
|
|
ITObject validate = TObject.newInstance();
|
|
validate.putString("token", object.getString("token"));
|
|
token = object.getString("token");
|
|
session = accountBusiness.getSession();
|
|
} else {
|
|
Set<String> keys2 = jedis0.smembers("{user}:" + randomKeyFromList + "_token");
|
|
List<String> keyList = new ArrayList<>(keys2);
|
|
session = "{user}:" + randomKeyFromList;
|
|
token = keyList.get(0);
|
|
}
|
|
} else {
|
|
object = accountBusiness.idPasswordLogin(Integer.parseInt(randomKeyFromList), "123456");
|
|
ITObject validate = TObject.newInstance();
|
|
validate.putString("token", object.getString("token"));
|
|
token = object.getString("token");
|
|
session = accountBusiness.getSession();
|
|
}
|
|
|
|
|
|
// 调用原有的房间匹配逻辑
|
|
Object room = GroupRoomBusiness.matchRoom(Integer.parseInt(circleId), Integer.parseInt(playId), session, "Android", false);
|
|
String game = jedis0.hget(String.valueOf(room), "game");
|
|
wanfaId = String.valueOf(game);
|
|
String roomKey = String.valueOf(room);
|
|
System.out.println("roomkey--------" + roomKey);
|
|
|
|
client = null;
|
|
|
|
System.out.println("wanfaId" + wanfaId);
|
|
|
|
|
|
if ("22".equalsIgnoreCase(wanfaId)) { //湖南红中麻将
|
|
client = new TaurusClient("8.138.242.190:6421", "game", TaurusClient.ConnectionProtocol.Tcp);
|
|
}
|
|
|
|
if ("10".equalsIgnoreCase(wanfaId)) {
|
|
client = new TaurusClient("127.0.0.1:6311", "game", TaurusClient.ConnectionProtocol.Tcp);
|
|
// client.setSession(session);
|
|
client.connect();
|
|
mapclient.put(randomKeyFromList, client);
|
|
}
|
|
System.out.println("clinet 111 " + client);
|
|
|
|
if ("66".equalsIgnoreCase(wanfaId)) {
|
|
client = new TaurusClient("8.138.242.190:6841", "game", TaurusClient.ConnectionProtocol.Tcp);
|
|
}
|
|
|
|
System.out.println("id ++++++" + mapclient);
|
|
System.out.println("mapclient----" + mapclient);
|
|
ITObject roomInfos = GroupRoomBusiness.joinRoom(Integer.parseInt(circleId), roomKey, this.session, null);
|
|
String roomId = roomInfos.getString("room_id");
|
|
String robort = "{robortInfo}:" + randomKeyFromList;
|
|
jedis2.hset(robort, "room_id", roomId);
|
|
jedis2.hset(robort, "circleId", circleId);
|
|
jedis2.hset(robort, "pid", playId);
|
|
|
|
|
|
joinRoom(Integer.parseInt(randomKeyFromList)); //进入房间
|
|
|
|
|
|
String playKey1 = "g{" + circleId + "}:play:" + playId;
|
|
|
|
jedis11.hincrBy(playKey1, "leftover_robot", -1);
|
|
|
|
lianjiejiqiren lianjiejiqiren = new lianjiejiqiren();
|
|
lianjiejiqiren.token = token;
|
|
lianjiejiqiren.session = session;
|
|
lianjiejiqiren.lianjie(client, wanfaId, mapclient);
|
|
ready(); //准备
|
|
|
|
if (room != null) {
|
|
roomsForPlay.add(room);
|
|
System.out.println(" 第 " + i + " 个房间创建成功");
|
|
} else {
|
|
System.out.println(" 第 " + i + " 个房间创建失败");
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
} catch (InterruptedException e) {
|
|
Thread.currentThread().interrupt();
|
|
System.err.println("创建过程被中断");
|
|
break;
|
|
} catch (Exception e) {
|
|
System.err.println("创建房间时出错: " + e.getMessage());
|
|
}
|
|
}
|
|
jedis2.close();
|
|
jedis11.close();
|
|
jedis0.close();
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* 统计Hash中值为"1"的字段数量
|
|
*/
|
|
public static int countValuesEqualToOne(Jedis jedis, String key) {
|
|
int count = 0;
|
|
|
|
Map<String, String> hashData = jedis.hgetAll(key);
|
|
|
|
for (Map.Entry<String, String> entry : hashData.entrySet()) {
|
|
if ("1".equals(entry.getValue())) {
|
|
count++;
|
|
System.out.println("找到字段: " + entry.getKey() + " = " + entry.getValue());
|
|
}
|
|
}
|
|
|
|
return count;
|
|
}
|
|
|
|
|
|
//获取所有机器人
|
|
public List<String> getAvailableRobots1() {
|
|
Jedis jedis2 = Redis.use("group1_db2").getJedis();
|
|
|
|
Set<String> allRobotKeys = jedis2.keys("{robot}:*");
|
|
List<String> availableRobots = new ArrayList<>();
|
|
|
|
// 使用Pipeline提高效率
|
|
Pipeline pipeline = jedis2.pipelined();
|
|
List<Response<String>> responses = new ArrayList<>();
|
|
|
|
for (String robotKey : allRobotKeys) {
|
|
responses.add(pipeline.hget(robotKey, "start"));
|
|
}
|
|
|
|
pipeline.sync();
|
|
|
|
// 提取机器人ID并筛选
|
|
int index = 0;
|
|
for (String robotKey : allRobotKeys) {
|
|
String startStatus = responses.get(index).get();
|
|
|
|
String robotId = robotKey.substring(robotKey.indexOf(":") + 1);
|
|
availableRobots.add(robotId);
|
|
index++;
|
|
}
|
|
jedis2.close();
|
|
return availableRobots;
|
|
}
|
|
|
|
|
|
//获取状态为0的机器人
|
|
public static List<String> getKeysWithValueZero(Map<String, String> robotData) {
|
|
List<String> result = new ArrayList<>();
|
|
|
|
for (Map.Entry<String, String> entry : robotData.entrySet()) {
|
|
if ("0".equals(entry.getValue())) {
|
|
result.add(entry.getKey());
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
|
|
//随机分配机器人
|
|
public String getRandomKeyFromList(List<String> zeroValueKeys) {
|
|
if (zeroValueKeys == null || zeroValueKeys.isEmpty()) {
|
|
return null;
|
|
}
|
|
|
|
Random random = new Random();
|
|
int randomIndex = random.nextInt(zeroValueKeys.size());
|
|
return zeroValueKeys.get(randomIndex);
|
|
}
|
|
|
|
//监听
|
|
|
|
|
|
/**
|
|
* 加入房间方法
|
|
*
|
|
* @return
|
|
*/
|
|
public String joinRoom(int playerId) {
|
|
try {
|
|
// 添加2秒延迟
|
|
Thread.sleep(5000);
|
|
|
|
ITObject params = TObject.newInstance();
|
|
params.putString("session", session + "," + token);
|
|
|
|
client.send("1002", params, response -> {
|
|
ITObject obj = response.messageData.param.getTObject("tableInfo");
|
|
});
|
|
} catch (InterruptedException e) {
|
|
e.printStackTrace();
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* 线程休眠方法
|
|
*
|
|
* @param time 休眠时间(毫秒)
|
|
*/
|
|
public static void sleepTime(int time) {
|
|
try {
|
|
// 添加延迟
|
|
Thread.sleep(time);
|
|
} catch (InterruptedException e) {
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 准备方法
|
|
*
|
|
* @return
|
|
*/
|
|
public String ready() {
|
|
try {
|
|
// 添加1秒延迟
|
|
Thread.sleep(1000);
|
|
} catch (InterruptedException e) {
|
|
e.printStackTrace();
|
|
}
|
|
|
|
|
|
ITObject params = TObject.newInstance();
|
|
params.putString("session", session + "," + token);
|
|
|
|
client.send("1003", params, new ICallback<MessageResponse>() {
|
|
|
|
@Override
|
|
public void action(MessageResponse messageResponse) {
|
|
|
|
|
|
}
|
|
});
|
|
return null;
|
|
}
|
|
|
|
|
|
}
|