(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Script/module/Tool/GameTool.js'; var __require = nodeEnv ? function (request) { return cc.require(request); } : function (request) { return __quick_compile_project__.require(request, __filename); }; function __define (exports, require, module) { if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict"; cc._RF.push(module, '43bfcJ6/25Fs4fHUE0PeBOX', 'GameTool'); // Script/module/Tool/GameTool.ts "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.GameTool = void 0; //最大工具类 各种公共方法,以及处理上传,获取后端接口数据 var GameTool = { _startTime: 0, _endTime: 0, _totalTime: 0, //获取userId Authentication: function () { var name = "user_" + cc.fx.GameConfig.GM_INFO.gameId; var data = null; if (localStorage.getItem(name)) data = JSON.parse(localStorage.getItem(name)); if (data == "undifend" || data == null || data == "") { var url = "https://api.sparkus.cn/api/user/auth/login?domain=hui32579WdYPsgYq&callback=" + location.href; window.location.href = url; } else { cc.fx.StorageMessage.setStorage(name, data); cc.fx.GameConfig.GM_INFO.userId = parseInt(data.userId); } }, //埋点上传 setGameData: function () { //GAME_DATA 初始化 每次清零 cc.fx.GameConfig.GAME_DATA = []; cc.fx.GameConfig.GAME_DATA.push(cc.fx.GameConfig.CLICK_DATA); var level = cc.fx.GameConfig.CLICK_DATA.round; cc.fx.GameConfig.CLICK_init(); var data = cc.fx.GameConfig.GAME_DATA; var matchId = this.getMatchId(level); var postData = { "gameId": cc.fx.GameConfig.GM_INFO.gameId, "userId": cc.fx.GameConfig.GM_INFO.userId, "matchId": matchId, "data": data }; console.log("上传数据:", postData); cc.fx.HttpUtil.uploadUserLogData(postData, function () { }); }, //上传排行榜 type为1 setRank: function (data) { //GAME_DATA 初始化 每次清零 var postData = { "gameId": cc.fx.GameConfig.GM_INFO.gameId, "userId": cc.fx.GameConfig.GM_INFO.userId, "type": 1, "reactionTime": data, "totalSunCount": cc.fx.GameConfig.GM_INFO.total, "success": cc.fx.GameConfig.GM_INFO.success }; cc.fx.HttpUtil.rankData(1, function () { }, postData); }, //获取排行榜 type为2 getRank: function (data, callback) { var rankLength = data.length; var postData = { "gameId": cc.fx.GameConfig.GM_INFO.gameId, "userId": cc.fx.GameConfig.GM_INFO.userId, "page": 1, "pageSize": rankLength }; //回调进getRankData cc.fx.HttpUtil.rankData(2, function (data) { callback(data); }, postData); }, //获取matchId 用于上传每次点击数据里面记录id方便查询 getMatchId: function (level) { var matchId = cc.sys.localStorage.getItem("matchId"); var tempId = matchId; if (matchId == "undifend" || matchId == null) { matchId = this.setMatchId(); } else { if (this.containsNanana(matchId) == true) { matchId = this.setMatchId(); } else { var char = parseInt(tempId.substring(10, tempId.length)); if (level == 1) { char += 1; matchId = tempId.slice(0, 10) + char + ""; if (this.containsNanana(matchId)) matchId = this.setMatchId(); cc.fx.GameConfig.GM_INFO.matchId = matchId; cc.sys.localStorage.setItem("matchId", matchId); } } } if (this.containsNanana(matchId) == true) { matchId = this.setMatchId(); } return matchId; }, //检测matchId 如果有缓存以前的nanana数据清除 containsNanana: function (str) { return /na/i.test(str); }, //重新设置MatchId setMatchId: function () { // 定义包含可用字符的字符集 var characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; // 创建一个数组以保存随机字符 var uuidArray = []; // 循环10次 生成10位的UUID for (var i = 0; i < 10; i++) { // 生成随机索引,范围是字符集的长度 var randomIndex = Math.floor(Math.random() * characters.length); // 从字符集中获取随机字符 var randomChar = characters.charAt(randomIndex); // 将字符添加到数组中 uuidArray.push(randomChar); } var data = uuidArray.join('') + 1 + ""; cc.sys.localStorage.setItem("matchNumber", 1); if (this.containsNanana(data)) data = this.setMatchId(); cc.sys.localStorage.setItem("matchId", data); cc.fx.GameConfig.GM_INFO.matchId = data; return data; }, //截取名字 subName: function (name, length) { if (name.length > length) { name = name.substring(0, length) + "..."; } return name; }, //设置头像 setPic: function (node, pic) { node.active = false; var url = pic; setTimeout(function () { fetch(url) .then(function (response) { return response.headers.get('Content-Length'); }) .then(function (errNo) { if (errNo == "5093") { node.active = true; } }) .catch(function (error) { // console.error('Error fetching X-Info:', error); }); }, 100); cc.assetManager.loadRemote(url, { ext: '.png' }, function (err, texture) { if (texture) { node.active = true; node.getComponent(cc.Sprite).spriteFrame = new cc.SpriteFrame(texture); } else { // console.log(err,texture) } }); }, //第一个参数把目标带进来处理,第二个参数为名字长度,不同场景不同需求 //名字4短,小排行,名字6长,大排行 getRankData: function (data, target, nameLength) { target.listData = data.data.list; target.selfData = data.data.info; var rankData = []; var self = false; cc.fx.GameTool.setPic(target.selfNode.getChildByName("pic").getChildByName("icon"), target.selfData.pic); for (var i = 0; i <= target.listData.length - 1; i++) { rankData.push({ rank: (i + 1), name: target.listData[i].nickName, total: target.listData[i].totalSunCount, pic: target.listData[i].pic }); if (cc.fx.GameConfig.GM_INFO.userId == target.listData[i].userId) { self = true; target.rankNumber = i; target.selfNode.getChildByName("rankLab").getComponent(cc.Label).string = (i + 1) + ""; } if (i == (target.listData.length - 1) && self == false) { target.rankNumber = i; target.selfNode.getChildByName("rankLab").getComponent(cc.Label).string = "99+"; } } var name = cc.fx.GameTool.subName(target.selfData.nickName, nameLength); target.selfNode.getChildByName("nameLab").getComponent(cc.Label).string = name; target.selfNode.getChildByName("totalLab").getComponent(cc.Label).string = target.selfData.totalSunCount; switch (target.selfNode.getChildByName("rankLab").getComponent(cc.Label).string) { case "1": target.selfNode.getChildByName("rank").getChildByName("one").active = true; break; case "2": target.selfNode.getChildByName("rank").getChildByName("two").active = true; break; case "3": target.selfNode.getChildByName("rank").getChildByName("three").active = true; break; } // 大排行 if (nameLength == 6) { target.rankList.setData(rankData); target.selfNode.opacity = 255; if (target.selfData.totalSunCount == 0) target.selfNode.opacity = 0; } }, getSetScreenResolutionFlag: function () { var size = cc.winSize; var width = size.width; var height = size.height; if ((height / width) > (16.2 / 9)) return false; return true; }, //判断全面屏适配 setFit: function (canvas) { var flag = cc.fx.GameTool.getSetScreenResolutionFlag(); if (flag) { // console.log("不是全面屏"); } else { // console.log("是全面屏"); } return flag; }, //获取游戏信息 getGameInfo: function (node) { var jg = false; return jg; }, //设置游戏信息 setGameInfo: function (pd) { }, //输入秒,返回需要展示时间格式 getTimeMargin: function (second) { var total = 0; total = second; var hour = 0; hour = parseInt((total / 3600) + ""); //计算整数小时数 var afterHour = total - hour * 60 * 60; //取得算出小时数后剩余的秒数 var min = parseInt((afterHour / 60) + ""); //计算整数分 var m = "" + min; if (min < 10) m = "0" + min; var afterMin = total - hour * 60 * 60 - min * 60; //取得算出分后剩余的秒数 var miao = afterMin + ""; if (afterMin < 10) miao = "0" + afterMin; return m + ':' + miao; }, //获取时间戳 getTime: function () { var timestamp = new Date().getTime(); return timestamp; }, pushLister: function () { }, removeAllLister: function () { }, }; exports.GameTool = GameTool; cc._RF.pop(); } if (nodeEnv) { __define(__module.exports, __require, __module); } else { __quick_compile_project__.registerModuleFunc(__filename, function () { __define(__module.exports, __require, __module); }); } })(); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0XFxtb2R1bGVcXFRvb2xcXEdhbWVUb29sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBLCtCQUErQjtBQUMvQixJQUFJLFFBQVEsR0FBRztJQUNYLFVBQVUsRUFBRSxDQUFDO0lBQ2IsUUFBUSxFQUFFLENBQUM7SUFDWCxVQUFVLEVBQUUsQ0FBQztJQUNiLFVBQVU7SUFDVixjQUFjO1FBQ1YsSUFBSSxJQUFJLEdBQUcsT0FBTyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDckQsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLElBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDN0UsSUFBRyxJQUFJLElBQUksVUFBVSxJQUFJLElBQUksSUFBRSxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUUsRUFBQztZQUM5QyxJQUFJLEdBQUcsR0FBRyw4RUFBOEUsR0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ3ZHLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztTQUM5QjthQUNHO1lBQ0EsRUFBRSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLElBQUksRUFBQyxJQUFJLENBQUMsQ0FBQztZQUMzQyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDM0Q7SUFDTCxDQUFDO0lBRUQsTUFBTTtJQUNOLFdBQVc7UUFDUCxvQkFBb0I7UUFDcEIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNo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QUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0lBQ0QsVUFBVSxFQUFDO0lBRVgsQ0FBQztJQUNELGVBQWUsRUFBQztJQUVoQixDQUFDO0NBRUosQ0FBQztBQUNPLDRCQUFRIiwiZmlsZSI6IiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiXHJcbi8v5pyA5aSn5bel5YW357G7ICDlkITnp43lhazlhbHmlrnms5XvvIzku6Xlj4rlpITnkIbkuIrkvKDvvIzojrflj5blkI7nq6/mjqXlj6PmlbDmja5cclxudmFyIEdhbWVUb29sID0ge1xyXG4gICAgX3N0YXJ0VGltZTogMCxcclxuICAgIF9lbmRUaW1lOiAwLFxyXG4gICAgX3RvdGFsVGltZTogMCxcclxuICAgIC8v6I635Y+WdXNlcklkXHJcbiAgICBBdXRoZW50aWNhdGlvbigpe1xyXG4gICAgICAgIGxldCBuYW1lID0gXCJ1c2VyX1wiICsgY2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLmdhbWVJZDtcclxuICAgICAgICB2YXIgZGF0YSA9IG51bGw7XHJcbiAgICAgICAgaWYobG9jYWxTdG9yYWdlLmdldEl0ZW0obmFtZSkpIGRhdGEgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKG5hbWUpKTtcclxuICAgICAgICBpZihkYXRhID09IFwidW5kaWZlbmRcIiB8fCBkYXRhPT1udWxsIHx8IGRhdGEgPT0gXCJcIil7XHJcbiAgICAgICAgICAgIGxldCB1cmwgPSBcImh0dHBzOi8vYXBpLnNwYXJrdXMuY24vYXBpL3VzZXIvYXV0aC9sb2dpbj9kb21haW49aHVpMzI1NzlXZFlQc2dZcSZjYWxsYmFjaz1cIitsb2NhdGlvbi5ocmVmO1xyXG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVybDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgY2MuZnguU3RvcmFnZU1lc3NhZ2Uuc2V0U3RvcmFnZShuYW1lLGRhdGEpO1xyXG4gICAgICAgICAgICBjYy5meC5HYW1lQ29uZmlnLkdNX0lORk8udXNlcklkID0gcGFyc2VJbnQoZGF0YS51c2VySWQpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLy/ln4vngrnkuIrkvKBcclxuICAgIHNldEdhbWVEYXRhKCl7XHJcbiAgICAgICAgLy9HQU1FX0RBVEEg5Yid5aeL5YyWIOavj+asoea4hembtlxyXG4gICAgICAgIGNjLmZ4LkdhbWVDb25maWcuR0FNRV9EQVRBID0gW107XHJcbiAgICAgICAgY2MuZnguR2FtZUNvbmZpZy5HQU1FX0RBVEEucHVzaChjYy5meC5HYW1lQ29uZmlnLkNMSUNLX0RBVEEpO1xyXG4gICAgICAgIGxldCBsZXZlbCA9IGNjLmZ4LkdhbWVDb25maWcuQ0xJQ0tfREFUQS5yb3VuZDtcclxuICAgICAgICBjYy5meC5HYW1lQ29uZmlnLkNMSUNLX2luaXQoKTtcclxuICAgICAgICBsZXQgZGF0YSA9IGNjLmZ4LkdhbWVDb25maWcuR0FNRV9EQVRBO1xyXG4gICAgICAgIGxldCBtYXRjaElkID0gdGhpcy5nZXRNYXRjaElkKGxldmVsKTtcclxuICAgICAgICBsZXQgcG9zdERhdGEgPSB7XHJcbiAgICAgICAgICAgIFwiZ2FtZUlkXCI6Y2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLmdhbWVJZCxcclxuICAgICAgICAgICAgXCJ1c2VySWRcIjpjYy5meC5HYW1lQ29uZmlnLkdNX0lORk8udXNlcklkLFxyXG4gICAgICAgICAgICBcIm1hdGNoSWRcIjptYXRjaElkLFxyXG4gICAgICAgICAgICBcImRhdGFcIjogZGF0YVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnNvbGUubG9nKFwi5LiK5Lyg5pWw5o2uOlwiLHBvc3REYXRhKTtcclxuICAgICAgICBjYy5meC5IdHRwVXRpbC51cGxvYWRVc2VyTG9nRGF0YShwb3N0RGF0YSxmdW5jdGlvbigpe30pXHJcbiAgICB9LFxyXG4gICAgLy/kuIrkvKDmjpLooYzmppwgIHR5cGXkuLoxXHJcbiAgICBzZXRSYW5rKGRhdGEpe1xyXG4gICAgICAgIC8vR0FNRV9EQVRBIOWIneWni+WMliDmr4/mrKHmuIXpm7ZcclxuICAgICAgICBsZXQgcG9zdERhdGEgPSB7XHJcbiAgICAgICAgICAgIFwiZ2FtZUlkXCI6Y2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLmdhbWVJZCxcclxuICAgICAgICAgICAgXCJ1c2VySWRcIjpjYy5meC5HYW1lQ29uZmlnLkdNX0lORk8udXNlcklkLFxyXG4gICAgICAgICAgICBcInR5cGVcIjoxLFxyXG4gICAgICAgICAgICBcInJlYWN0aW9uVGltZVwiOiBkYXRhLFxyXG4gICAgICAgICAgICBcInRvdGFsU3VuQ291bnRcIjogY2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLnRvdGFsLFxyXG4gICAgICAgICAgICBcInN1Y2Nlc3NcIjogY2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLnN1Y2Nlc3NcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNjLmZ4Lkh0dHBVdGlsLnJhbmtEYXRhKDEsZnVuY3Rpb24oKXt9LHBvc3REYXRhKTtcclxuICAgIH0sXHJcbiAgICAvL+iOt+WPluaOkuihjOamnCB0eXBl5Li6MlxyXG4gICAgZ2V0UmFuayhkYXRhLGNhbGxiYWNrKXtcclxuICAgICAgICBsZXQgcmFua0xlbmd0aCA9IGRhdGEubGVuZ3RoO1xyXG4gICAgICAgIGxldCBwb3N0RGF0YSA9IHtcclxuICAgICAgICAgICAgXCJnYW1lSWRcIjpjYy5meC5HYW1lQ29uZmlnLkdNX0lORk8uZ2FtZUlkLFxyXG4gICAgICAgICAgICBcInVzZXJJZFwiOmNjLmZ4LkdhbWVDb25maWcuR01fSU5GTy51c2VySWQsXHJcbiAgICAgICAgICAgIFwicGFnZVwiOjEsXHJcbiAgICAgICAgICAgIFwicGFnZVNpemVcIjpyYW5rTGVuZ3RoXHJcbiAgICAgICAgfTsgXHJcbiAgICAgICAgLy/lm57osIPov5tnZXRSYW5rRGF0YVxyXG4gICAgICAgIGNjLmZ4Lkh0dHBVdGlsLnJhbmtEYXRhKDIsZGF0YSA9PntjYWxsYmFjayhkYXRhKX0scG9zdERhdGEpO1xyXG4gICAgfSxcclxuICAgIC8v6I635Y+WbWF0Y2hJZCAg55So5LqO5LiK5Lyg5q+P5qyh54K55Ye75pWw5o2u6YeM6Z2i6K6w5b2VaWTmlrnkvr/mn6Xor6JcclxuICAgIGdldE1hdGNoSWQgKGxldmVsKXtcclxuICAgICAgICBsZXQgbWF0Y2hJZCA9IGNjLnN5cy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIm1hdGNoSWRcIik7XHJcbiAgICAgICAgbGV0IHRlbXBJZCA9IG1hdGNoSWQ7XHJcbiAgICAgICAgaWYobWF0Y2hJZCA9PSBcInVuZGlmZW5kXCIgfHwgbWF0Y2hJZD09bnVsbCl7XHJcbiAgICAgICAgICAgIG1hdGNoSWQgPSAgdGhpcy5zZXRNYXRjaElkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgIGlmKHRoaXMuY29udGFpbnNOYW5hbmEobWF0Y2hJZCkgPT0gdHJ1ZSl7XHJcbiAgICAgICAgICAgICAgICBtYXRjaElkID0gIHRoaXMuc2V0TWF0Y2hJZCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgICAgICBsZXQgY2hhciA9IHBhcnNlSW50KHRlbXBJZC5zdWJzdHJpbmcoMTAsdGVtcElkLmxlbmd0aCkpO1xyXG4gICAgICAgICAgICAgICAgaWYobGV2ZWwgPT0gMSl7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hhciArPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoSWQgID0gdGVtcElkLnNsaWNlKDAsIDEwKSArIGNoYXIgKyBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuY29udGFpbnNOYW5hbmEobWF0Y2hJZCkpIG1hdGNoSWQgPSB0aGlzLnNldE1hdGNoSWQoKTtcclxuICAgICAgICAgICAgICAgICAgICBjYy5meC5HYW1lQ29uZmlnLkdNX0lORk8ubWF0Y2hJZCA9IG1hdGNoSWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgY2Muc3lzLmxvY2FsU3RvcmFnZS5zZXRJdGVtKFwibWF0Y2hJZFwiLG1hdGNoSWQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZih0aGlzLmNvbnRhaW5zTmFuYW5hKG1hdGNoSWQpID09IHRydWUpe1xyXG4gICAgICAgICAgICBtYXRjaElkID0gIHRoaXMuc2V0TWF0Y2hJZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbWF0Y2hJZDtcclxuICAgIH0sXHJcbiAgICAvL+ajgOa1i21hdGNoSWQg5aaC5p6c5pyJ57yT5a2Y5Lul5YmN55qEbmFuYW5h5pWw5o2u5riF6ZmkXHJcbiAgICBjb250YWluc05hbmFuYShzdHIpIHtcclxuICAgICAgICByZXR1cm4gL25hL2kudGVzdChzdHIpO1xyXG4gICAgfSxcclxuICAgIC8v6YeN5paw6K6+572uTWF0Y2hJZFxyXG4gICAgc2V0TWF0Y2hJZCAoKXtcclxuICAgICAgICAvLyDlrprkuYnljIXlkKvlj6/nlKjlrZfnrKbnmoTlrZfnrKbpm4ZcclxuICAgICAgICBjb25zdCBjaGFyYWN0ZXJzID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5JztcclxuICAgICAgICAvLyDliJvlu7rkuIDkuKrmlbDnu4Tku6Xkv53lrZjpmo/mnLrlrZfnrKZcclxuICAgICAgICBjb25zdCB1dWlkQXJyYXkgPSBbXTtcclxuICAgICAgICAvLyDlvqrnjq8xMOasoSDnlJ/miJAxMOS9jeeahFVVSURcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIC8vIOeUn+aIkOmaj+acuue0ouW8le+8jOiMg+WbtOaYr+Wtl+espumbhueahOmVv+W6plxyXG4gICAgICAgICAgICBjb25zdCByYW5kb21JbmRleCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNoYXJhY3RlcnMubGVuZ3RoKTtcclxuICAgICAgICAgICAgLy8g5LuO5a2X56ym6ZuG5Lit6I635Y+W6ZqP5py65a2X56ymXHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmRvbUNoYXIgPSBjaGFyYWN0ZXJzLmNoYXJBdChyYW5kb21JbmRleCk7XHJcbiAgICAgICAgICAgIC8vIOWwhuWtl+espua3u+WKoOWIsOaVsOe7hOS4rVxyXG4gICAgICAgICAgICB1dWlkQXJyYXkucHVzaChyYW5kb21DaGFyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGRhdGEgPSAgdXVpZEFycmF5LmpvaW4oJycpICsgMSArIFwiXCI7XHJcbiAgICAgICAgY2Muc3lzLmxvY2FsU3RvcmFnZS5zZXRJdGVtKFwibWF0Y2hOdW1iZXJcIiwxKTtcclxuICAgICAgICBpZih0aGlzLmNvbnRhaW5zTmFuYW5hKGRhdGEpKSBkYXRhID0gdGhpcy5zZXRNYXRjaElkKCk7XHJcbiAgICAgICAgY2Muc3lzLmxvY2FsU3RvcmFnZS5zZXRJdGVtKFwibWF0Y2hJZFwiLGRhdGEpO1xyXG4gICAgICAgIGNjLmZ4LkdhbWVDb25maWcuR01fSU5GTy5tYXRjaElkID0gZGF0YTtcclxuICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgIH0sXHJcbiAgICAvL+aIquWPluWQjeWtl1xyXG4gICAgc3ViTmFtZShuYW1lLGxlbmd0aCl7XHJcbiAgICAgICAgaWYobmFtZS5sZW5ndGggPiBsZW5ndGgpe1xyXG4gICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMCxsZW5ndGgpICsgXCIuLi5cIlxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmFtZTtcclxuICAgIH0sXHJcbiAgICAvL+iuvue9ruWktOWDj1xyXG4gICAgc2V0UGljKG5vZGUscGljKXtcclxuICAgICAgICBub2RlLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIGxldCB1cmwgPSBwaWM7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGZldGNoKHVybClcclxuICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdDb250ZW50LUxlbmd0aCcpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAudGhlbihlcnJObyA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZihlcnJObyA9PSBcIjUwOTNcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgWC1JbmZvOicsIGVycm9yKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSwgMTAwKTtcclxuICAgIFxyXG4gICAgICAgIGNjLmFzc2V0TWFuYWdlci5sb2FkUmVtb3RlKHVybCAsIHtleHQ6Jy5wbmcnfSwoZXJyLCB0ZXh0dXJlOmNjLlRleHR1cmUyRCkgPT4ge1xyXG4gICAgICAgICAgICBpZih0ZXh0dXJlKXtcclxuICAgICAgICAgICAgICAgIG5vZGUuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIG5vZGUuZ2V0Q29tcG9uZW50KGNjLlNwcml0ZSkuc3ByaXRlRnJhbWUgPSBuZXcgY2MuU3ByaXRlRnJhbWUodGV4dHVyZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGVycix0ZXh0dXJlKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgIH0sXHJcbiAgICAvL+esrOS4gOS4quWPguaVsOaKiuebruagh+W4pui/m+adpeWkhOeQhu+8jOesrOS6jOS4quWPguaVsOS4uuWQjeWtl+mVv+W6pu+8jOS4jeWQjOWcuuaZr+S4jeWQjOmcgOaxglxyXG4gICAgLy/lkI3lrZc055+t77yM5bCP5o6S6KGM77yM5ZCN5a2XNumVv++8jOWkp+aOkuihjFxyXG4gICAgZ2V0UmFua0RhdGEoZGF0YSx0YXJnZXQsbmFtZUxlbmd0aCl7XHJcbiAgICAgICAgdGFyZ2V0Lmxpc3REYXRhID0gZGF0YS5kYXRhLmxpc3Q7XHJcbiAgICAgICAgdGFyZ2V0LnNlbGZEYXRhID0gZGF0YS5kYXRhLmluZm87XHJcbiAgICAgICAgbGV0IHJhbmtEYXRhID0gW107XHJcbiAgICAgICAgbGV0IHNlbGYgPSBmYWxzZTtcclxuICAgICAgICAgY2MuZnguR2FtZVRvb2wuc2V0UGljKHRhcmdldC5zZWxmTm9kZS5nZXRDaGlsZEJ5TmFtZShcInBpY1wiKS5nZXRDaGlsZEJ5TmFtZShcImljb25cIiksdGFyZ2V0LnNlbGZEYXRhLnBpYyk7XHJcbiAgICAgICAgZm9yKGxldCBpPTA7aTw9dGFyZ2V0Lmxpc3REYXRhLmxlbmd0aC0xO2krKyl7XHJcbiAgICAgICAgICAgIHJhbmtEYXRhLnB1c2goe3Jhbms6KGkrMSksIG5hbWU6dGFyZ2V0Lmxpc3REYXRhW2ldLm5pY2tOYW1lLCB0b3RhbDp0YXJnZXQubGlzdERhdGFbaV0udG90YWxTdW5Db3VudCwgcGljOnRhcmdldC5saXN0RGF0YVtpXS5waWN9KTtcclxuICAgICAgICAgICAgaWYoY2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLnVzZXJJZCA9PSB0YXJnZXQubGlzdERhdGFbaV0udXNlcklkKXtcclxuICAgICAgICAgICAgICAgIHNlbGYgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0LnJhbmtOdW1iZXIgPSBpO1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0LnNlbGZOb2RlLmdldENoaWxkQnlOYW1lKFwicmFua0xhYlwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpLnN0cmluZyA9KGkrMSkgKyBcIlwiOyBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZihpID09ICh0YXJnZXQubGlzdERhdGEubGVuZ3RoLTEpICYmIHNlbGYgPT0gZmFsc2Upe1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0LnJhbmtOdW1iZXIgPSBpO1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0LnNlbGZOb2RlLmdldENoaWxkQnlOYW1lKFwicmFua0xhYlwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpLnN0cmluZyA9IFwiOTkrXCI7IFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBuYW1lID0gY2MuZnguR2FtZVRvb2wuc3ViTmFtZSh0YXJnZXQuc2VsZkRhdGEubmlja05hbWUsbmFtZUxlbmd0aCk7XHJcbiAgICAgICAgdGFyZ2V0LnNlbGZOb2RlLmdldENoaWxkQnlOYW1lKFwibmFtZUxhYlwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpLnN0cmluZyA9IG5hbWU7XHJcbiAgICAgICAgdGFyZ2V0LnNlbGZOb2RlLmdldENoaWxkQnlOYW1lKFwidG90YWxMYWJcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKS5zdHJpbmcgPSB0YXJnZXQuc2VsZkRhdGEudG90YWxTdW5Db3VudDtcclxuICAgICAgICBzd2l0Y2godGFyZ2V0LnNlbGZOb2RlLmdldENoaWxkQnlOYW1lKFwicmFua0xhYlwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpLnN0cmluZyl7XHJcbiAgICAgICAgICAgIGNhc2UgXCIxXCI6XHJcbiAgICAgICAgICAgICAgICB0YXJnZXQuc2VsZk5vZGUuZ2V0Q2hpbGRCeU5hbWUoXCJyYW5rXCIpLmdldENoaWxkQnlOYW1lKFwib25lXCIpLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcIjJcIjpcclxuICAgICAgICAgICAgICAgIHRhcmdldC5zZWxmTm9kZS5nZXRDaGlsZEJ5TmFtZShcInJhbmtcIikuZ2V0Q2hpbGRCeU5hbWUoXCJ0d29cIikuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiM1wiOlxyXG4gICAgICAgICAgICAgICAgdGFyZ2V0LnNlbGZOb2RlLmdldENoaWxkQnlOYW1lKFwicmFua1wiKS5nZXRDaGlsZEJ5TmFtZShcInRocmVlXCIpLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIOWkp+aOkuihjFxyXG4gICAgICAgIGlmKG5hbWVMZW5ndGggPT0gNil7XHJcbiAgICAgICAgICAgIHRhcmdldC5yYW5rTGlzdC5zZXREYXRhKHJhbmtEYXRhKTtcclxuICAgICAgICAgICAgdGFyZ2V0LnNlbGZOb2RlLm9wYWNpdHkgPSAyNTU7XHJcbiAgICAgICAgICAgIGlmKHRhcmdldC5zZWxmRGF0YS50b3RhbFN1bkNvdW50ID09IDApIHRhcmdldC5zZWxmTm9kZS5vcGFjaXR5ID0gMDtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGdldFNldFNjcmVlblJlc29sdXRpb25GbGFnOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IHNpemUgPSBjYy53aW5TaXplO1xyXG4gICAgICAgIGxldCB3aWR0aCA9IHNpemUud2lkdGg7XHJcbiAgICAgICAgbGV0IGhlaWdodCA9IHNpemUuaGVpZ2h0O1xyXG4gICAgICAgIGlmICgoaGVpZ2h0IC8gd2lkdGgpID4gKDE2LjIgLyA5KSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSxcclxuICAgIC8v5Yik5pat5YWo6Z2i5bGP6YCC6YWNXHJcbiAgICBzZXRGaXQ6IGZ1bmN0aW9uIChjYW52YXMpIHtcclxuICAgICAgICBsZXQgZmxhZyA9ICBjYy5meC5HYW1lVG9vbC5nZXRTZXRTY3JlZW5SZXNvbHV0aW9uRmxhZygpO1xyXG4gICAgICAgIGlmIChmbGFnKSB7XHJcbiAgICAgICAgXHQvLyBjb25zb2xlLmxvZyhcIuS4jeaYr+WFqOmdouWxj1wiKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgIFx0Ly8gY29uc29sZS5sb2coXCLmmK/lhajpnaLlsY9cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmbGFnO1xyXG4gICAgfSxcclxuICAgIC8v6I635Y+W5ri45oiP5L+h5oGvXHJcbiAgICBnZXRHYW1lSW5mbzogZnVuY3Rpb24obm9kZSl7XHJcbiAgICAgICAgdmFyIGpnID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIGpnO1xyXG4gICAgfSxcclxuICAgIC8v6K6+572u5ri45oiP5L+h5oGvXHJcbiAgICBzZXRHYW1lSW5mbzogZnVuY3Rpb24ocGQpe1xyXG4gICBcclxuICAgIH0sXHJcbiAgICAvL+i+k+WFpeenkizov5Tlm57pnIDopoHlsZXnpLrml7bpl7TmoLzlvI9cclxuICAgIGdldFRpbWVNYXJnaW46KHNlY29uZCkgPT4ge1xyXG4gICAgICAgIGxldCB0b3RhbCA9IDA7XHJcbiAgICAgICAgdG90YWwgPSBzZWNvbmQ7XHJcbiAgICAgICAgbGV0IGhvdXIgPSAwO1xyXG4gICAgICAgIGhvdXIgPSBwYXJzZUludCgodG90YWwgLyAzNjAwKSArIFwiXCIpOy8v6K6h566X5pW05pWw5bCP5pe25pWwXHJcbiAgICAgICAgbGV0IGFmdGVySG91ciA9IHRvdGFsIC0gaG91ciAqIDYwICogNjA7Ly/lj5blvpfnrpflh7rlsI/ml7bmlbDlkI7liankvZnnmoTnp5LmlbBcclxuICAgICAgICBsZXQgbWluID0gcGFyc2VJbnQoKGFmdGVySG91ciAvIDYwKStcIlwiKTsvL+iuoeeul+aVtOaVsOWIhlxyXG4gICAgICAgIGxldCBtID0gXCJcIiArIG1pbjsgIFxyXG4gICAgICAgIGlmKG1pbiA8IDEwKSBtID0gXCIwXCIrbWluO1xyXG4gICAgICAgIGxldCBhZnRlck1pbiA9IHRvdGFsIC0gaG91ciAqIDYwICogNjAgLSBtaW4gKiA2MDsvL+WPluW+l+eul+WHuuWIhuWQjuWJqeS9meeahOenkuaVsFxyXG4gICAgICAgIGxldCBtaWFvID0gYWZ0ZXJNaW4gKyBcIlwiO1xyXG4gICAgICAgIGlmKGFmdGVyTWluIDwgMTApIG1pYW8gPSBcIjBcIiArIGFmdGVyTWluO1xyXG4gICAgICAgIHJldHVybiBtICsgJzonICsgbWlhb1xyXG4gICAgfSxcclxuXHJcbiAgICAvL+iOt+WPluaXtumXtOaIs1xyXG4gICAgZ2V0VGltZSgpe1xyXG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgICAgIHJldHVybiB0aW1lc3RhbXA7XHJcbiAgICB9LFxyXG4gICAgcHVzaExpc3RlcjpmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgXHJcbiAgICB9LFxyXG4gICAgcmVtb3ZlQWxsTGlzdGVyOmZ1bmN0aW9uICgpIHtcclxuICAgICAgICBcclxuICAgIH0sXHJcblxyXG59O1xyXG5leHBvcnQgeyBHYW1lVG9vbCB9OyJdfQ==