GameMath.js 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. (function() {
  2. var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
  3. var __module = nodeEnv ? module : {exports:{}};
  4. var __filename = 'preview-scripts/assets/script/utils/GameMath.js';
  5. var __require = nodeEnv ? function (request) {
  6. return cc.require(request);
  7. } : function (request) {
  8. return __quick_compile_project__.require(request, __filename);
  9. };
  10. function __define (exports, require, module) {
  11. if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict";
  12. cc._RF.push(module, '421598WQvZM47yyUy19V3Qm', 'GameMath');
  13. // script/utils/GameMath.ts
  14. "use strict";
  15. Object.defineProperty(exports, "__esModule", { value: true });
  16. var GameDataCenter_1 = require("../data/GameDataCenter");
  17. var GameMath = /** @class */ (function () {
  18. function GameMath() {
  19. }
  20. /**
  21. * 保留几位有效小数
  22. * @param decimals 小数
  23. * @param num 位数
  24. */
  25. GameMath.keep = function (decimals, num) {
  26. // return Math.floor(decimals * Math.pow(10, num)) / Math.pow(10, num)
  27. // 原方法精度有偏差,这里精度多一位
  28. var val = Math.floor(decimals * Math.pow(10, num + 1));
  29. if (val % 10 > 0) {
  30. // 去余保证最后一位为0
  31. val = val - val % 10;
  32. }
  33. return val / Math.pow(10, num + 1);
  34. };
  35. // static mathUnit = ["K", "M", "B", "T", "KT", "MT"]//["万", "亿", "兆", "京", "垓", "杼"]//
  36. GameMath.showNum = function (num, index, MinNum) {
  37. if (index === void 0) { index = 0; }
  38. if (MinNum === void 0) { MinNum = 10000; }
  39. if (isNaN(num)) {
  40. return "0";
  41. }
  42. var _num = num;
  43. var isNeedShow = num / MinNum;
  44. num = num / 10000;
  45. if (isNeedShow < 1) {
  46. var strList = _num.toString().split('.');
  47. var value = "";
  48. if (strList[1]) {
  49. var count = 5 - strList[0].length;
  50. var digit = Math.min(count, 2);
  51. value = strList[1].slice(0, digit);
  52. for (var i = value.length - 1; i >= 0; i--) {
  53. var element = value[i];
  54. if (element == "0") {
  55. value = value.substring(0, i);
  56. }
  57. else {
  58. break;
  59. }
  60. }
  61. }
  62. if (value.length > 0) {
  63. return strList[0] + "." + value + (index > 0 ? GameMath.mathUnit[index - 1] : "");
  64. }
  65. else {
  66. return strList[0] + (index > 0 ? GameMath.mathUnit[index - 1] : "");
  67. }
  68. }
  69. else {
  70. return GameMath.showNum(num, index + 1);
  71. }
  72. };
  73. /**
  74. * 判断一个数字有几位数
  75. * @param num 数字
  76. * @returns 位数
  77. */
  78. GameMath.getNumberOfDigits = function (num) {
  79. if (num === 0) {
  80. return 1;
  81. }
  82. return Math.floor(Math.log10(Math.abs(num))) + 1;
  83. };
  84. GameMath.addZero = function (num) {
  85. if (num >= 10) {
  86. return num.toString();
  87. }
  88. return '0' + num.toString();
  89. };
  90. /**
  91. * 获取0点
  92. */
  93. GameMath.getDay0 = function (time) {
  94. var date = new Date(time * 1000).setHours(0, 0, 0, 0); //获取今天0点0分0秒0毫秒
  95. return Math.floor(date / 1000);
  96. ;
  97. };
  98. /**
  99. * 获取每日重置时间
  100. */
  101. GameMath.getRstTime = function (time) {
  102. return this.getDay0(time) + 86400;
  103. };
  104. /** 获取当天某个时间的时间戳 */
  105. GameMath.getTodaySecond = function (h, m, s) {
  106. if (h === void 0) { h = 0; }
  107. if (m === void 0) { m = 0; }
  108. if (s === void 0) { s = 0; }
  109. var curTime = GameDataCenter_1.default.time && GameDataCenter_1.default.time.sevTime || 0;
  110. var time = new Date(curTime * 1000).setHours(h, m, s) / 1000;
  111. return time;
  112. };
  113. /**
  114. * 时间戳转换
  115. * @param time 时间戳
  116. * @param format 返回格式,支持自定义,但参数必须与formateArr里保持一致
  117. * 年Y 月M 日D 时h 分m 秒s
  118. */
  119. GameMath.formatTime = function (time, format) {
  120. var formateArr = ['Y', 'M', 'D', 'h', 'm', 's'];
  121. var returnArr = [];
  122. var date = new Date(time * 1000);
  123. returnArr.push(date.getFullYear());
  124. returnArr.push(this.formatNumber(date.getMonth() + 1));
  125. returnArr.push(this.formatNumber(date.getDate()));
  126. returnArr.push(this.formatNumber(date.getHours()));
  127. returnArr.push(this.formatNumber(date.getMinutes()));
  128. returnArr.push(this.formatNumber(date.getSeconds()));
  129. for (var i in returnArr) {
  130. format = format.replace(formateArr[i], returnArr[i]);
  131. }
  132. return format;
  133. };
  134. /**
  135. * 个位数十位补零
  136. * @param n 数值
  137. */
  138. GameMath.formatNumber = function (n) {
  139. var num = n.toString();
  140. return num[1] ? num : '0' + num;
  141. };
  142. /**
  143. * 活跃度进度条
  144. * @param curScore 数值
  145. * @param scoreList 数值列表
  146. * @param nWidth 节点宽度
  147. */
  148. GameMath.fgetProgress = function (curScore, scoreList, nWidth) {
  149. var width = 0;
  150. var index = 0;
  151. for (var i = 0; i < scoreList.length; i++) {
  152. if (curScore <= scoreList[i]) {
  153. if (i > 0) {
  154. index = curScore - scoreList[i - 1];
  155. width += index * ((nWidth / scoreList.length) / (scoreList[i] - scoreList[i - 1]));
  156. }
  157. else {
  158. index = curScore;
  159. width += index * ((nWidth / scoreList.length) / (scoreList[i]));
  160. }
  161. return width;
  162. }
  163. else {
  164. width += scoreList[i] * ((nWidth / scoreList.length) / scoreList[i]);
  165. }
  166. }
  167. return width;
  168. };
  169. /**数组去重 */
  170. GameMath.unique = function (arr) {
  171. var res = new Map();
  172. return arr.filter(function (a) { return !res.has(a) && res.set(a, 1); });
  173. };
  174. /**传入某天零点时间戳 获取距离今天有几天 */
  175. GameMath.getDistanceDays = function (sTime) {
  176. var zeroTime = this.getTodaySecond(0); //当天零点时间
  177. return Math.floor((zeroTime - sTime) / 86400) + 1;
  178. };
  179. /**
  180. * 格式化时间戳 获取 月/日 时:分:秒 2021-5-23 14:26:31
  181. * @param time 时间戳
  182. * @returns
  183. */
  184. GameMath.formatTimeMDHMS = function (time) {
  185. var timeData = this.formatTimeSTamp(time * 1000);
  186. return timeData["month"] + "/" + timeData["day"] + " " + timeData["hour"] + ":" + timeData["minute"] + ":" + timeData["second"];
  187. };
  188. GameMath.formatTimeSTamp = function (ts) {
  189. var timeData = {};
  190. var time = new Date(ts);
  191. timeData["year"] = this.getTimeAddSuffix(time.getFullYear());
  192. timeData["month"] = this.getTimeAddSuffix(time.getMonth() + 1);
  193. timeData["day"] = this.getTimeAddSuffix(time.getDate());
  194. timeData["hour"] = this.getTimeAddSuffix(time.getHours());
  195. timeData["minute"] = this.getTimeAddSuffix(time.getMinutes());
  196. timeData["second"] = this.getTimeAddSuffix(time.getSeconds());
  197. return timeData;
  198. };
  199. GameMath.getTimeAddSuffix = function (time) {
  200. if (Number(time) < 10) {
  201. return "0" + time;
  202. }
  203. return time;
  204. };
  205. /**
  206. * 获取范围内的随机整数
  207. * @param min
  208. * @param max
  209. * @returns
  210. */
  211. GameMath.getRandomNum = function (min, max) {
  212. return Math.floor(Math.random() * (max - min) + min);
  213. };
  214. /**
  215. * 获取范围内的随机数
  216. * @param min
  217. * @param max
  218. * @returns
  219. */
  220. GameMath.getRandomFloor = function (min, max) {
  221. return Math.random() * (max - min) + min;
  222. };
  223. /**
  224. * 保留小数点后不显示0
  225. * @param num
  226. * @param divNum
  227. * @param fixedNum
  228. * @returns
  229. */
  230. GameMath.toFixNumFormat = function (num, divisor, fixedNum) {
  231. // 将数值除以给定的除数
  232. var result = num / divisor;
  233. var intPart = Math.floor(result);
  234. var hasFractionalPart = result !== intPart;
  235. if (hasFractionalPart) {
  236. // 如果有小数部分,则保留两位小数
  237. var formatted = result.toFixed(fixedNum);
  238. // 分割字符串为整数部分和小数部分
  239. var _a = formatted.split('.'), integerPart = _a[0], decimalPart = _a[1];
  240. // 去除小数部分末尾的0
  241. var trimmedDecimalPart = decimalPart.replace(/0+$/, '');
  242. // 如果小数部分被完全去除(即原小数部分只包含0),则返回整数部分
  243. if (trimmedDecimalPart === '') {
  244. return integerPart;
  245. }
  246. else {
  247. // 否则,将整数部分和修剪后的小数部分重新组合
  248. return integerPart + '.' + trimmedDecimalPart;
  249. }
  250. }
  251. else {
  252. // 如果没有小数部分,则直接返回整数部分
  253. return intPart.toString();
  254. }
  255. };
  256. // static unit = 9999
  257. // /**
  258. // * 长数字简化
  259. // * @param num 原数字
  260. // * @param min 大于这个数才简化(要优化成位数并表示简化后长度)
  261. // * @param mathUnit 简化的单位
  262. // * @param unitLen 一个单位表示位数。如万表示4位k表示3位
  263. // */
  264. // static showNum(num: number, min: number = GameMath.unit, mathUnit: Array<string> = GameMath.mathUnit, unitLen: number = 4): string {
  265. // if (gameMethod.isEmpty(num)) {
  266. // return "0"
  267. // }
  268. // if (num > min) {
  269. // let len = Math.floor(Math.log10(num))
  270. // let unit = Math.floor(len / unitLen)
  271. // return this.keep(num / Math.pow(Math.pow(10, unitLen), unit), unitLen - 1 - len % unitLen) + mathUnit[unit - 1]
  272. // } else {
  273. // return num.toString()
  274. // }
  275. // }
  276. GameMath.mathUnit = ["万", "亿", "兆", "京", "垓", "杼"]; //
  277. return GameMath;
  278. }());
  279. exports.default = GameMath;
  280. cc._RF.pop();
  281. }
  282. if (nodeEnv) {
  283. __define(__module.exports, __require, __module);
  284. }
  285. else {
  286. __quick_compile_project__.registerModuleFunc(__filename, function () {
  287. __define(__module.exports, __require, __module);
  288. });
  289. }
  290. })();
  291. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0cy9zY3JpcHQvdXRpbHMvR2FtZU1hdGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSx5REFBbUQ7QUFFbkQ7SUFBQTtJQTBRQSxDQUFDO0lBelFHOzs7O09BSUc7SUFDSSxhQUFJLEdBQVgsVUFBWSxRQUFnQixFQUFFLEdBQVc7UUFDckMsc0VBQXNFO1FBQ3RFLG1CQUFtQjtRQUNuQixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUN0RCxJQUFJLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFO1lBQ2QsYUFBYTtZQUNiLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQTtTQUN2QjtRQUNELE9BQU8sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUN0QyxDQUFDO0lBc0JELHVGQUF1RjtJQUNoRixnQkFBTyxHQUFkLFVBQWUsR0FBVyxFQUFFLEtBQWlCLEVBQUUsTUFBc0I7UUFBekMsc0JBQUEsRUFBQSxTQUFpQjtRQUFFLHVCQUFBLEVBQUEsY0FBc0I7UUFDakUsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDWixPQUFPLEdBQUcsQ0FBQTtTQUNiO1FBRUQsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFBO1FBQ2QsSUFBSSxVQUFVLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQTtRQUM3QixHQUFHLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQTtRQUNqQixJQUFJLFVBQVUsR0FBRyxDQUFDLEVBQUU7WUFDaEIsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUN4QyxJQUFJLEtBQUss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QU07Z0JBQ0gsd0JBQXdCO2dCQUN4QixPQUFPLFdBQVcsR0FBRyxHQUFHLEdBQUcsa0JBQWtCLENBQUM7YUFDakQ7U0FDSjthQUFNO1lBQ0gscUJBQXFCO1lBQ3JCLE9BQU8sT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQzdCO0lBRUwsQ0FBQztJQXpQRCxxQkFBcUI7SUFDckIsTUFBTTtJQUNOLFdBQVc7SUFDWCxvQkFBb0I7SUFDcEIseUNBQXlDO0lBQ3pDLDRCQUE0QjtJQUM1Qix5Q0FBeUM7SUFDekMsTUFBTTtJQUNOLHVJQUF1STtJQUN2SSxxQ0FBcUM7SUFDckMscUJBQXFCO0lBQ3JCLFFBQVE7SUFDUix1QkFBdUI7SUFDdkIsZ0RBQWdEO0lBQ2hELCtDQUErQztJQUMvQywwSEFBMEg7SUFDMUgsZUFBZTtJQUNmLGdDQUFnQztJQUNoQyxRQUFRO0lBQ1IsSUFBSTtJQUNHLGlCQUFRLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFBLENBQUEsRUFBRTtJQXNPdEQsZUFBQztDQTFRRCxBQTBRQyxJQUFBO2tCQTFRb0IsUUFBUSIsImZpbGUiOiIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdhbWVNZXRob2QgfSBmcm9tIFwiLi4vY29tbW9uL2dhbWVNZXRob2RcIlxuaW1wb3J0IEdhbWVEYXRhQ2VudGVyIGZyb20gXCIuLi9kYXRhL0dhbWVEYXRhQ2VudGVyXCJcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2FtZU1hdGgge1xuICAgIC8qKlxuICAgICAqIOS/neeVmeWHoOS9jeacieaViOWwj+aVsFxuICAgICAqIEBwYXJhbSBkZWNpbWFscyDlsI/mlbBcbiAgICAgKiBAcGFyYW0gbnVtIOS9jeaVsFxuICAgICAqL1xuICAgIHN0YXRpYyBrZWVwKGRlY2ltYWxzOiBudW1iZXIsIG51bTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgLy8gcmV0dXJuIE1hdGguZmxvb3IoZGVjaW1hbHMgKiBNYXRoLnBvdygxMCwgbnVtKSkgLyBNYXRoLnBvdygxMCwgbnVtKVxuICAgICAgICAvLyDljp/mlrnms5Xnsr7luqbmnInlgY/lt67vvIzov5nph4znsr7luqblpJrkuIDkvY1cbiAgICAgICAgbGV0IHZhbCA9IE1hdGguZmxvb3IoZGVjaW1hbHMgKiBNYXRoLnBvdygxMCwgbnVtICsgMSkpXG4gICAgICAgIGlmICh2YWwgJSAxMCA+IDApIHtcbiAgICAgICAgICAgIC8vIOWOu+S9meS/neivgeacgOWQjuS4gOS9jeS4ujBcbiAgICAgICAgICAgIHZhbCA9IHZhbCAtIHZhbCAlIDEwXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbCAvIE1hdGgucG93KDEwLCBudW0gKyAxKVxuICAgIH1cbiAgICAvLyBzdGF0aWMgdW5pdCA9IDk5OTlcbiAgICAvLyAvKipcbiAgICAvLyAgKiDplb/mlbDlrZfnroDljJZcbiAgICAvLyAgKiBAcGFyYW0gbnVtIOWOn+aVsOWtl1xuICAgIC8vICAqIEBwYXJhbSBtaW4g5aSn5LqO6L+Z5Liq5pWw5omN566A5YyW77yI6KaB5LyY5YyW5oiQ5L2N5pWw5bm26KGo56S6566A5YyW5ZCO6ZW/5bqm77yJXG4gICAgLy8gICogQHBhcmFtIG1hdGhVbml0IOeugOWMlueahOWNleS9jSBcbiAgICAvLyAgKiBAcGFyYW0gdW5pdExlbiDkuIDkuKrljZXkvY3ooajnpLrkvY3mlbDjgILlpoLkuIfooajnpLo05L2Na+ihqOekujPkvY1cbiAgICAvLyAgKi9cbiAgICAvLyBzdGF0aWMgc2hvd051bShudW06IG51bWJlciwgbWluOiBudW1iZXIgPSBHYW1lTWF0aC51bml0LCBtYXRoVW5pdDogQXJyYXk8c3RyaW5nPiA9IEdhbWVNYXRoLm1hdGhVbml0LCB1bml0TGVuOiBudW1iZXIgPSA0KTogc3RyaW5nIHtcbiAgICAvLyAgICAgaWYgKGdhbWVNZXRob2QuaXNFbXB0eShudW0pKSB7XG4gICAgLy8gICAgICAgICByZXR1cm4gXCIwXCJcbiAgICAvLyAgICAgfVxuICAgIC8vICAgICBpZiAobnVtID4gbWluKSB7XG4gICAgLy8gICAgICAgICBsZXQgbGVuID0gTWF0aC5mbG9vcihNYXRoLmxvZzEwKG51bSkpXG4gICAgLy8gICAgICAgICBsZXQgdW5pdCA9IE1hdGguZmxvb3IobGVuIC8gdW5pdExlbilcbiAgICAvLyAgICAgICAgIHJldHVybiB0aGlzLmtlZXAobnVtIC8gTWF0aC5wb3coTWF0aC5wb3coMTAsIHVuaXRMZW4pLCB1bml0KSwgdW5pdExlbiAtIDEgLSBsZW4gJSB1bml0TGVuKSArIG1hdGhVbml0W3VuaXQgLSAxXVxuICAgIC8vICAgICB9IGVsc2Uge1xuICAgIC8vICAgICAgICAgcmV0dXJuIG51bS50b1N0cmluZygpXG4gICAgLy8gICAgIH1cbiAgICAvLyB9XG4gICAgc3RhdGljIG1hdGhVbml0ID0gW1wi5LiHXCIsIFwi5Lq/XCIsIFwi5YWGXCIsIFwi5LqsXCIsIFwi5Z6TXCIsIFwi5p28XCJdLy9cbiAgICAvLyBzdGF0aWMgbWF0aFVuaXQgPSBbXCJLXCIsIFwiTVwiLCBcIkJcIiwgXCJUXCIsIFwiS1RcIiwgXCJNVFwiXS8vW1wi5LiHXCIsIFwi5Lq/XCIsIFwi5YWGXCIsIFwi5LqsXCIsIFwi5Z6TXCIsIFwi5p28XCJdLy9cbiAgICBzdGF0aWMgc2hvd051bShudW06IG51bWJlciwgaW5kZXg6IG51bWJlciA9IDAsIE1pbk51bTogbnVtYmVyID0gMTAwMDApOiBzdHJpbmcge1xuICAgICAgICBpZiAoaXNOYU4obnVtKSkge1xuICAgICAgICAgICAgcmV0dXJuIFwiMFwiXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgX251bSA9IG51bVxuICAgICAgICBsZXQgaXNOZWVkU2hvdyA9IG51bSAvIE1pbk51bVxuICAgICAgICBudW0gPSBudW0gLyAxMDAwMFxuICAgICAgICBpZiAoaXNOZWVkU2hvdyA8IDEpIHtcbiAgICAgICAgICAgIGxldCBzdHJMaXN0ID0gX251bS50b1N0cmluZygpLnNwbGl0KCcuJylcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IFwiXCJcbiAgICAgICAgICAgIGlmIChzdHJMaXN0WzFdKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvdW50ID0gNSAtIHN0ckxpc3RbMF0ubGVuZ3RoXG4gICAgICAgICAgICAgICAgbGV0IGRpZ2l0ID0gTWF0aC5taW4oY291bnQsIDIpXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJMaXN0WzFdLnNsaWNlKDAsIGRpZ2l0KVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSB2YWx1ZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdmFsdWVbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50ID09IFwiMFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygwLCBpKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0ckxpc3RbMF0gKyBcIi5cIiArIHZhbHVlICsgKGluZGV4ID4gMCA/IEdhbWVNYXRoLm1hdGhVbml0W2luZGV4IC0gMV0gOiBcIlwiKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RyTGlzdFswXSArIChpbmRleCA+IDAgPyBHYW1lTWF0aC5tYXRoVW5pdFtpbmRleCAtIDFdIDogXCJcIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBHYW1lTWF0aC5zaG93TnVtKG51bSwgaW5kZXggKyAxKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Yik5pat5LiA5Liq5pWw5a2X5pyJ5Yeg5L2N5pWwXG4gICAgICogQHBhcmFtIG51bSDmlbDlrZdcbiAgICAgKiBAcmV0dXJucyDkvY3mlbBcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0TnVtYmVyT2ZEaWdpdHMobnVtOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBpZiAobnVtID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLmxvZzEwKE1hdGguYWJzKG51bSkpKSArIDE7XG4gICAgfVxuXG4gICAgc3RhdGljIGFkZFplcm8obnVtOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICBpZiAobnVtID49IDEwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtLnRvU3RyaW5nKClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJzAnICsgbnVtLnRvU3RyaW5nKClcbiAgICB9XG4gICAgLyoqXG4gICAgICog6I635Y+WMOeCuVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXREYXkwKHRpbWU6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGxldCBkYXRlID0gbmV3IERhdGUodGltZSAqIDEwMDApLnNldEhvdXJzKDAsIDAsIDAsIDApOy8v6I635Y+W5LuK5aSpMOeCuTDliIYw56eSMOavq+enklxuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihkYXRlIC8gMTAwMCk7O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOiOt+WPluavj+aXpemHjee9ruaXtumXtFxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRSc3RUaW1lKHRpbWU6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXREYXkwKHRpbWUpICsgODY0MDBcbiAgICB9XG5cbiAgICAvKiog6I635Y+W5b2T5aSp5p+Q5Liq5pe26Ze055qE5pe26Ze05oizICovXG4gICAgc3RhdGljIGdldFRvZGF5U2Vjb25kKGggPSAwLCBtID0gMCwgcyA9IDApIHtcbiAgICAgICAgdmFyIGN1clRpbWUgPSBHYW1lRGF0YUNlbnRlci50aW1lICYmIEdhbWVEYXRhQ2VudGVyLnRpbWUuc2V2VGltZSB8fCAwO1xuICAgICAgICB2YXIgdGltZSA9IG5ldyBEYXRlKGN1clRpbWUgKiAxMDAwKS5zZXRIb3VycyhoLCBtLCBzKSAvIDEwMDA7XG4gICAgICAgIHJldHVybiB0aW1lO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICog5pe26Ze05oiz6L2s5o2iXG4gICAgICogQHBhcmFtIHRpbWUg5pe26Ze05oizXG4gICAgICogQHBhcmFtIGZvcm1hdCDov5Tlm57moLzlvI/vvIzmlK/mjIHoh6rlrprkuYnvvIzkvYblj4LmlbDlv4XpobvkuI5mb3JtYXRlQXJy6YeM5L+d5oyB5LiA6Ie0IFxuICAgICAqIOW5tFkg5pyITSDml6VEIOaXtmgg5YiGbSDnp5JzIFxuICAgICAqL1xuICAgIHN0YXRpYyBmb3JtYXRUaW1lKHRpbWU6IG51bWJlciwgZm9ybWF0OiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IGZvcm1hdGVBcnIgPSBbJ1knLCAnTScsICdEJywgJ2gnLCAnbScsICdzJ107XG4gICAgICAgIGxldCByZXR1cm5BcnIgPSBbXTtcblxuICAgICAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKHRpbWUgKiAxMDAwKTtcbiAgICAgICAgcmV0dXJuQXJyLnB1c2goZGF0ZS5nZXRGdWxsWWVhcigpKTtcbiAgICAgICAgcmV0dXJuQXJyLnB1c2godGhpcy5mb3JtYXROdW1iZXIoZGF0ZS5nZXRNb250aCgpICsgMSkpO1xuICAgICAgICByZXR1cm5BcnIucHVzaCh0aGlzLmZvcm1hdE51bWJlcihkYXRlLmdldERhdGUoKSkpO1xuICAgICAgICByZXR1cm5BcnIucHVzaCh0aGlzLmZvcm1hdE51bWJlcihkYXRlLmdldEhvdXJzKCkpKTtcbiAgICAgICAgcmV0dXJuQXJyLnB1c2godGhpcy5mb3JtYXROdW1iZXIoZGF0ZS5nZXRNaW51dGVzKCkpKTtcbiAgICAgICAgcmV0dXJuQXJyLnB1c2godGhpcy5mb3JtYXROdW1iZXIoZGF0ZS5nZXRTZWNvbmRzKCkpKTtcblxuICAgICAgICBmb3IgKGxldCBpIGluIHJldHVybkFycikge1xuICAgICAgICAgICAgZm9ybWF0ID0gZm9ybWF0LnJlcGxhY2UoZm9ybWF0ZUFycltpXSwgcmV0dXJuQXJyW2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm9ybWF0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOS4quS9jeaVsOWNgeS9jeihpembtlxuICAgICAqIEBwYXJhbSBuIOaVsOWAvFxuICAgICAqL1xuICAgIHN0YXRpYyBmb3JtYXROdW1iZXIobjogbnVtYmVyKSB7XG4gICAgICAgIGxldCBudW0gPSBuLnRvU3RyaW5nKClcbiAgICAgICAgcmV0dXJuIG51bVsxXSA/IG51bSA6ICcwJyArIG51bVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOa0u+i3g+W6pui/m+W6puadoVxuICAgICAqIEBwYXJhbSBjdXJTY29yZSDmlbDlgLxcbiAgICAgKiBAcGFyYW0gc2NvcmVMaXN0IOaVsOWAvOWIl+ihqFxuICAgICAqIEBwYXJhbSBuV2lkdGgg6IqC54K55a695bqmXG4gICAgICovXG4gICAgc3RhdGljIGZnZXRQcm9ncmVzcyhjdXJTY29yZTogbnVtYmVyLCBzY29yZUxpc3Q6IG51bWJlcltdLCBuV2lkdGg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGxldCB3aWR0aDogbnVtYmVyID0gMFxuICAgICAgICBsZXQgaW5kZXg6IG51bWJlciA9IDBcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY29yZUxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjdXJTY29yZSA8PSBzY29yZUxpc3RbaV0pIHtcbiAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBjdXJTY29yZSAtIHNjb3JlTGlzdFtpIC0gMV1cbiAgICAgICAgICAgICAgICAgICAgd2lkdGggKz0gaW5kZXggKiAoKG5XaWR0aCAvIHNjb3JlTGlzdC5sZW5ndGgpIC8gKHNjb3JlTGlzdFtpXSAtIHNjb3JlTGlzdFtpIC0gMV0pKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gY3VyU2NvcmVcbiAgICAgICAgICAgICAgICAgICAgd2lkdGggKz0gaW5kZXggKiAoKG5XaWR0aCAvIHNjb3JlTGlzdC5sZW5ndGgpIC8gKHNjb3JlTGlzdFtpXSkpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB3aWR0aFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB3aWR0aCArPSBzY29yZUxpc3RbaV0gKiAoKG5XaWR0aCAvIHNjb3JlTGlzdC5sZW5ndGgpIC8gc2NvcmVMaXN0W2ldKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3aWR0aFxuICAgIH1cbiAgICAvKirmlbDnu4Tljrvph40gKi9cbiAgICBzdGF0aWMgdW5pcXVlPFQ+KGFycjogQXJyYXk8VD4pOiBBcnJheTxUPiB7XG4gICAgICAgIGNvbnN0IHJlcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgcmV0dXJuIGFyci5maWx0ZXIoKGEpID0+ICFyZXMuaGFzKGEpICYmIHJlcy5zZXQoYSwgMSkpXG4gICAgfVxuXG4gICAgLyoq5Lyg5YWl5p+Q5aSp6Zu254K55pe26Ze05oizIOiOt+WPlui3neemu+S7iuWkqeacieWHoOWkqSAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RGlzdGFuY2VEYXlzKHNUaW1lKSB7XG4gICAgICAgIHZhciB6ZXJvVGltZSA9IHRoaXMuZ2V0VG9kYXlTZWNvbmQoMCk7Ly/lvZPlpKnpm7bngrnml7bpl7RcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoKHplcm9UaW1lIC0gc1RpbWUpIC8gODY0MDApICsgMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmoLzlvI/ljJbml7bpl7TmiLMg6I635Y+WIOaciC/ml6Ug5pe2OuWIhjrnp5IgMjAyMS01LTIzIDE0OjI2OjMxXG4gICAgICogQHBhcmFtIHRpbWUg5pe26Ze05oizXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGZvcm1hdFRpbWVNREhNUyh0aW1lKSB7XG4gICAgICAgIGxldCB0aW1lRGF0YSA9IHRoaXMuZm9ybWF0VGltZVNUYW1wKHRpbWUgKiAxMDAwKTtcbiAgICAgICAgcmV0dXJuIGAke3RpbWVEYXRhW1wibW9udGhcIl19LyR7dGltZURhdGFbXCJkYXlcIl19ICR7dGltZURhdGFbXCJob3VyXCJdfToke3RpbWVEYXRhW1wibWludXRlXCJdfToke3RpbWVEYXRhW1wic2Vjb25kXCJdfWA7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmb3JtYXRUaW1lU1RhbXAodHMpIHtcbiAgICAgICAgbGV0IHRpbWVEYXRhID0ge307XG4gICAgICAgIHZhciB0aW1lID0gbmV3IERhdGUodHMpO1xuICAgICAgICB0aW1lRGF0YVtcInllYXJcIl0gPSB0aGlzLmdldFRpbWVBZGRTdWZmaXgodGltZS5nZXRGdWxsWWVhcigpKVxuICAgICAgICB0aW1lRGF0YVtcIm1vbnRoXCJdID0gdGhpcy5nZXRUaW1lQWRkU3VmZml4KHRpbWUuZ2V0TW9udGgoKSArIDEpXG4gICAgICAgIHRpbWVEYXRhW1wiZGF5XCJdID0gdGhpcy5nZXRUaW1lQWRkU3VmZml4KHRpbWUuZ2V0RGF0ZSgpKVxuICAgICAgICB0aW1lRGF0YVtcImhvdXJcIl0gPSB0aGlzLmdldFRpbWVBZGRTdWZmaXgodGltZS5nZXRIb3VycygpKVxuICAgICAgICB0aW1lRGF0YVtcIm1pbnV0ZVwiXSA9IHRoaXMuZ2V0VGltZUFkZFN1ZmZpeCh0aW1lLmdldE1pbnV0ZXMoKSlcbiAgICAgICAgdGltZURhdGFbXCJzZWNvbmRcIl0gPSB0aGlzLmdldFRpbWVBZGRTdWZmaXgodGltZS5nZXRTZWNvbmRzKCkpXG4gICAgICAgIHJldHVybiB0aW1lRGF0YTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldFRpbWVBZGRTdWZmaXgodGltZSkge1xuICAgICAgICBpZiAoTnVtYmVyKHRpbWUpIDwgMTApIHtcbiAgICAgICAgICAgIHJldHVybiBcIjBcIiArIHRpbWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRpbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6I635Y+W6IyD5Zu05YaF55qE6ZqP5py65pW05pWwXG4gICAgICogQHBhcmFtIG1pbiBcbiAgICAgKiBAcGFyYW0gbWF4IFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmFuZG9tTnVtKG1pbiwgbWF4KSB7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluKSArIG1pbilcbiAgICB9XG5cbiAgICAvKipcbiAgICog6I635Y+W6IyD5Zu05YaF55qE6ZqP5py65pWwXG4gICAqIEBwYXJhbSBtaW4gXG4gICAqIEBwYXJhbSBtYXggXG4gICAqIEByZXR1cm5zIFxuICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldFJhbmRvbUZsb29yKG1pbiwgbWF4KSB7XG4gICAgICAgIHJldHVybiBNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbikgKyBtaW5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDkv53nlZnlsI/mlbDngrnlkI7kuI3mmL7npLowXG4gICAgICogQHBhcmFtIG51bSBcbiAgICAgKiBAcGFyYW0gZGl2TnVtIFxuICAgICAqIEBwYXJhbSBmaXhlZE51bSBcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIHRvRml4TnVtRm9ybWF0KG51bTogbnVtYmVyLCBkaXZpc29yOiBudW1iZXIsIGZpeGVkTnVtOiBudW1iZXIpIHtcbiAgICAgICAgLy8g5bCG5pWw5YC86Zmk5Lul57uZ5a6a55qE6Zmk5pWwXG4gICAgICAgIGxldCByZXN1bHQgPSBudW0gLyBkaXZpc29yO1xuICAgICAgICBsZXQgaW50UGFydCA9IE1hdGguZmxvb3IocmVzdWx0KTtcbiAgICAgICAgbGV0IGhhc0ZyYWN0aW9uYWxQYXJ0ID0gcmVzdWx0ICE9PSBpbnRQYXJ0O1xuXG4gICAgICAgIGlmIChoYXNGcmFjdGlvbmFsUGFydCkge1xuICAgICAgICAgICAgLy8g5aaC5p6c5pyJ5bCP5pWw6YOo5YiG77yM5YiZ5L+d55WZ5Lik5L2N5bCP5pWwXG4gICAgICAgICAgICBsZXQgZm9ybWF0dGVkID0gcmVzdWx0LnRvRml4ZWQoZml4ZWROdW0pO1xuICAgICAgICAgICAgLy8g5YiG5Ymy5a2X56ym5Liy5Li65pW05pWw6YOo5YiG5ZKM5bCP5pWw6YOo5YiGXG4gICAgICAgICAgICBsZXQgW2ludGVnZXJQYXJ0LCBkZWNpbWFsUGFydF0gPSBmb3JtYXR0ZWQuc3BsaXQoJy4nKTtcbiAgICAgICAgICAgIC8vIOWOu+mZpOWwj+aVsOmDqOWIhuacq+WwvueahDBcbiAgICAgICAgICAgIGxldCB0cmltbWVkRGVjaW1hbFBhcnQgPSBkZWNpbWFsUGFydC5yZXBsYWNlKC8wKyQvLCAnJyk7XG5cbiAgICAgICAgICAgIC8vIOWmguaenOWwj+aVsOmDqOWIhuiiq+WujOWFqOWOu+mZpO+8iOWNs+WOn+Wwj+aVsOmDqOWIhuWPquWMheWQqzDvvInvvIzliJnov5Tlm57mlbTmlbDpg6jliIZcbiAgICAgICAgICAgIGlmICh0cmltbWVkRGVjaW1hbFBhcnQgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGludGVnZXJQYXJ0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyDlkKbliJnvvIzlsIbmlbTmlbDpg6jliIblkozkv67liarlkI7nmoTlsI/mlbDpg6jliIbph43mlrDnu4TlkIhcbiAgICAgICAgICAgICAgICByZXR1cm4gaW50ZWdlclBhcnQgKyAnLicgKyB0cmltbWVkRGVjaW1hbFBhcnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyDlpoLmnpzmsqHmnInlsI/mlbDpg6jliIbvvIzliJnnm7TmjqXov5Tlm57mlbTmlbDpg6jliIZcbiAgICAgICAgICAgIHJldHVybiBpbnRQYXJ0LnRvU3RyaW5nKCk7XG4gICAgICAgIH1cblxuICAgIH1cbn0iXX0=