123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804 |
- (function() {
- var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
- var __module = nodeEnv ? module : {exports:{}};
- var __filename = 'preview-scripts/assets/script/utils/Formula.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, '8916fgg2eBBHqta/JtBPEGC', 'Formula');
- // script/utils/Formula.ts
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.chineseByNumber = exports.FormulaCom = exports.IsSameDay = exports.showTimeWord = exports.showTimeYMD = exports.showTime = exports.stringFormat = exports.localized = void 0;
- // import GameMath from './GameMath';
- // import { gameMethod } from '../cfg/gameMethod';
- // import { gameCfg } from '../cfg/GameCfg';
- // import Config from '../Config';
- // import { Hdcid } from '../cfg/XyS';
- var gameMethod_1 = require("../common/gameMethod");
- var GameMath_1 = require("./GameMath");
- var I18nUtil_1 = require("./I18nUtil");
- // import { WorkType } from '../cfg/XyWork';
- // 本地化,格式化文字
- function localized(key) {
- var args = [];
- for (var _i = 1; _i < arguments.length; _i++) {
- args[_i - 1] = arguments[_i];
- }
- return stringFormat(key, args);
- // if (key == null || key.length == 0) {
- // return stringFormat(key, args)
- // }
- // let _lang = Config.lang
- // let data = GameCfg.lang.getItem(key)
- // if (data == null) {
- // return stringFormat(key, args)
- // }
- // let result = data[_lang]
- // if (result == null) {
- // return stringFormat(key, args)
- // }
- // return stringFormat(result, args)
- }
- exports.localized = localized;
- // // 获取client配置表
- // export function getWord(str: string, ...args): string {
- // if (gameMethod.isEmpty(gameCfg.langClient.getItem(str))) {
- // return str
- // }
- // let result = gameCfg.langClient.getItem(str)[Config.lang]
- // return stringFormat(result, args)
- // }
- // // 获取 clientText.csv配置表文字
- // export function getText(str: string, ...args) {
- // let result = gameCfg.langClientText.getItem(str)[Config.lang]
- // return stringFormat(result, args)
- // }
- function stringFormat(str, list) {
- if (str == null) {
- return "";
- }
- var result = str;
- list.forEach(function (element, index) {
- result = result.replace("%{" + index + "}", element);
- });
- return result;
- }
- exports.stringFormat = stringFormat;
- // /**
- // * 显示倒计时
- // * @param time 倒计时结束时间戳
- // * @param act 活动key
- // * @param hdcid 活动Hdcid
- // * @param type 倒计时展示类型
- // * @returns
- // */
- // export function showCdTime(time: number, act: WorkType, hdcid: string, type: string = '1') {
- // let cdTime: number = 0
- // cdTime = time - GameDataCenter.timeModel.sevTime
- // if (cdTime >= 0) {
- // return this.showTime(cdTime, type)
- // } else {
- // // 防止延迟会一直重复发送请求
- // if (GameDataCenter.timeModel.getIsKeyAdok(act)) {
- // GameDataCenter.timeModel.sendAdokKey(time, act, hdcid)
- // }
- // }
- // }
- /**
- * 秒级别(10位数)
- * @param time 时间戳
- * @param type 类型
- * 1: 大于一天,显示x天x时;小于一天,显示00:00:00(天数不足,补0)
- * 2: 1天36分(只显示最前面的两位)
- * 3: 小于一小时,显示xx:xx(分秒)
- * 4: 只显示最高单位 大于1天 显示1天 大于1小时 显示1时
- * @returns
- */
- function showTime(time, type) {
- if (type === void 0) { type = "1"; }
- if (time.toString().length == 13) {
- time = Math.floor(time / 1000);
- }
- if (time <= 0) {
- return type == "3" ? "00:00" : "00:00:00";
- }
- var tTime = '';
- var day = 0;
- var hour = 0;
- var minute = 0;
- var second = 0;
- day = Math.floor(time / (24 * 60 * 60));
- hour = Math.floor((time % (24 * 60 * 60)) / (60 * 60));
- minute = Math.floor((time % (60 * 60)) / 60);
- second = Math.floor(time % 60);
- if (type == "1") {
- if (day > 0) {
- tTime = I18nUtil_1.I18n.getI18nText('common_timeformat_dh', day, hour);
- }
- else if (hour > 0) {
- tTime = GameMath_1.default.addZero(day * 24 + hour) + ":" + GameMath_1.default.addZero(minute) + ":" + GameMath_1.default.addZero(second);
- // tTime = `${GameMath.addZero(day * 24 + hour)}时${GameMath.addZero(minute)}分`
- }
- else if (minute > 0) {
- tTime = "00:" + GameMath_1.default.addZero(minute) + ":" + GameMath_1.default.addZero(second);
- // tTime = `${GameMath.addZero(minute)}分${GameMath.addZero(second)}秒`
- }
- else {
- tTime = "00:00:" + GameMath_1.default.addZero(second);
- // tTime = `${GameMath.addZero(second)}秒`
- }
- }
- else if (type == "2") {
- if (day > 0) {
- tTime = I18nUtil_1.I18n.getI18nText('common_timeformat_dh', day, hour);
- }
- else if (hour > 0) {
- tTime = GameMath_1.default.addZero(day * 24 + hour) + "\u65F6" + GameMath_1.default.addZero(minute) + "\u5206";
- }
- else if (minute > 0) {
- tTime = GameMath_1.default.addZero(minute) + "\u5206" + GameMath_1.default.addZero(second) + "\u79D2";
- }
- else {
- tTime = GameMath_1.default.addZero(second) + "\u79D2";
- }
- }
- else if (type == '3') {
- if (day > 0) {
- tTime = I18nUtil_1.I18n.getI18nText('common_timeformat_dh', day, hour);
- }
- else if (hour > 0) {
- tTime = GameMath_1.default.addZero(day * 24 + hour) + ":" + GameMath_1.default.addZero(minute) + ":" + GameMath_1.default.addZero(second);
- // tTime = `${GameMath.addZero(day * 24 + hour)}时${GameMath.addZero(minute)}分`
- }
- else if (minute > 0) {
- tTime = GameMath_1.default.addZero(minute) + ":" + GameMath_1.default.addZero(second);
- // tTime = `${GameMath.addZero(minute)}分${GameMath.addZero(second)}秒`
- }
- else {
- tTime = "00:" + GameMath_1.default.addZero(second);
- // tTime = `${GameMath.addZero(second)}秒`
- }
- }
- else if (type == '4') {
- if (day > 1) {
- tTime = I18nUtil_1.I18n.getI18nText('common_timeformat_d', day);
- }
- else if (day > 0 || hour > 0) {
- tTime = I18nUtil_1.I18n.getI18nText('common_timeformat_h', day * 24 + hour);
- }
- else if (minute > 0) {
- tTime = I18nUtil_1.I18n.getI18nText('common_timeformat_m', minute);
- }
- else {
- tTime = I18nUtil_1.I18n.getI18nText('common_timeformat_s', second);
- }
- }
- else if (type == '5') {
- if (day > 0) {
- tTime = GameMath_1.default.addZero(day * 24 + hour) + ":" + GameMath_1.default.addZero(minute) + ":" + GameMath_1.default.addZero(second);
- }
- else if (hour > 0) {
- tTime = GameMath_1.default.addZero(day * 24 + hour) + ":" + GameMath_1.default.addZero(minute) + ":" + GameMath_1.default.addZero(second);
- }
- else if (minute > 0) {
- tTime = "00:" + GameMath_1.default.addZero(minute) + ":" + GameMath_1.default.addZero(second);
- }
- else {
- tTime = "00:00:" + GameMath_1.default.addZero(second);
- }
- }
- else if (type == '6') {
- if (day > 0) {
- tTime = I18nUtil_1.I18n.getI18nText('common_timeformat_dhms', day, hour, minute, second); // x天x小时x分x秒
- }
- else if (hour > 0) {
- tTime = I18nUtil_1.I18n.getI18nText('common_timeformat_hms', hour, minute, second); // x小时x分x秒
- }
- else if (minute > 0) {
- tTime = I18nUtil_1.I18n.getI18nText('common_timeformat_ms', minute, second); // x分x秒
- }
- else {
- tTime = I18nUtil_1.I18n.getI18nText('common_timeformat_s', second); // x秒
- }
- }
- else if (type == '7') {
- if (day > 0) {
- tTime = I18nUtil_1.I18n.getI18nText('common_timeformat_dhms_2', day, GameMath_1.default.addZero(hour), GameMath_1.default.addZero(minute), GameMath_1.default.addZero(second));
- }
- else if (hour > 0) {
- tTime = GameMath_1.default.addZero(hour) + ":" + GameMath_1.default.addZero(minute) + ":" + GameMath_1.default.addZero(second);
- }
- else if (minute > 0) {
- tTime = "00:" + GameMath_1.default.addZero(minute) + ":" + GameMath_1.default.addZero(second);
- }
- else {
- tTime = "00:00:" + GameMath_1.default.addZero(second);
- }
- }
- else if (type == '8') { // 显示两个单位
- if (day > 0) {
- tTime = I18nUtil_1.I18n.getI18nText('common_timeformat_dh', day, hour);
- }
- else if (hour > 0) {
- tTime = GameMath_1.default.addZero(day * 24 + hour) + ":" + GameMath_1.default.addZero(minute);
- }
- else if (minute > 0) {
- tTime = GameMath_1.default.addZero(minute) + ":" + GameMath_1.default.addZero(second);
- }
- else {
- tTime = "00:" + GameMath_1.default.addZero(second);
- }
- }
- return tTime;
- }
- exports.showTime = showTime;
- function showTimeYMD(shijianchuo, type) {
- if (type === void 0) { type = 0; }
- if (shijianchuo.toString().length == 10) {
- shijianchuo = shijianchuo * 1000;
- }
- var time = new Date(shijianchuo);
- var y = time.getFullYear();
- var m = time.getMonth() + 1;
- var d = time.getDate();
- var h = time.getHours();
- var mm = time.getMinutes();
- var s = time.getSeconds();
- if (type == 0) {
- return y + "-" + GameMath_1.default.addZero(m) + "-" + GameMath_1.default.addZero(d) + " " + GameMath_1.default.addZero(h) + ":" + GameMath_1.default.addZero(mm) + ":" + GameMath_1.default.addZero(s);
- }
- else if (type == 1) {
- return GameMath_1.default.addZero(y) + "-" + GameMath_1.default.addZero(m) + "-" + GameMath_1.default.addZero(d);
- }
- else if (type == 2) {
- return GameMath_1.default.addZero(y) + "." + GameMath_1.default.addZero(m) + "." + GameMath_1.default.addZero(d);
- }
- else if (type == 3) {
- return GameMath_1.default.addZero(m) + "-" + GameMath_1.default.addZero(d) + " " + GameMath_1.default.addZero(h) + ":" + GameMath_1.default.addZero(mm);
- }
- else if (type == 4) {
- return GameMath_1.default.addZero(m) + "/" + GameMath_1.default.addZero(d);
- }
- else if (type == 5) {
- return GameMath_1.default.addZero(y) + "/" + GameMath_1.default.addZero(m) + "/" + GameMath_1.default.addZero(d);
- }
- else if (type == 6) { //设置界面时间显示
- return GameMath_1.default.addZero(y) + "-" + GameMath_1.default.addZero(m) + "-" + GameMath_1.default.addZero(d) + " " + GameMath_1.default.addZero(h) + ":" + GameMath_1.default.addZero(mm) + ":" + GameMath_1.default.addZero(s);
- }
- else if (type == 7) {
- return GameMath_1.default.addZero(h) + ":" + GameMath_1.default.addZero(mm);
- }
- else if (type == 8) {
- return I18nUtil_1.I18n.getI18nText('common_timeformat_ymd', y, m, d);
- }
- else if (type == 9) {
- return I18nUtil_1.I18n.getI18nText('common_timeformat_md', m, d);
- }
- else if (type == 10) {
- return y + "/" + m + "/" + d;
- }
- else if (type == 11) { // 00:00:00格式
- return GameMath_1.default.addZero(h) + ":" + GameMath_1.default.addZero(mm) + ":" + GameMath_1.default.addZero(s);
- }
- else if (type == 12) {
- return GameMath_1.default.addZero(y) + "/" + GameMath_1.default.addZero(m) + "/" + GameMath_1.default.addZero(d) + " " + GameMath_1.default.addZero(h) + ":" + GameMath_1.default.addZero(mm) + ":" + GameMath_1.default.addZero(s);
- }
- else if (type == 13) {
- return GameMath_1.default.addZero(m) + "/" + GameMath_1.default.addZero(d) + " " + GameMath_1.default.addZero(h) + ":" + GameMath_1.default.addZero(mm) + ":" + GameMath_1.default.addZero(s);
- }
- }
- exports.showTimeYMD = showTimeYMD;
- function showTimeWord(time, type) {
- if (type === void 0) { type = "1"; }
- var tTime = '';
- var month = 0;
- var day = 0;
- var hour = 0;
- var minute = 0;
- var second = 0;
- month = Math.floor(time / (30 * 24 * 60 * 60));
- day = Math.floor(time / (24 * 60 * 60));
- hour = Math.floor((time % (24 * 60 * 60)) / (60 * 60));
- minute = Math.floor((time % (60 * 60)) / 60);
- second = Math.floor(time % 60);
- if (type == "1") {
- if (month > 0) {
- tTime = I18nUtil_1.I18n.getI18nText('common_timeword_4', month);
- }
- else if (day > 0) {
- tTime = I18nUtil_1.I18n.getI18nText('common_timeword_3', day);
- }
- else if (hour > 0) {
- tTime = I18nUtil_1.I18n.getI18nText('common_timeword_2', hour);
- }
- else if (minute > 0) {
- tTime = I18nUtil_1.I18n.getI18nText('common_timeword_1', minute);
- }
- else {
- tTime = I18nUtil_1.I18n.getI18nText('common_timeword_5');
- }
- }
- else if (type == "2") {
- if (month > 0) {
- tTime = I18nUtil_1.I18n.getI18nText('common_timeformat_mdhms_2', month, day, GameMath_1.default.addZero(hour), GameMath_1.default.addZero(minute), GameMath_1.default.addZero(second));
- }
- else if (day > 0) {
- tTime = I18nUtil_1.I18n.getI18nText('common_timeformat_dhms_2', day, GameMath_1.default.addZero(hour), GameMath_1.default.addZero(minute), GameMath_1.default.addZero(second));
- }
- else if (hour > 0) {
- tTime = hour + ":" + GameMath_1.default.addZero(minute) + ":" + GameMath_1.default.addZero(second);
- }
- else if (minute > 0) {
- tTime = "00:" + GameMath_1.default.addZero(minute) + ":" + GameMath_1.default.addZero(second);
- }
- else if (second > 0) {
- tTime = "00:00:" + GameMath_1.default.addZero(second);
- }
- else {
- tTime = "00:00:00";
- }
- }
- else {
- tTime = I18nUtil_1.I18n.getI18nText('common_timeformat_unknowtype');
- }
- return tTime;
- }
- exports.showTimeWord = showTimeWord;
- function IsSameDay(timestamp1, timestamp2) {
- var date1 = new Date(timestamp1 * 1000); // 转化为毫秒时间戳
- var date2 = new Date(timestamp2 * 1000);
- return (date1.getFullYear() === date2.getFullYear() &&
- date1.getMonth() === date2.getMonth() &&
- date1.getDate() === date2.getDate());
- }
- exports.IsSameDay = IsSameDay;
- // 阿拉伯数字转中文
- // export function chineseByNumber(number: number): string {
- // const chineseNumbers = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十'];
- // const chineseUnits = ['', '十', '百', '千', '万'];
- // if (number <= 10) {
- // return chineseNumbers[number];
- // } else {
- // const numberString = number.toString();
- // let result = ' ';
- // for (let i = 0; i < numberString.length; i++) {
- // const digit = parseInt(numberString[i]);
- // if (digit !== 0) {
- // if (numberString.length === 2 && i === 0 && digit === 1) {
- // result += chineseUnits[numberString.length - i - 1];
- // } else {
- // result += chineseNumbers[digit] + chineseUnits[numberString.length - i - 1];
- // }
- // } else {
- // if (i === 0 || numberString[i - 1] !== '0') {
- // result += chineseNumbers[digit];
- // }
- // }
- // }
- // return result;
- // }
- // }
- var FormulaCom = /** @class */ (function () {
- function FormulaCom() {
- }
- // return random int [min,max]
- FormulaCom.random = function (min, max) {
- return Math.floor(Math.random() * (max - min + 1) + min);
- };
- FormulaCom.uuid = function (len1, len2) {
- var timestamp = (new Date()).valueOf();
- return FormulaCom.random(Math.pow(10, len1 - 1) - 1, Math.pow(10, len1)).toString() + timestamp % (Math.pow(10, len2));
- };
- FormulaCom.costTime = function (type) {
- if (type == 1) {
- this.time = Date.now();
- }
- else if (type == 2) {
- console.log("cost " + (Date.now() - this.time) + "ms");
- }
- };
- //随机抽取元素不重复
- FormulaCom.getRandomArrayElements = function (arr, count) {
- count = Math.min(count, arr.length);
- var shuffled = arr.slice(0), i = arr.length, min = i - count, temp, index;
- while (i-- > min) {
- index = Math.floor((i + 1) * Math.random());
- temp = shuffled[index];
- shuffled[index] = shuffled[i];
- shuffled[i] = temp;
- }
- return shuffled.slice(min);
- };
- // /**
- // * 一个时间点 距离今天相差几天 以1开始算 今天算1天 今天之后的算0天
- // * @param str
- // */
- // static passDay(str: number): number {
- // let Dates = new Date(GameDataCenter.timeModel.sevTime * 1000).setHours(0, 0, 0, 0);//获取今天0点0分0秒0毫秒。
- // let checkTime = new Date(str * 1000).setHours(0, 0, 0, 0);//获取当天0点0分0秒0毫秒。
- // if (Dates < checkTime) {
- // return 0
- // }
- // return Math.abs(Math.floor((Dates - checkTime) / 86400000)) + 1;
- // }
- // a>b则返回>0 a=b则返回0 a<b则返回<0
- FormulaCom.compareVersion = function (versionA, versionB) {
- var vA = versionA.split('.');
- var vB = versionB.split('.');
- for (var i = 0; i < vA.length; ++i) {
- var a = parseInt(vA[i]);
- var b = 0; //parseInt(vB[i] || 0)
- if (vB[i]) {
- b = parseInt(vB[i]);
- }
- if (a === b) {
- continue;
- }
- else {
- return a - b;
- }
- }
- if (vB.length > vA.length) {
- return -1;
- }
- else {
- return 0;
- }
- };
- FormulaCom.getStrLength = function (str) {
- var a = 0;
- for (var i = 0; i < str.length; i++) {
- if (str.charCodeAt(i) > 255)
- a += 2; //按照预期计数增加2
- else
- a++;
- }
- return a;
- };
- // 限制(默认16个字符) 中文2 英文1
- FormulaCom.getLimitStr = function (str, limit) {
- if (limit === void 0) { limit = 16; }
- var a = 0;
- for (var i = 0; i < str.length; i++) {
- if (str.charCodeAt(i) > 255)
- a += 2; //按照预期计数增加2
- else
- a++;
- if (a > limit) {
- return str.slice(0, i);
- }
- }
- return str;
- };
- FormulaCom.isOverLimit = function (str, limit) {
- if (limit === void 0) { limit = 16; }
- var a = 0;
- for (var i = 0; i < str.length; i++) {
- if (str.charCodeAt(i) > 255)
- a += 2; //按照预期计数增加2
- else
- a++;
- if (a > limit) {
- return true;
- }
- }
- return false;
- };
- // 多个对象在界面上的居中展示,需要box的锚点在中心 example: 3个道具 就是 -50 0 50
- // index以0为初始
- FormulaCom.getPosInBox = function (index, total, bgWidth, itemWidth) {
- var space = total == 1 ? 0 : (((bgWidth - itemWidth * total) / (total - 1) + itemWidth));
- var posx = 0;
- posx = -((total - 1) * (space / 2)) + index * (space);
- return posx;
- };
- // static isMinGan(str: string): boolean {
- // str = str.replace("\\u00A0", "") //去空
- // if (GameCfg.words.minGan.pool != null && str.length > 0) {
- // for (let i in GameCfg.words.minGan.pool) {
- // let _name = GameCfg.words.minGan.pool[i].name
- // if (str.toLowerCase().indexOf(_name.toLowerCase()) != -1) {
- // return true
- // }
- // }
- // }
- // return false
- // }
- // 提取包含 <%t>格式的字段
- FormulaCom.getExecStrs = function (str) {
- // var reg = /\<\%(.+?)\>/g
- var reg = /\<(.+?)\>/g;
- var list = [];
- var result = null;
- do {
- result = reg.exec(str);
- result && list.push(result[1]);
- } while (result);
- return list;
- };
- // // 将文字中的<%t12648673123> 转化为时间
- // // 返回 [解析后的字符串,时间戳,时间戳...]
- // static textAnalysis(text: string): string[] {
- // // list列表 ["t12323451514","t145132154"]
- // let list = FormulaCom.getExecStrs(text)
- // let timeList = []
- // let result = []
- // let resultText = text
- // list.forEach(element => {
- // if (element[0] == "t") {
- // // 去除英文,保留数字
- // timeList.push(element.replace(/[^\d]/g, ''))
- // }
- // });
- // timeList.forEach(time => {
- // let tag = "<%t" + time + ">"
- // // resultText = resultText.replace(tag, new Date(time).toTimeString())
- // resultText = resultText.replace(tag, showTimeYMD(time))
- // })
- // result.push(resultText)
- // timeList.forEach(time => {
- // result.push(time)
- // });
- // return result
- // }
- /** 让动画在指定区间内循环 */
- FormulaCom.loopAtFrame = function (te, sFrame, eFrame) {
- if (te.animationStart === 0) {
- te.animationStart = sFrame / 30; // 30是Spine动画的帧率
- te.animationEnd = eFrame / 30;
- }
- };
- /**
- * 停止在指定帧。1是开始,-1是最后
- * @param frame 帧数
- */
- FormulaCom.stopAtFrame = function (spineComp, frame) {
- var te = spineComp.getCurrent(0);
- // 算出帧对应的时间
- var time;
- if (frame === -1) {
- time = te.animation.duration; // 最后一帧
- }
- else if (frame > 1) {
- time = (frame - 1) / 30; // 根据帧率算出对应时间,spine帧率是30
- }
- else {
- time = 0; // 首帧
- }
- // 对time作限制
- if (time < 0)
- time = 0;
- if (time >= te.animation.duration)
- time = te.animation.duration - 0.01; // 太精确的话,动画会停在首帧,所以要减一点
- te.timeScale = 0; // 让动画停止
- te.trackTime = time;
- };
- /**
- * 把服务器时间戳 改为本地时间戳
- * @param time 需要转换的时间戳
- * @param utcMin 服务器时区(按分钟计)
- // -300 西5区美国 -5*60 GMT-5
- // 0
- // 480 东8区北京 8*60
- */
- FormulaCom.getUtcTime = function (time, utcHour) {
- var utcMin = utcHour * 60;
- //本地时间类
- var localtime = new Date();
- //本地时区针对标准时区的偏移
- var pym = localtime.getTimezoneOffset();
- //时间转换为指定时区时间
- time += (pym + utcMin) * 60;
- return time;
- };
- FormulaCom.getRandomTag = function () {
- var outString = '';
- var inOptions = 'abcdefghijklmnopqrstuvwxyz0123456789';
- for (var i = 0; i < 16; i++) {
- outString += inOptions.charAt(Math.floor(Math.random() * inOptions.length));
- }
- return outString;
- };
- FormulaCom.getDistance = function (x1, y1, x2, y2) {
- var a = x2 - x1;
- var b = y2 - y1;
- return Math.sqrt(a * a + b * b);
- };
- /**
- * 根据锚点重新计算中心点世界坐标坐标
- * @param pos 锚点的世界坐标
- * @param node 节点
- * @returns
- */
- FormulaCom.fixAnchor = function (pos, node) {
- var x = pos.x - node.anchorX * node.width + node.width / 2;
- var y = pos.y - node.anchorY * node.height + node.height / 2;
- return new cc.Vec2(x, y);
- };
- /**
- * 获得某个节点中心点的世界坐标
- * @param node
- * @returns
- */
- FormulaCom.getWorldCenterPos = function (node) {
- return this.fixAnchor(this.getWorldPos(node), node);
- };
- FormulaCom.getWorldPos = function (node) {
- if (gameMethod_1.gameMethod.isEmpty(node))
- return cc.v2(0, 0);
- return node.convertToWorldSpaceAR(cc.Vec2.ZERO);
- };
- FormulaCom.setPosByWorldPos = function (node, pos) {
- if (gameMethod_1.gameMethod.isEmpty(node))
- return;
- var _pos = node.parent.convertToNodeSpaceAR(pos);
- node.x = _pos.x;
- node.y = _pos.y;
- };
- //获取node位于target的坐标相对坐标
- FormulaCom.getPositionInView = function (node, target) {
- var worldPos = node.parent.convertToWorldSpaceAR(node.position);
- var viewPos = target.convertToNodeSpaceAR(worldPos);
- return viewPos;
- };
- // 获取玩家最后一次登录时间
- FormulaCom.getUserState = function (lastadok, sevTime) {
- var userState = '';
- var time = Math.floor((sevTime - lastadok) / 60);
- if (time < 6) {
- userState = I18nUtil_1.I18n.getI18nText('common_userLoginState_1');
- }
- else if (time < 60) {
- userState = I18nUtil_1.I18n.getI18nText('common_timeword_1', time);
- }
- else if (time < 24 * 60) {
- userState = I18nUtil_1.I18n.getI18nText('common_timeword_2', Math.floor(time / 60));
- }
- else {
- userState = I18nUtil_1.I18n.getI18nText('common_timeword_3', Math.floor((time / 60) / 24));
- }
- return userState;
- };
- // 已知圆心,半径,角度,求坐标
- FormulaCom.getPosbyAngle = function (centerX, centerY, range, angle) {
- var radians = this.getRadiansByAngle(angle);
- var dx = Math.cos(radians) * range;
- var dy = Math.sin(radians) * range;
- return { x: centerX + dx, y: centerY + dy };
- };
- // 已知坐标求角度
- FormulaCom.getAngleByPos = function (x1, y1, x2, y2) {
- if (x1 == x2 && y1 == y2) {
- return 0;
- }
- var degree = Math.atan2(y2 - y1, x2 - x1);
- return degree * 180 / Math.PI;
- };
- //求两个点的角度
- FormulaCom.getAngle = function (startPos, endPos) {
- //计算出朝向
- var dx = endPos.x - startPos.x;
- var dy = endPos.y - startPos.y;
- var dir = cc.v2(dx, dy);
- //根据朝向计算出夹角弧度
- var angle = dir.signAngle(cc.v2(1, 0));
- //将弧度转换为欧拉角
- var degree = angle / Math.PI * 180;
- return -degree;
- };
- // 根据角度获取弧度
- FormulaCom.getRadiansByAngle = function (angle) {
- return angle / 180 * Math.PI;
- };
- // 根据弧度获取角度
- FormulaCom.getAngleByRadians = function (radians) {
- return radians * 180 / Math.PI;
- };
- FormulaCom.obj2Array = function (object) {
- if (typeof object != "object") {
- return [];
- }
- return Object.values(object);
- // let array = []
- // for (const key in object) {
- // array.push(object[key])
- // }
- // return array
- };
- FormulaCom.strDLength = function (str) {
- var rStr = str.replace(/[^\x00-\xff]/g, ''); //双字节字符:(包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))
- return str.length - rStr.length;
- };
- // 首字母大写
- FormulaCom.firstUpCase = function (str) {
- return str[0].toUpperCase() + str.substring(1);
- };
- // 判断字符长度
- FormulaCom.getStrCharacterLength = function (str) {
- var patternChinese = new RegExp("[\u4E00-\u9FA5]+"); // 中文
- var leng = 0;
- for (var index = 0; index < str.length; index++) {
- if (patternChinese.test(str[index])) {
- leng += 2;
- }
- else {
- leng += 1;
- }
- }
- return leng;
- };
- //根据索引获取当前行列数
- // index 当前索引值(从0开始) elementsPerRow 一行有几个
- FormulaCom.getRowAndColumnFromIndex = function (index, columnCount) {
- if (columnCount < 1) {
- throw new Error('Column count must be a positive integer.');
- }
- var rowIndex = Math.floor(index / columnCount);
- var columnIndex = index % columnCount;
- return { rowIndex: rowIndex, columnIndex: columnIndex };
- };
- // 对数组按数量分组
- FormulaCom.groupTwoByTwo = function (input, count) {
- var result = [];
- for (var i = 0; i < input.length; i += count) {
- if (gameMethod_1.gameMethod.isEmpty(input[i]) || gameMethod_1.gameMethod.isEmpty(input[i + 1])) {
- console.error("该数组分配不足,检查数组长度");
- }
- result.push([input[i], input[i + 1]]);
- }
- return result;
- };
- FormulaCom.time = 0;
- return FormulaCom;
- }());
- exports.FormulaCom = FormulaCom;
- // 阿拉伯数字转中文
- function chineseByNumber(number) {
- var chineseNumbers = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十'];
- var chineseUnits = ['', '十', '百', '千', '万'];
- if (number <= 10) {
- return chineseNumbers[number];
- }
- else {
- var numberString = number.toString();
- var result = ' ';
- for (var i = 0; i < numberString.length; i++) {
- var digit = parseInt(numberString[i]);
- if (digit !== 0) {
- if (numberString.length === 2 && i === 0 && digit === 1) {
- result += chineseUnits[numberString.length - i - 1];
- }
- else {
- result += chineseNumbers[digit] + chineseUnits[numberString.length - i - 1];
- }
- }
- else {
- if (i === 0 || numberString[i - 1] !== '0') {
- result += chineseNumbers[digit];
- }
- }
- }
- return result;
- }
- }
- exports.chineseByNumber = chineseByNumber;
- 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0cy9zY3JpcHQvdXRpbHMvRm9ybXVsYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxxQ0FBcUM7QUFDckMsa0RBQWtEO0FBQ2xELDRDQUE0QztBQUM1QyxrQ0FBa0M7QUFDbEMsc0NBQXNDO0FBQ3RDLG1EQUFrRDtBQUNsRCx1Q0FBa0M7QUFDbEMsdUNBQWtDO0FBQ2xDLDRDQUE0QztBQUU1QyxZQUFZO0FBQ1osU0FBZ0IsU0FBUyxDQUFDLEdBQVc7SUFBRSxjQUFPO1NBQVAsVUFBTyxFQUFQLHFCQUFPLEVBQVAsSUFBTztRQUFQLDZCQUFPOztJQUMxQyxPQUFPLFlBQVksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDOUIsd0NBQXdDO0lBQ3hDLHFDQUFxQztJQUNyQyxJQUFJO0lBQ0osMEJBQTBCO0lBQzFCLHVDQUF1QztJQUN2QyxzQkFBc0I7SUFDdEIscUNBQXFDO0lBQ3JDLElBQUk7SUFDSiwyQkFBMkI7SUFDM0Isd0JBQXdCO0lBQ3hCLHFDQUFxQztJQUNyQyxJQUFJO0lBQ0osb0NBQW9DO0FBQ3hDLENBQUM7QUFmRCw4QkFlQztBQUNELGlCQUFpQjtBQUNqQiwwREFBMEQ7QUFDMUQsaUVBQWlFO0FBQ2pFLHFCQUFxQjtBQUNyQixRQUFRO0FBQ1IsZ0VBQWdFO0FBQ2hFLHdDQUF3QztBQUN4QyxJQUFJO0FBQ0osNEJBQTRCO0FBQzVCLGtEQUFrRDtBQUNsRCxvRUFBb0U7QUFDcEUsd0NBQXdDO0FBQ3hDLElBQUk7QUFDSixTQUFnQixZQUFZLENBQUMsR0FBVyxFQUFFLElBQVc7SUFDakQsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFO1FBQUUsT0FBTyxFQUFFLENBQUE7S0FBRTtJQUM5QixJQUFJLE1BQU0sR0FBRyxHQUFHLENBQUE7SUFDaEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFDLE9BQU8sRUFBRSxLQUFLO1FBQ3hCLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE9B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TSxJQUFJLEVBQUUsRUFBRTtRQUNkLE9BQU8sY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQ2pDO1NBQU07UUFDSCxJQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDdkMsSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDO1FBRWpCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFDLElBQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUV4QyxJQUFJLEtBQUssS0FBSyxDQUFDLEVBQUU7Z0JBQ2IsSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLEVBQUU7b0JBQ3JELE1BQU0sSUFBSSxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7aUJBQ3ZEO3FCQUFNO29CQUNILE1BQU0sSUFBSSxjQUFjLENBQUMsS0FBSyxDQUFDLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2lCQUMvRTthQUNKO2lCQUFNO2dCQUNILElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtvQkFDeEMsTUFBTSxJQUFJLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDbkM7YUFDSjtTQUNKO1FBQ0QsT0FBTyxNQUFNLENBQUM7S0FDakI7QUFDTCxDQUFDO0FBMUJELDBDQTBCQyIsImZpbGUiOiIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGltcG9ydCBHYW1lTWF0aCBmcm9tICcuL0dhbWVNYXRoJztcbi8vIGltcG9ydCB7IGdhbWVNZXRob2QgfSBmcm9tICcuLi9jZmcvZ2FtZU1ldGhvZCc7XG4vLyBpbXBvcnQgeyBnYW1lQ2ZnIH0gZnJvbSAnLi4vY2ZnL0dhbWVDZmcnO1xuLy8gaW1wb3J0IENvbmZpZyBmcm9tICcuLi9Db25maWcnO1xuLy8gaW1wb3J0IHsgSGRjaWQgfSBmcm9tICcuLi9jZmcvWHlTJztcbmltcG9ydCB7IGdhbWVNZXRob2QgfSBmcm9tICcuLi9jb21tb24vZ2FtZU1ldGhvZCc7XG5pbXBvcnQgR2FtZU1hdGggZnJvbSAnLi9HYW1lTWF0aCc7XG5pbXBvcnQgeyBJMThuIH0gZnJvbSAnLi9JMThuVXRpbCc7XG4vLyBpbXBvcnQgeyBXb3JrVHlwZSB9IGZyb20gJy4uL2NmZy9YeVdvcmsnO1xuXG4vLyDmnKzlnLDljJYs5qC85byP5YyW5paH5a2XXG5leHBvcnQgZnVuY3Rpb24gbG9jYWxpemVkKGtleTogc3RyaW5nLCAuLi5hcmdzKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3RyaW5nRm9ybWF0KGtleSwgYXJncylcbiAgICAvLyBpZiAoa2V5ID09IG51bGwgfHwga2V5Lmxlbmd0aCA9PSAwKSB7XG4gICAgLy8gICAgIHJldHVybiBzdHJpbmdGb3JtYXQoa2V5LCBhcmdzKVxuICAgIC8vIH1cbiAgICAvLyBsZXQgX2xhbmcgPSBDb25maWcubGFuZ1xuICAgIC8vIGxldCBkYXRhID0gR2FtZUNmZy5sYW5nLmdldEl0ZW0oa2V5KVxuICAgIC8vIGlmIChkYXRhID09IG51bGwpIHtcbiAgICAvLyAgICAgcmV0dXJuIHN0cmluZ0Zvcm1hdChrZXksIGFyZ3MpXG4gICAgLy8gfVxuICAgIC8vIGxldCByZXN1bHQgPSBkYXRhW19sYW5nXVxuICAgIC8vIGlmIChyZXN1bHQgPT0gbnVsbCkge1xuICAgIC8vICAgICByZXR1cm4gc3RyaW5nRm9ybWF0KGtleSwgYXJncylcbiAgICAvLyB9XG4gICAgLy8gcmV0dXJuIHN0cmluZ0Zvcm1hdChyZXN1bHQsIGFyZ3MpXG59XG4vLyAvLyDojrflj5ZjbGllbnTphY3nva7ooahcbi8vIGV4cG9ydCBmdW5jdGlvbiBnZXRXb3JkKHN0cjogc3RyaW5nLCAuLi5hcmdzKTogc3RyaW5nIHtcbi8vICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KGdhbWVDZmcubGFuZ0NsaWVudC5nZXRJdGVtKHN0cikpKSB7XG4vLyAgICAgICAgIHJldHVybiBzdHJcbi8vICAgICB9XG4vLyAgICAgbGV0IHJlc3VsdCA9IGdhbWVDZmcubGFuZ0NsaWVudC5nZXRJdGVtKHN0cilbQ29uZmlnLmxhbmddXG4vLyAgICAgcmV0dXJuIHN0cmluZ0Zvcm1hdChyZXN1bHQsIGFyZ3MpXG4vLyB9XG4vLyAvLyDojrflj5YgY2xpZW50VGV4dC5jc3bphY3nva7ooajmloflrZdcbi8vIGV4cG9ydCBmdW5jdGlvbiBnZXRUZXh0KHN0cjogc3RyaW5nLCAuLi5hcmdzKSB7XG4vLyAgICAgbGV0IHJlc3VsdCA9IGdhbWVDZmcubGFuZ0NsaWVudFRleHQuZ2V0SXRlbShzdHIpW0NvbmZpZy5sYW5nXVxuLy8gICAgIHJldHVybiBzdHJpbmdGb3JtYXQocmVzdWx0LCBhcmdzKVxuLy8gfVxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ0Zvcm1hdChzdHI6IHN0cmluZywgbGlzdDogYW55W10pOiBzdHJpbmcge1xuICAgIGlmIChzdHIgPT0gbnVsbCkgeyByZXR1cm4gXCJcIiB9XG4gICAgbGV0IHJlc3VsdCA9IHN0clxuICAgIGxpc3QuZm9yRWFjaCgoZWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoYCV7JHtpbmRleH19YCwgZWxlbWVudClcbiAgICB9KVxuICAgIHJldHVybiByZXN1bHRcbn1cbi8vIC8qKlxuLy8gICog5pi+56S65YCS6K6h5pe2XG4vLyAgKiBAcGFyYW0gdGltZSDlgJLorqHml7bnu5PmnZ/ml7bpl7TmiLNcbi8vICAqIEBwYXJhbSBhY3Qg5rS75Yqoa2V5XG4vLyAgKiBAcGFyYW0gaGRjaWQg5rS75YqoSGRjaWRcbi8vICAqIEBwYXJhbSB0eXBlIOWAkuiuoeaXtuWxleekuuexu+WeiyAgICAgXG4vLyAgKiBAcmV0dXJucyBcbi8vICAqL1xuLy8gZXhwb3J0IGZ1bmN0aW9uIHNob3dDZFRpbWUodGltZTogbnVtYmVyLCBhY3Q6IFdvcmtUeXBlLCBoZGNpZDogc3RyaW5nLCB0eXBlOiBzdHJpbmcgPSAnMScpIHtcbi8vICAgICBsZXQgY2RUaW1lOiBudW1iZXIgPSAwXG4vLyAgICAgY2RUaW1lID0gdGltZSAtIEdhbWVEYXRhQ2VudGVyLnRpbWVNb2RlbC5zZXZUaW1lXG4vLyAgICAgaWYgKGNkVGltZSA+PSAwKSB7XG4vLyAgICAgICAgIHJldHVybiB0aGlzLnNob3dUaW1lKGNkVGltZSwgdHlwZSlcbi8vICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAvLyDpmLLmraLlu7bov5/kvJrkuIDnm7Tph43lpI3lj5HpgIHor7fmsYJcbi8vICAgICAgICAgaWYgKEdhbWVEYXRhQ2VudGVyLnRpbWVNb2RlbC5nZXRJc0tleUFkb2soYWN0KSkge1xuLy8gICAgICAgICAgICAgR2FtZURhdGFDZW50ZXIudGltZU1vZGVsLnNlbmRBZG9rS2V5KHRpbWUsIGFjdCwgaGRjaWQpXG4vLyAgICAgICAgIH1cbi8vICAgICB9XG4vLyB9XG4vKipcbiAqIOenkue6p+WIqygxMOS9jeaVsClcbiAqIEBwYXJhbSB0aW1lIOaXtumXtOaIs1xuICogQHBhcmFtIHR5cGUg57G75Z6LIFxuICogICAgICAgICAgICAgIDE6IOWkp+S6juS4gOWkqSzmmL7npLp45aSpeOaXtjvlsI/kuo7kuIDlpKks5pi+56S6MDA6MDA6MDAo5aSp5pWw5LiN6LazLOihpTApICAgIFxuICogICAgICAgICAgICAgIDI6IDHlpKkzNuWIhijlj6rmmL7npLrmnIDliY3pnaLnmoTkuKTkvY0pXG4gKiAgICAgICAgICAgICAgMzog5bCP5LqO5LiA5bCP5pe277yM5pi+56S6eHg6eHgo5YiG56eSKVxuICogICAgICAgICAgICAgIDQ6IOWPquaYvuekuuacgOmrmOWNleS9jSDlpKfkuo4x5aSpIOaYvuekujHlpKkg5aSn5LqOMeWwj+aXtiDmmL7npLox5pe2XG4gKiBAcmV0dXJucyBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNob3dUaW1lKHRpbWU6IG51bWJlciwgdHlwZTogc3RyaW5nID0gXCIxXCIpOiBzdHJpbmcge1xuICAgIGlmICh0aW1lLnRvU3RyaW5nKCkubGVuZ3RoID09IDEzKSB7XG4gICAgICAgIHRpbWUgPSBNYXRoLmZsb29yKHRpbWUgLyAxMDAwKVxuICAgIH1cbiAgICBpZiAodGltZSA8PSAwKSB7XG4gICAgICAgIHJldHVybiB0eXBlID09IFwiM1wiID8gXCIwMDowMFwiIDogXCIwMDowMDowMFwiXG4gICAgfVxuICAgIGxldCB0VGltZSA9ICcnXG4gICAgbGV0IGRheTogbnVtYmVyID0gMFxuICAgIGxldCBob3VyOiBudW1iZXIgPSAwXG4gICAgbGV0IG1pbnV0ZTogbnVtYmVyID0gMFxuICAgIGxldCBzZWNvbmQ6IG51bWJlciA9IDBcbiAgICBkYXkgPSBNYXRoLmZsb29yKHRpbWUgLyAoMjQgKiA2MCAqIDYwKSlcbiAgICBob3VyID0gTWF0aC5mbG9vcigodGltZSAlICgyNCAqIDYwICogNjApKSAvICg2MCAqIDYwKSlcbiAgICBtaW51dGUgPSBNYXRoLmZsb29yKCh0aW1lICUgKDYwICogNjApKSAvIDYwKVxuICAgIHNlY29uZCA9IE1hdGguZmxvb3IodGltZSAlIDYwKVxuXG4gICAgaWYgKHR5cGUgPT0gXCIxXCIpIHtcbiAgICAgICAgaWYgKGRheSA+IDApIHtcbiAgICAgICAgICAgIHRUaW1lID0gSTE4bi5nZXRJMThuVGV4dCgnY29tbW9uX3RpbWVmb3JtYXRfZGgnLCBkYXksIGhvdXIpXG4gICAgICAgIH0gZWxzZSBpZiAoaG91ciA+IDApIHtcbiAgICAgICAgICAgIHRUaW1lID0gYCR7R2FtZU1hdGguYWRkWmVybyhkYXkgKiAyNCArIGhvdXIpfToke0dhbWVNYXRoLmFkZFplcm8obWludXRlKX06JHtHYW1lTWF0aC5hZGRaZXJvKHNlY29uZCl9YFxuICAgICAgICAgICAgLy8gdFRpbWUgPSBgJHtHYW1lTWF0aC5hZGRaZXJvKGRheSAqIDI0ICsgaG91cil95pe2JHtHYW1lTWF0aC5hZGRaZXJvKG1pbnV0ZSl95YiGYFxuICAgICAgICB9IGVsc2UgaWYgKG1pbnV0ZSA+IDApIHtcbiAgICAgICAgICAgIHRUaW1lID0gYDAwOiR7R2FtZU1hdGguYWRkWmVybyhtaW51dGUpfToke0dhbWVNYXRoLmFkZFplcm8oc2Vjb25kKX1gXG4gICAgICAgICAgICAvLyB0VGltZSA9IGAke0dhbWVNYXRoLmFkZFplcm8obWludXRlKX3liIYke0dhbWVNYXRoLmFkZFplcm8oc2Vjb25kKX3np5JgXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0VGltZSA9IGAwMDowMDoke0dhbWVNYXRoLmFkZFplcm8oc2Vjb25kKX1gXG4gICAgICAgICAgICAvLyB0VGltZSA9IGAke0dhbWVNYXRoLmFkZFplcm8oc2Vjb25kKX3np5JgXG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCIyXCIpIHtcbiAgICAgICAgaWYgKGRheSA+IDApIHtcbiAgICAgICAgICAgIHRUaW1lID0gSTE4bi5nZXRJMThuVGV4dCgnY29tbW9uX3RpbWVmb3JtYXRfZGgnLCBkYXksIGhvdXIpXG4gICAgICAgIH0gZWxzZSBpZiAoaG91ciA+IDApIHtcbiAgICAgICAgICAgIHRUaW1lID0gYCR7R2FtZU1hdGguYWRkWmVybyhkYXkgKiAyNCArIGhvdXIpfeaXtiR7R2FtZU1hdGguYWRkWmVybyhtaW51dGUpfeWIhmBcbiAgICAgICAgfSBlbHNlIGlmIChtaW51dGUgPiAwKSB7XG4gICAgICAgICAgICB0VGltZSA9IGAke0dhbWVNYXRoLmFkZFplcm8obWludXRlKX3liIYke0dhbWVNYXRoLmFkZFplcm8oc2Vjb25kKX3np5JgXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0VGltZSA9IGAke0dhbWVNYXRoLmFkZFplcm8oc2Vjb25kKX3np5JgXG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJzMnKSB7XG4gICAgICAgIGlmIChkYXkgPiAwKSB7XG4gICAgICAgICAgICB0VGltZSA9IEkxOG4uZ2V0STE4blRleHQoJ2NvbW1vbl90aW1lZm9ybWF0X2RoJywgZGF5LCBob3VyKVxuICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPiAwKSB7XG4gICAgICAgICAgICB0VGltZSA9IGAke0dhbWVNYXRoLmFkZFplcm8oZGF5ICogMjQgKyBob3VyKX06JHtHYW1lTWF0aC5hZGRaZXJvKG1pbnV0ZSl9OiR7R2FtZU1hdGguYWRkWmVybyhzZWNvbmQpfWBcbiAgICAgICAgICAgIC8vIHRUaW1lID0gYCR7R2FtZU1hdGguYWRkWmVybyhkYXkgKiAyNCArIGhvdXIpfeaXtiR7R2FtZU1hdGguYWRkWmVybyhtaW51dGUpfeWIhmBcbiAgICAgICAgfSBlbHNlIGlmIChtaW51dGUgPiAwKSB7XG4gICAgICAgICAgICB0VGltZSA9IGAke0dhbWVNYXRoLmFkZFplcm8obWludXRlKX06JHtHYW1lTWF0aC5hZGRaZXJvKHNlY29uZCl9YFxuICAgICAgICAgICAgLy8gdFRpbWUgPSBgJHtHYW1lTWF0aC5hZGRaZXJvKG1pbnV0ZSl95YiGJHtHYW1lTWF0aC5hZGRaZXJvKHNlY29uZCl956eSYFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdFRpbWUgPSBgMDA6JHtHYW1lTWF0aC5hZGRaZXJvKHNlY29uZCl9YFxuICAgICAgICAgICAgLy8gdFRpbWUgPSBgJHtHYW1lTWF0aC5hZGRaZXJvKHNlY29uZCl956eSYFxuICAgICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09ICc0Jykge1xuICAgICAgICBpZiAoZGF5ID4gMSkge1xuICAgICAgICAgICAgdFRpbWUgPSBJMThuLmdldEkxOG5UZXh0KCdjb21tb25fdGltZWZvcm1hdF9kJywgZGF5KVxuICAgICAgICB9IGVsc2UgaWYgKGRheSA+IDAgfHwgaG91ciA+IDApIHtcbiAgICAgICAgICAgIHRUaW1lID0gSTE4bi5nZXRJMThuVGV4dCgnY29tbW9uX3RpbWVmb3JtYXRfaCcsIGRheSAqIDI0ICsgaG91cilcbiAgICAgICAgfSBlbHNlIGlmIChtaW51dGUgPiAwKSB7XG4gICAgICAgICAgICB0VGltZSA9IEkxOG4uZ2V0STE4blRleHQoJ2NvbW1vbl90aW1lZm9ybWF0X20nLCBtaW51dGUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0VGltZSA9IEkxOG4uZ2V0STE4blRleHQoJ2NvbW1vbl90aW1lZm9ybWF0X3MnLCBzZWNvbmQpXG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJzUnKSB7XG4gICAgICAgIGlmIChkYXkgPiAwKSB7XG4gICAgICAgICAgICB0VGltZSA9IGAke0dhbWVNYXRoLmFkZFplcm8oZGF5ICogMjQgKyBob3VyKX06JHtHYW1lTWF0aC5hZGRaZXJvKG1pbnV0ZSl9OiR7R2FtZU1hdGguYWRkWmVybyhzZWNvbmQpfWBcbiAgICAgICAgfSBlbHNlIGlmIChob3VyID4gMCkge1xuICAgICAgICAgICAgdFRpbWUgPSBgJHtHYW1lTWF0aC5hZGRaZXJvKGRheSAqIDI0ICsgaG91cil9OiR7R2FtZU1hdGguYWRkWmVybyhtaW51dGUpfToke0dhbWVNYXRoLmFkZFplcm8oc2Vjb25kKX1gXG4gICAgICAgIH0gZWxzZSBpZiAobWludXRlID4gMCkge1xuICAgICAgICAgICAgdFRpbWUgPSBgMDA6JHtHYW1lTWF0aC5hZGRaZXJvKG1pbnV0ZSl9OiR7R2FtZU1hdGguYWRkWmVybyhzZWNvbmQpfWBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRUaW1lID0gYDAwOjAwOiR7R2FtZU1hdGguYWRkWmVybyhzZWNvbmQpfWBcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PSAnNicpIHtcbiAgICAgICAgaWYgKGRheSA+IDApIHtcbiAgICAgICAgICAgIHRUaW1lID0gSTE4bi5nZXRJMThuVGV4dCgnY29tbW9uX3RpbWVmb3JtYXRfZGhtcycsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQpOy8vIHjlpKl45bCP5pe2eOWIhnjnp5JcbiAgICAgICAgfSBlbHNlIGlmIChob3VyID4gMCkge1xuICAgICAgICAgICAgdFRpbWUgPSBJMThuLmdldEkxOG5UZXh0KCdjb21tb25fdGltZWZvcm1hdF9obXMnLCBob3VyLCBtaW51dGUsIHNlY29uZCk7Ly8geOWwj+aXtnjliIZ456eSXG4gICAgICAgIH0gZWxzZSBpZiAobWludXRlID4gMCkge1xuICAgICAgICAgICAgdFRpbWUgPSBJMThuLmdldEkxOG5UZXh0KCdjb21tb25fdGltZWZvcm1hdF9tcycsIG1pbnV0ZSwgc2Vjb25kKTsvLyB45YiGeOenklxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdFRpbWUgPSBJMThuLmdldEkxOG5UZXh0KCdjb21tb25fdGltZWZvcm1hdF9zJywgc2Vjb25kKTsvLyB456eSXG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJzcnKSB7XG4gICAgICAgIGlmIChkYXkgPiAwKSB7XG4gICAgICAgICAgICB0VGltZSA9IEkxOG4uZ2V0STE4blRleHQoJ2NvbW1vbl90aW1lZm9ybWF0X2RobXNfMicsIGRheSwgR2FtZU1hdGguYWRkWmVybyhob3VyKSwgR2FtZU1hdGguYWRkWmVybyhtaW51dGUpLCBHYW1lTWF0aC5hZGRaZXJvKHNlY29uZCkpXG4gICAgICAgIH0gZWxzZSBpZiAoaG91ciA+IDApIHtcbiAgICAgICAgICAgIHRUaW1lID0gYCR7R2FtZU1hdGguYWRkWmVybyhob3VyKX06JHtHYW1lTWF0aC5hZGRaZXJvKG1pbnV0ZSl9OiR7R2FtZU1hdGguYWRkWmVybyhzZWNvbmQpfWBcbiAgICAgICAgfSBlbHNlIGlmIChtaW51dGUgPiAwKSB7XG4gICAgICAgICAgICB0VGltZSA9IGAwMDoke0dhbWVNYXRoLmFkZFplcm8obWludXRlKX06JHtHYW1lTWF0aC5hZGRaZXJvKHNlY29uZCl9YFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdFRpbWUgPSBgMDA6MDA6JHtHYW1lTWF0aC5hZGRaZXJvKHNlY29uZCl9YFxuICAgICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09ICc4JykgeyAvLyDmmL7npLrkuKTkuKrljZXkvY1cbiAgICAgICAgaWYgKGRheSA+IDApIHtcbiAgICAgICAgICAgIHRUaW1lID0gSTE4bi5nZXRJMThuVGV4dCgnY29tbW9uX3RpbWVmb3JtYXRfZGgnLCBkYXksIGhvdXIpXG4gICAgICAgIH0gZWxzZSBpZiAoaG91ciA+IDApIHtcbiAgICAgICAgICAgIHRUaW1lID0gYCR7R2FtZU1hdGguYWRkWmVybyhkYXkgKiAyNCArIGhvdXIpfToke0dhbWVNYXRoLmFkZFplcm8obWludXRlKX1gXG4gICAgICAgIH0gZWxzZSBpZiAobWludXRlID4gMCkge1xuICAgICAgICAgICAgdFRpbWUgPSBgJHtHYW1lTWF0aC5hZGRaZXJvKG1pbnV0ZSl9OiR7R2FtZU1hdGguYWRkWmVybyhzZWNvbmQpfWBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRUaW1lID0gYDAwOiR7R2FtZU1hdGguYWRkWmVybyhzZWNvbmQpfWBcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdFRpbWVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3dUaW1lWU1EKHNoaWppYW5jaHVvOiBudW1iZXIsIHR5cGU6IG51bWJlciA9IDApOiBzdHJpbmcge1xuICAgIGlmIChzaGlqaWFuY2h1by50b1N0cmluZygpLmxlbmd0aCA9PSAxMCkge1xuICAgICAgICBzaGlqaWFuY2h1byA9IHNoaWppYW5jaHVvICogMTAwMFxuICAgIH1cbiAgICB2YXIgdGltZSA9IG5ldyBEYXRlKHNoaWppYW5jaHVvKTtcbiAgICB2YXIgeSA9IHRpbWUuZ2V0RnVsbFllYXIoKVxuICAgIHZhciBtID0gdGltZS5nZXRNb250aCgpICsgMVxuICAgIHZhciBkID0gdGltZS5nZXREYXRlKClcbiAgICB2YXIgaCA9IHRpbWUuZ2V0SG91cnMoKVxuICAgIHZhciBtbSA9IHRpbWUuZ2V0TWludXRlcygpXG4gICAgdmFyIHMgPSB0aW1lLmdldFNlY29uZHMoKVxuICAgIGlmICh0eXBlID09IDApIHtcbiAgICAgICAgcmV0dXJuIGAke3l9LSR7R2FtZU1hdGguYWRkWmVybyhtKX0tJHtHYW1lTWF0aC5hZGRaZXJvKGQpfSAke0dhbWVNYXRoLmFkZFplcm8oaCl9OiR7R2FtZU1hdGguYWRkWmVybyhtbSl9OiR7R2FtZU1hdGguYWRkWmVybyhzKX1gXG4gICAgfSBlbHNlIGlmICh0eXBlID09IDEpIHtcbiAgICAgICAgcmV0dXJuIGAke0dhbWVNYXRoLmFkZFplcm8oeSl9LSR7R2FtZU1hdGguYWRkWmVybyhtKX0tJHtHYW1lTWF0aC5hZGRaZXJvKGQpfWBcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gMikge1xuICAgICAgICByZXR1cm4gYCR7R2FtZU1hdGguYWRkWmVybyh5KX0uJHtHYW1lTWF0aC5hZGRaZXJvKG0pfS4ke0dhbWVNYXRoLmFkZFplcm8oZCl9YFxuICAgIH0gZWxzZSBpZiAodHlwZSA9PSAzKSB7XG4gICAgICAgIHJldHVybiBgJHtHYW1lTWF0aC5hZGRaZXJvKG0pfS0ke0dhbWVNYXRoLmFkZFplcm8oZCl9ICR7R2FtZU1hdGguYWRkWmVybyhoKX06JHtHYW1lTWF0aC5hZGRaZXJvKG1tKX1gXG4gICAgfSBlbHNlIGlmICh0eXBlID09IDQpIHtcbiAgICAgICAgcmV0dXJuIGAke0dhbWVNYXRoLmFkZFplcm8obSl9LyR7R2FtZU1hdGguYWRkWmVybyhkKX1gXG4gICAgfSBlbHNlIGlmICh0eXBlID09IDUpIHtcbiAgICAgICAgcmV0dXJuIGAke0dhbWVNYXRoLmFkZFplcm8oeSl9LyR7R2FtZU1hdGguYWRkWmVybyhtKX0vJHtHYW1lTWF0aC5hZGRaZXJvKGQpfWBcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gNikgey8v6K6+572u55WM6Z2i5pe26Ze05pi+56S6XG4gICAgICAgIHJldHVybiBgJHtHYW1lTWF0aC5hZGRaZXJvKHkpfS0ke0dhbWVNYXRoLmFkZFplcm8obSl9LSR7R2FtZU1hdGguYWRkWmVybyhkKX0gJHtHYW1lTWF0aC5hZGRaZXJvKGgpfToke0dhbWVNYXRoLmFkZFplcm8obW0pfToke0dhbWVNYXRoLmFkZFplcm8ocyl9YFxuICAgIH0gZWxzZSBpZiAodHlwZSA9PSA3KSB7XG4gICAgICAgIHJldHVybiBgJHtHYW1lTWF0aC5hZGRaZXJvKGgpfToke0dhbWVNYXRoLmFkZFplcm8obW0pfWBcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gOCkge1xuICAgICAgICByZXR1cm4gSTE4bi5nZXRJMThuVGV4dCgnY29tbW9uX3RpbWVmb3JtYXRfeW1kJywgeSwgbSwgZClcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gOSkge1xuICAgICAgICByZXR1cm4gSTE4bi5nZXRJMThuVGV4dCgnY29tbW9uX3RpbWVmb3JtYXRfbWQnLCBtLCBkKVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PSAxMCkge1xuICAgICAgICByZXR1cm4gYCR7eX0vJHttfS8ke2R9YFxuICAgIH0gZWxzZSBpZiAodHlwZSA9PSAxMSkgeyAvLyAwMDowMDowMOagvOW8j1xuICAgICAgICByZXR1cm4gYCR7R2FtZU1hdGguYWRkWmVybyhoKX06JHtHYW1lTWF0aC5hZGRaZXJvKG1tKX06JHtHYW1lTWF0aC5hZGRaZXJvKHMpfWBcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gMTIpIHsgXG4gICAgICAgIHJldHVybiBgJHtHYW1lTWF0aC5hZGRaZXJvKHkpfS8ke0dhbWVNYXRoLmFkZFplcm8obSl9LyR7R2FtZU1hdGguYWRkWmVybyhkKX0gJHtHYW1lTWF0aC5hZGRaZXJvKGgpfToke0dhbWVNYXRoLmFkZFplcm8obW0pfToke0dhbWVNYXRoLmFkZFplcm8ocyl9YFxuICAgIH0gZWxzZSBpZiAodHlwZSA9PSAxMykgeyBcbiAgICAgICAgcmV0dXJuIGAke0dhbWVNYXRoLmFkZFplcm8obSl9LyR7R2FtZU1hdGguYWRkWmVybyhkKX0gJHtHYW1lTWF0aC5hZGRaZXJvKGgpfToke0dhbWVNYXRoLmFkZFplcm8obW0pfToke0dhbWVNYXRoLmFkZFplcm8ocyl9YFxuICAgIH0gXG59XG5leHBvcnQgZnVuY3Rpb24gc2hvd1RpbWVXb3JkKHRpbWU6IG51bWJlciwgdHlwZTogc3RyaW5nID0gXCIxXCIpOiBzdHJpbmcge1xuICAgIGxldCB0VGltZSA9ICcnXG4gICAgbGV0IG1vbnRoOiBudW1iZXIgPSAwXG4gICAgbGV0IGRheTogbnVtYmVyID0gMFxuICAgIGxldCBob3VyOiBudW1iZXIgPSAwXG4gICAgbGV0IG1pbnV0ZTogbnVtYmVyID0gMFxuICAgIGxldCBzZWNvbmQ6IG51bWJlciA9IDBcbiAgICBtb250aCA9IE1hdGguZmxvb3IodGltZSAvICgzMCAqIDI0ICogNjAgKiA2MCkpXG4gICAgZGF5ID0gTWF0aC5mbG9vcih0aW1lIC8gKDI0ICogNjAgKiA2MCkpXG4gICAgaG91ciA9IE1hdGguZmxvb3IoKHRpbWUgJSAoMjQgKiA2MCAqIDYwKSkgLyAoNjAgKiA2MCkpXG4gICAgbWludXRlID0gTWF0aC5mbG9vcigodGltZSAlICg2MCAqIDYwKSkgLyA2MClcbiAgICBzZWNvbmQgPSBNYXRoLmZsb29yKHRpbWUgJSA2MClcbiAgICBpZiAodHlwZSA9PSBcIjFcIikge1xuICAgICAgICBpZiAobW9udGggPiAwKSB7XG4gICAgICAgICAgICB0VGltZSA9IEkxOG4uZ2V0STE4blRleHQoJ2NvbW1vbl90aW1ld29yZF80JywgbW9udGgpXG4gICAgICAgIH0gZWxzZSBpZiAoZGF5ID4gMCkge1xuICAgICAgICAgICAgdFRpbWUgPSBJMThuLmdldEkxOG5UZXh0KCdjb21tb25fdGltZXdvcmRfMycsIGRheSlcbiAgICAgICAgfSBlbHNlIGlmIChob3VyID4gMCkge1xuICAgICAgICAgICAgdFRpbWUgPSBJMThuLmdldEkxOG5UZXh0KCdjb21tb25fdGltZXdvcmRfMicsIGhvdXIpXG4gICAgICAgIH0gZWxzZSBpZiAobWludXRlID4gMCkge1xuICAgICAgICAgICAgdFRpbWUgPSBJMThuLmdldEkxOG5UZXh0KCdjb21tb25fdGltZXdvcmRfMScsIG1pbnV0ZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRUaW1lID0gSTE4bi5nZXRJMThuVGV4dCgnY29tbW9uX3RpbWV3b3JkXzUnKVxuICAgICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09IFwiMlwiKSB7XG4gICAgICAgIGlmIChtb250aCA+IDApIHtcbiAgICAgICAgICAgIHRUaW1lID0gSTE4bi5nZXRJMThuVGV4dCgnY29tbW9uX3RpbWVmb3JtYXRfbWRobXNfMicsIG1vbnRoLCBkYXksIEdhbWVNYXRoLmFkZFplcm8oaG91ciksIEdhbWVNYXRoLmFkZFplcm8obWludXRlKSwgR2FtZU1hdGguYWRkWmVybyhzZWNvbmQpKVxuICAgICAgICB9IGVsc2UgaWYgKGRheSA+IDApIHtcbiAgICAgICAgICAgIHRUaW1lID0gSTE4bi5nZXRJMThuVGV4dCgnY29tbW9uX3RpbWVmb3JtYXRfZGhtc18yJywgZGF5LCBHYW1lTWF0aC5hZGRaZXJvKGhvdXIpLCBHYW1lTWF0aC5hZGRaZXJvKG1pbnV0ZSksIEdhbWVNYXRoLmFkZFplcm8oc2Vjb25kKSlcbiAgICAgICAgfSBlbHNlIGlmIChob3VyID4gMCkge1xuICAgICAgICAgICAgdFRpbWUgPSBgJHtob3VyfToke0dhbWVNYXRoLmFkZFplcm8obWludXRlKX06JHtHYW1lTWF0aC5hZGRaZXJvKHNlY29uZCl9YFxuICAgICAgICB9IGVsc2UgaWYgKG1pbnV0ZSA+IDApIHtcbiAgICAgICAgICAgIHRUaW1lID0gYDAwOiR7R2FtZU1hdGguYWRkWmVybyhtaW51dGUpfToke0dhbWVNYXRoLmFkZFplcm8oc2Vjb25kKX1gXG4gICAgICAgIH0gZWxzZSBpZiAoc2Vjb25kID4gMCkge1xuICAgICAgICAgICAgdFRpbWUgPSBgMDA6MDA6JHtHYW1lTWF0aC5hZGRaZXJvKHNlY29uZCl9YFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdFRpbWUgPSBgMDA6MDA6MDBgXG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICB0VGltZSA9IEkxOG4uZ2V0STE4blRleHQoJ2NvbW1vbl90aW1lZm9ybWF0X3Vua25vd3R5cGUnKVxuICAgIH1cblxuICAgIHJldHVybiB0VGltZVxufVxuZXhwb3J0IGZ1bmN0aW9uIElzU2FtZURheSh0aW1lc3RhbXAxOiBudW1iZXIsIHRpbWVzdGFtcDI6IG51bWJlcikge1xuICAgIGNvbnN0IGRhdGUxID0gbmV3IERhdGUodGltZXN0YW1wMSAqIDEwMDApOyAvLyDovazljJbkuLrmr6vnp5Lml7bpl7TmiLNcbiAgICBjb25zdCBkYXRlMiA9IG5ldyBEYXRlKHRpbWVzdGFtcDIgKiAxMDAwKTtcbiAgICByZXR1cm4gKFxuICAgICAgICBkYXRlMS5nZXRGdWxsWWVhcigpID09PSBkYXRlMi5nZXRGdWxsWWVhcigpICYmXG4gICAgICAgIGRhdGUxLmdldE1vbnRoKCkgPT09IGRhdGUyLmdldE1vbnRoKCkgJiZcbiAgICAgICAgZGF0ZTEuZ2V0RGF0ZSgpID09PSBkYXRlMi5nZXREYXRlKClcbiAgICApO1xufVxuXG4vLyDpmL/mi4nkvK/mlbDlrZfovazkuK3mlodcbi8vIGV4cG9ydCBmdW5jdGlvbiBjaGluZXNlQnlOdW1iZXIobnVtYmVyOiBudW1iZXIpOiBzdHJpbmcge1xuLy8gICAgIGNvbnN0IGNoaW5lc2VOdW1iZXJzID0gWyfpm7YnLCAn5LiAJywgJ+S6jCcsICfkuIknLCAn5ZubJywgJ+S6lCcsICflha0nLCAn5LiDJywgJ+WFqycsICfkuZ0nLCAn5Y2BJ107XG4vLyAgICAgY29uc3QgY2hpbmVzZVVuaXRzID0gWycnLCAn5Y2BJywgJ+eZvicsICfljYMnLCAn5LiHJ107XG4vLyAgICAgaWYgKG51bWJlciA8PSAxMCkge1xuLy8gICAgICAgICByZXR1cm4gY2hpbmVzZU51bWJlcnNbbnVtYmVyXTtcbi8vICAgICB9IGVsc2Uge1xuLy8gICAgICAgICBjb25zdCBudW1iZXJTdHJpbmcgPSBudW1iZXIudG9TdHJpbmcoKTtcbi8vICAgICAgICAgbGV0IHJlc3VsdCA9ICcgJztcblxuLy8gICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bWJlclN0cmluZy5sZW5ndGg7IGkrKykge1xuLy8gICAgICAgICAgICAgY29uc3QgZGlnaXQgPSBwYXJzZUludChudW1iZXJTdHJpbmdbaV0pO1xuXG4vLyAgICAgICAgICAgICBpZiAoZGlnaXQgIT09IDApIHtcbi8vICAgICAgICAgICAgICAgICBpZiAobnVtYmVyU3RyaW5nLmxlbmd0aCA9PT0gMiAmJiBpID09PSAwICYmIGRpZ2l0ID09PSAxKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBjaGluZXNlVW5pdHNbbnVtYmVyU3RyaW5nLmxlbmd0aCAtIGkgLSAxXTtcbi8vICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gY2hpbmVzZU51bWJlcnNbZGlnaXRdICsgY2hpbmVzZVVuaXRzW251bWJlclN0cmluZy5sZW5ndGggLSBpIC0gMV07XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCB8fCBudW1iZXJTdHJpbmdbaSAtIDFdICE9PSAnMCcpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGNoaW5lc2VOdW1iZXJzW2RpZ2l0XTtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbi8vICAgICB9XG4vLyB9XG5cbmV4cG9ydCBjbGFzcyBGb3JtdWxhQ29tIHtcbiAgICAvLyByZXR1cm4gcmFuZG9tIGludCBbbWluLG1heF1cbiAgICBzdGF0aWMgcmFuZG9tKG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpICsgbWluKVxuICAgIH1cbiAgICBzdGF0aWMgdXVpZChsZW4xLCBsZW4yKSB7XG4gICAgICAgIGxldCB0aW1lc3RhbXAgPSAobmV3IERhdGUoKSkudmFsdWVPZigpO1xuICAgICAgICByZXR1cm4gRm9ybXVsYUNvbS5yYW5kb20oTWF0aC5wb3coMTAsIGxlbjEgLSAxKSAtIDEsIE1hdGgucG93KDEwLCBsZW4xKSkudG9TdHJpbmcoKSArIHRpbWVzdGFtcCAlIChNYXRoLnBvdygxMCwgbGVuMikpXG4gICAgfVxuICAgIHN0YXRpYyB0aW1lOiBudW1iZXIgPSAwXG4gICAgc3RhdGljIGNvc3RUaW1lKHR5cGU6IG51bWJlcikge1xuICAgICAgICBpZiAodHlwZSA9PSAxKSB7XG4gICAgICAgICAgICB0aGlzLnRpbWUgPSBEYXRlLm5vdygpXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSAyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgY29zdCAke0RhdGUubm93KCkgLSB0aGlzLnRpbWV9bXNgKVxuICAgICAgICB9XG4gICAgfVxuICAgIC8v6ZqP5py65oq95Y+W5YWD57Sg5LiN6YeN5aSNXG4gICAgc3RhdGljIGdldFJhbmRvbUFycmF5RWxlbWVudHM8VD4oYXJyOiBBcnJheTxUPiwgY291bnQ6IG51bWJlcik6IEFycmF5PFQ+IHtcbiAgICAgICAgY291bnQgPSBNYXRoLm1pbihjb3VudCwgYXJyLmxlbmd0aClcbiAgICAgICAgdmFyIHNodWZmbGVkID0gYXJyLnNsaWNlKDApLCBpID0gYXJyLmxlbmd0aCwgbWluID0gaSAtIGNvdW50LCB0ZW1wLCBpbmRleDtcbiAgICAgICAgd2hpbGUgKGktLSA+IG1pbikge1xuICAgICAgICAgICAgaW5kZXggPSBNYXRoLmZsb29yKChpICsgMSkgKiBNYXRoLnJhbmRvbSgpKTtcbiAgICAgICAgICAgIHRlbXAgPSBzaHVmZmxlZFtpbmRleF07XG4gICAgICAgICAgICBzaHVmZmxlZFtpbmRleF0gPSBzaHVmZmxlZFtpXTtcbiAgICAgICAgICAgIHNodWZmbGVkW2ldID0gdGVtcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2h1ZmZsZWQuc2xpY2UobWluKTtcbiAgICB9XG4gICAgLy8gLyoqXG4gICAgLy8gICog5LiA5Liq5pe26Ze054K5IOi3neemu+S7iuWkqeebuOW3ruWHoOWkqSAgICDku6Ux5byA5aeL566XICDku4rlpKnnrpcx5aSpICAg5LuK5aSp5LmL5ZCO55qE566XMOWkqVxuICAgIC8vICAqIEBwYXJhbSBzdHIgXG4gICAgLy8gICovXG4gICAgLy8gc3RhdGljIHBhc3NEYXkoc3RyOiBudW1iZXIpOiBudW1iZXIge1xuICAgIC8vICAgICBsZXQgRGF0ZXMgPSBuZXcgRGF0ZShHYW1lRGF0YUNlbnRlci50aW1lTW9kZWwuc2V2VGltZSAqIDEwMDApLnNldEhvdXJzKDAsIDAsIDAsIDApOy8v6I635Y+W5LuK5aSpMOeCuTDliIYw56eSMOavq+enkuOAglxuICAgIC8vICAgICBsZXQgY2hlY2tUaW1lID0gbmV3IERhdGUoc3RyICogMTAwMCkuc2V0SG91cnMoMCwgMCwgMCwgMCk7Ly/ojrflj5blvZPlpKkw54K5MOWIhjDnp5Iw5q+r56eS44CCXG4gICAgLy8gICAgIGlmIChEYXRlcyA8IGNoZWNrVGltZSkge1xuICAgIC8vICAgICAgICAgcmV0dXJuIDBcbiAgICAvLyAgICAgfVxuICAgIC8vICAgICByZXR1cm4gTWF0aC5hYnMoTWF0aC5mbG9vcigoRGF0ZXMgLSBjaGVja1RpbWUpIC8gODY0MDAwMDApKSArIDE7XG4gICAgLy8gfVxuXG4gICAgLy8gYT5i5YiZ6L+U5ZuePjAgYT1i5YiZ6L+U5ZueMCBhPGLliJnov5Tlm548MFxuICAgIHN0YXRpYyBjb21wYXJlVmVyc2lvbih2ZXJzaW9uQTogc3RyaW5nLCB2ZXJzaW9uQjogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAgICAgdmFyIHZBID0gdmVyc2lvbkEuc3BsaXQoJy4nKVxuICAgICAgICB2YXIgdkIgPSB2ZXJzaW9uQi5zcGxpdCgnLicpXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdkEubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIHZhciBhID0gcGFyc2VJbnQodkFbaV0pXG4gICAgICAgICAgICB2YXIgYiA9IDAgLy9wYXJzZUludCh2QltpXSB8fCAwKVxuICAgICAgICAgICAgaWYgKHZCW2ldKSB7XG4gICAgICAgICAgICAgICAgYiA9IHBhcnNlSW50KHZCW2ldKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGEgPT09IGIpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEgLSBiXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZCLmxlbmd0aCA+IHZBLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIC0xXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gMFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGdldFN0ckxlbmd0aChzdHI6IHN0cmluZyk6IG51bWJlciB7XG4gICAgICAgIGxldCBhID0gMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChzdHIuY2hhckNvZGVBdChpKSA+IDI1NSlcbiAgICAgICAgICAgICAgICBhICs9IDI7Ly/mjInnhafpooTmnJ/orqHmlbDlop7liqAyXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgYSsrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhO1xuICAgIH1cblxuICAgIC8vIOmZkOWItijpu5jorqQxNuS4quWtl+espikgIOS4reaWhzIg6Iux5paHMVxuICAgIHN0YXRpYyBnZXRMaW1pdFN0cihzdHI6IHN0cmluZywgbGltaXQ6IG51bWJlciA9IDE2KTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGEgPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHN0ci5jaGFyQ29kZUF0KGkpID4gMjU1KVxuICAgICAgICAgICAgICAgIGEgKz0gMjsvL+aMieeFp+mihOacn+iuoeaVsOWinuWKoDJcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBhKys7XG4gICAgICAgICAgICBpZiAoYSA+IGxpbWl0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0ci5zbGljZSgwLCBpKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHJcbiAgICB9XG4gICAgc3RhdGljIGlzT3ZlckxpbWl0KHN0cjogc3RyaW5nLCBsaW1pdDogbnVtYmVyID0gMTYpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IGEgPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHN0ci5jaGFyQ29kZUF0KGkpID4gMjU1KVxuICAgICAgICAgICAgICAgIGEgKz0gMjsvL+aMieeFp+mihOacn+iuoeaVsOWinuWKoDJcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBhKys7XG4gICAgICAgICAgICBpZiAoYSA+IGxpbWl0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICAvLyDlpJrkuKrlr7nosaHlnKjnlYzpnaLkuIrnmoTlsYXkuK3lsZXnpLos6ZyA6KaBYm9455qE6ZSa54K55Zyo5Lit5b+DIGV4YW1wbGU6ICAz5Liq6YGT5YW3IOWwseaYryAgIC01MCAwIDUwXG4gICAgLy8gaW5kZXjku6Uw5Li65Yid5aeLXG4gICAgc3RhdGljIGdldFBvc0luQm94KGluZGV4OiBudW1iZXIsIHRvdGFsOiBudW1iZXIsIGJnV2lkdGg6IG51bWJlciwgaXRlbVdpZHRoOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBsZXQgc3BhY2UgPSB0b3RhbCA9PSAxID8gMCA6ICgoKGJnV2lkdGggLSBpdGVtV2lkdGggKiB0b3RhbCkgLyAodG90YWwgLSAxKSArIGl0ZW1XaWR0aCkpXG4gICAgICAgIGxldCBwb3N4ID0gMFxuICAgICAgICBwb3N4ID0gLSgodG90YWwgLSAxKSAqIChzcGFjZSAvIDIpKSArIGluZGV4ICogKHNwYWNlKVxuICAgICAgICByZXR1cm4gcG9zeFxuICAgIH1cblxuICAgIC8vIHN0YXRpYyBpc01pbkdhbihzdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vICAgICBzdHIgPSBzdHIucmVwbGFjZShcIlxcXFx1MDBBMFwiLCBcIlwiKSAvL+WOu+epulxuICAgIC8vICAgICBpZiAoR2FtZUNmZy53b3Jkcy5taW5HYW4ucG9vbCAhPSBudWxsICYmIHN0ci5sZW5ndGggPiAwKSB7XG4gICAgLy8gICAgICAgICBmb3IgKGxldCBpIGluIEdhbWVDZmcud29yZHMubWluR2FuLnBvb2wpIHtcbiAgICAvLyAgICAgICAgICAgICBsZXQgX25hbWUgPSBHYW1lQ2ZnLndvcmRzLm1pbkdhbi5wb29sW2ldLm5hbWVcbiAgICAvLyAgICAgICAgICAgICBpZiAoc3RyLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihfbmFtZS50b0xvd2VyQ2FzZSgpKSAhPSAtMSkge1xuICAgIC8vICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIC8vICAgICAgICAgICAgIH1cbiAgICAvLyAgICAgICAgIH1cbiAgICAvLyAgICAgfVxuICAgIC8vICAgICByZXR1cm4gZmFsc2VcbiAgICAvLyB9XG5cbiAgICAvLyDmj5Dlj5bljIXlkKsgPCV0PuagvOW8j+eahOWtl+autVxuICAgIHN0YXRpYyBnZXRFeGVjU3RycyhzdHIpOiBzdHJpbmdbXSB7XG4gICAgICAgIC8vIHZhciByZWcgPSAvXFw8XFwlKC4rPylcXD4vZ1xuICAgICAgICB2YXIgcmVnID0gL1xcPCguKz8pXFw+L2dcbiAgICAgICAgdmFyIGxpc3QgPSBbXVxuICAgICAgICB2YXIgcmVzdWx0ID0gbnVsbFxuICAgICAgICBkbyB7XG4gICAgICAgICAgICByZXN1bHQgPSByZWcuZXhlYyhzdHIpXG4gICAgICAgICAgICByZXN1bHQgJiYgbGlzdC5wdXNoKHJlc3VsdFsxXSlcbiAgICAgICAgfSB3aGlsZSAocmVzdWx0KVxuICAgICAgICByZXR1cm4gbGlzdFxuICAgIH1cbiAgICAvLyAvLyDlsIbmloflrZfkuK3nmoQ8JXQxMjY0ODY3MzEyMz4g6L2s5YyW5Li65pe26Ze0XG4gICAgLy8gLy8g6L+U5ZueIFvop6PmnpDlkI7nmoTlrZfnrKbkuLIs5pe26Ze05oizLOaXtumXtOaIsy4uLl1cbiAgICAvLyBzdGF0aWMgdGV4dEFuYWx5c2lzKHRleHQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICAvLyAgICAgLy8gbGlzdOWIl+ihqCBbXCJ0MTIzMjM0NTE1MTRcIixcInQxNDUxMzIxNTRcIl1cbiAgICAvLyAgICAgbGV0IGxpc3QgPSBGb3JtdWxhQ29tLmdldEV4ZWNTdHJzKHRleHQpXG4gICAgLy8gICAgIGxldCB0aW1lTGlzdCA9IFtdXG4gICAgLy8gICAgIGxldCByZXN1bHQgPSBbXVxuICAgIC8vICAgICBsZXQgcmVzdWx0VGV4dCA9IHRleHRcbiAgICAvLyAgICAgbGlzdC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgIC8vICAgICAgICAgaWYgKGVsZW1lbnRbMF0gPT0gXCJ0XCIpIHtcbiAgICAvLyAgICAgICAgICAgICAvLyDljrvpmaToi7Hmlocs5L+d55WZ5pWw5a2XXG4gICAgLy8gICAgICAgICAgICAgdGltZUxpc3QucHVzaChlbGVtZW50LnJlcGxhY2UoL1teXFxkXS9nLCAnJykpXG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgIH0pO1xuICAgIC8vICAgICB0aW1lTGlzdC5mb3JFYWNoKHRpbWUgPT4ge1xuICAgIC8vICAgICAgICAgbGV0IHRhZyA9IFwiPCV0XCIgKyB0aW1lICsgXCI+XCJcbiAgICAvLyAgICAgICAgIC8vIHJlc3VsdFRleHQgPSByZXN1bHRUZXh0LnJlcGxhY2UodGFnLCBuZXcgRGF0ZSh0aW1lKS50b1RpbWVTdHJpbmcoKSlcbiAgICAvLyAgICAgICAgIHJlc3VsdFRleHQgPSByZXN1bHRUZXh0LnJlcGxhY2UodGFnLCBzaG93VGltZVlNRCh0aW1lKSlcbiAgICAvLyAgICAgfSlcbiAgICAvLyAgICAgcmVzdWx0LnB1c2gocmVzdWx0VGV4dClcbiAgICAvLyAgICAgdGltZUxpc3QuZm9yRWFjaCh0aW1lID0+IHtcbiAgICAvLyAgICAgICAgIHJlc3VsdC5wdXNoKHRpbWUpXG4gICAgLy8gICAgIH0pO1xuICAgIC8vICAgICByZXR1cm4gcmVzdWx0XG4gICAgLy8gfVxuICAgIC8qKiDorqnliqjnlLvlnKjmjIflrprljLrpl7TlhoXlvqrnjq8gKi9cbiAgICBzdGF0aWMgbG9vcEF0RnJhbWUodGU6IHNwLnNwaW5lLlRyYWNrRW50cnksIHNGcmFtZTogbnVtYmVyLCBlRnJhbWU6IG51bWJlcikge1xuICAgICAgICBpZiAodGUuYW5pbWF0aW9uU3RhcnQgPT09IDApIHtcbiAgICAgICAgICAgIHRlLmFuaW1hdGlvblN0YXJ0ID0gc0ZyYW1lIC8gMzA7IC8vIDMw5pivU3BpbmXliqjnlLvnmoTluKfnjodcbiAgICAgICAgICAgIHRlLmFuaW1hdGlvbkVuZCA9IGVGcmFtZSAvIDMwO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICog5YGc5q2i5Zyo5oyH5a6a5bin44CCMeaYr+W8gOWni++8jC0x5piv5pyA5ZCOXG4gICAgKiBAcGFyYW0gZnJhbWUg5bin5pWwXG4gICAgKi9cbiAgICBzdGF0aWMgc3RvcEF0RnJhbWUoc3BpbmVDb21wOiBzcC5Ta2VsZXRvbiwgZnJhbWU6IG51bWJlcikge1xuICAgICAgICBjb25zdCB0ZSA9IHNwaW5lQ29tcC5nZXRDdXJyZW50KDApIGFzIHNwLnNwaW5lLlRyYWNrRW50cnk7XG4gICAgICAgIC8vIOeul+WHuuW4p+WvueW6lOeahOaXtumXtFxuICAgICAgICBsZXQgdGltZTtcbiAgICAgICAgaWYgKGZyYW1lID09PSAtMSkge1xuICAgICAgICAgICAgdGltZSA9IHRlLmFuaW1hdGlvbi5kdXJhdGlvbjsgLy8g5pyA5ZCO5LiA5binXG4gICAgICAgIH0gZWxzZSBpZiAoZnJhbWUgPiAxKSB7XG4gICAgICAgICAgICB0aW1lID0gKGZyYW1lIC0gMSkgLyAzMDsgIC8vIOagueaNruW4p+eOh+eul+WHuuWvueW6lOaXtumXtO+8jHNwaW5l5bin546H5pivMzBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRpbWUgPSAwOyAvLyDpppbluKdcbiAgICAgICAgfVxuICAgICAgICAvLyDlr7l0aW1l5L2c6ZmQ5Yi2XG4gICAgICAgIGlmICh0aW1lIDwgMCkgdGltZSA9IDA7XG4gICAgICAgIGlmICh0aW1lID49IHRlLmFuaW1hdGlvbi5kdXJhdGlvbikgdGltZSA9IHRlLmFuaW1hdGlvbi5kdXJhdGlvbiAtIDAuMDE7IC8vIOWkqueyvuehrueahOivne+8jOWKqOeUu+S8muWBnOWcqOmmluW4p++8jOaJgOS7peimgeWHj+S4gOeCuVxuXG4gICAgICAgIHRlLnRpbWVTY2FsZSA9IDA7IC8vIOiuqeWKqOeUu+WBnOatolxuICAgICAgICB0ZS50cmFja1RpbWUgPSB0aW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOaKiuacjeWKoeWZqOaXtumXtOaIsyDmlLnkuLrmnKzlnLDml7bpl7TmiLNcbiAgICAgKiBAcGFyYW0gdGltZSDpnIDopoHovazmjaLnmoTml7bpl7TmiLNcbiAgICAgKiBAcGFyYW0gdXRjTWluIOacjeWKoeWZqOaXtuWMuijmjInliIbpkp/orqEpXG4gICAgICAgIC8vIC0zMDAg6KW/NeWMuue+juWbvSAtNSo2MCAgR01ULTVcbiAgICAgICAgLy8gMFxuICAgICAgICAvLyA0ODAg5LicOOWMuuWMl+S6rCA4KjYwXG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0VXRjVGltZSh0aW1lOiBudW1iZXIsIHV0Y0hvdXI6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGxldCB1dGNNaW4gPSB1dGNIb3VyICogNjBcbiAgICAgICAgLy/mnKzlnLDml7bpl7TnsbtcbiAgICAgICAgbGV0IGxvY2FsdGltZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgIC8v5pys5Zyw5pe25Yy66ZKI5a+55qCH5YeG5pe25Yy655qE5YGP56e7XG4gICAgICAgIGxldCBweW0gPSBsb2NhbHRpbWUuZ2V0VGltZXpvbmVPZmZzZXQoKVxuICAgICAgICAvL+aXtumXtOi9rOaNouS4uuaMh+WumuaXtuWMuuaXtumXtFxuICAgICAgICB0aW1lICs9IChweW0gKyB1dGNNaW4pICogNjBcbiAgICAgICAgcmV0dXJuIHRpbWVcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0UmFuZG9tVGFnKCk6IHN0cmluZyB7XG4gICAgICAgIGxldCBvdXRTdHJpbmc6IHN0cmluZyA9ICcnO1xuICAgICAgICBsZXQgaW5PcHRpb25zOiBzdHJpbmcgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5JztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7XG4gICAgICAgICAgICBvdXRTdHJpbmcgKz0gaW5PcHRpb25zLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBpbk9wdGlvbnMubGVuZ3RoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dFN0cmluZztcbiAgICB9XG4gICAgc3RhdGljIGdldERpc3RhbmNlKHgxOiBudW1iZXIsIHkxOiBudW1iZXIsIHgyOiBudW1iZXIsIHkyOiBudW1iZXIpIHtcbiAgICAgICAgdmFyIGEgPSB4MiAtIHgxXG4gICAgICAgIHZhciBiID0geTIgLSB5MVxuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KGEgKiBhICsgYiAqIGIpXG4gICAgfVxuICAgIC8qKlxuICAgICAqIOagueaNrumUmueCuemHjeaWsOiuoeeul+S4reW/g+eCueS4lueVjOWdkOagh+WdkOagh1xuICAgICAqIEBwYXJhbSBwb3Mg6ZSa54K555qE5LiW55WM5Z2Q5qCHXG4gICAgICogQHBhcmFtIG5vZGUg6IqC54K5XG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgc3RhdGljIGZpeEFuY2hvcihwb3M6IGNjLlZlYzIsIG5vZGU6IGNjLk5vZGUpOiBjYy5WZWMyIHtcbiAgICAgICAgbGV0IHggPSBwb3MueCAtIG5vZGUuYW5jaG9yWCAqIG5vZGUud2lkdGggKyBub2RlLndpZHRoIC8gMlxuICAgICAgICBsZXQgeSA9IHBvcy55IC0gbm9kZS5hbmNob3JZICogbm9kZS5oZWlnaHQgKyBub2RlLmhlaWdodCAvIDJcbiAgICAgICAgcmV0dXJuIG5ldyBjYy5WZWMyKHgsIHkpXG4gICAgfVxuICAgIC8qKlxuICAgICAqIOiOt+W+l+afkOS4quiKgueCueS4reW/g+eCueeahOS4lueVjOWdkOagh1xuICAgICAqIEBwYXJhbSBub2RlIFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRXb3JsZENlbnRlclBvcyhub2RlOiBjYy5Ob2RlKTogY2MuVmVjMiB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpeEFuY2hvcih0aGlzLmdldFdvcmxkUG9zKG5vZGUpLCBub2RlKVxuICAgIH1cbiAgICBzdGF0aWMgZ2V0V29ybGRQb3Mobm9kZTogY2MuTm9kZSk6IGNjLlZlYzIge1xuICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KG5vZGUpKSByZXR1cm4gY2MudjIoMCwgMCk7XG4gICAgICAgIHJldHVybiBub2RlLmNvbnZlcnRUb1dvcmxkU3BhY2VBUihjYy5WZWMyLlpFUk8pXG4gICAgfVxuICAgIHN0YXRpYyBzZXRQb3NCeVdvcmxkUG9zKG5vZGU6IGNjLk5vZGUsIHBvczogY2MuVmVjMikge1xuICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KG5vZGUpKSByZXR1cm47XG4gICAgICAgIGxldCBfcG9zID0gbm9kZS5wYXJlbnQuY29udmVydFRvTm9kZVNwYWNlQVIocG9zKVxuICAgICAgICBub2RlLnggPSBfcG9zLnhcbiAgICAgICAgbm9kZS55ID0gX3Bvcy55XG4gICAgfVxuICAgIC8v6I635Y+Wbm9kZeS9jeS6jnRhcmdldOeahOWdkOagh+ebuOWvueWdkOagh1xuICAgIHN0YXRpYyBnZXRQb3NpdGlvbkluVmlldyhub2RlOiBjYy5Ob2RlLCB0YXJnZXQ6IGNjLk5vZGUpOiB7IHg6IG51bWJlciwgeTogbnVtYmVyIH0ge1xuICAgICAgICBsZXQgd29ybGRQb3MgPSBub2RlLnBhcmVudC5jb252ZXJ0VG9Xb3JsZFNwYWNlQVIobm9kZS5wb3NpdGlvbik7XG4gICAgICAgIGxldCB2aWV3UG9zID0gdGFyZ2V0LmNvbnZlcnRUb05vZGVTcGFjZUFSKHdvcmxkUG9zKTtcbiAgICAgICAgcmV0dXJuIHZpZXdQb3M7XG4gICAgfVxuXG4gICAgLy8g6I635Y+W546p5a625pyA5ZCO5LiA5qyh55m75b2V5pe26Ze0XG4gICAgc3RhdGljIGdldFVzZXJTdGF0ZShsYXN0YWRvazogbnVtYmVyLCBzZXZUaW1lOiBudW1iZXIpIHtcbiAgICAgICAgbGV0IHVzZXJTdGF0ZTogc3RyaW5nID0gJydcbiAgICAgICAgbGV0IHRpbWUgPSBNYXRoLmZsb29yKChzZXZUaW1lIC0gbGFzdGFkb2spIC8gNjApXG4gICAgICAgIGlmICh0aW1lIDwgNikge1xuICAgICAgICAgICAgdXNlclN0YXRlID0gSTE4bi5nZXRJMThuVGV4dCgnY29tbW9uX3VzZXJMb2dpblN0YXRlXzEnKVxuICAgICAgICB9IGVsc2UgaWYgKHRpbWUgPCA2MCkge1xuICAgICAgICAgICAgdXNlclN0YXRlID0gSTE4bi5nZXRJMThuVGV4dCgnY29tbW9uX3RpbWV3b3JkXzEnLCB0aW1lKVxuICAgICAgICB9IGVsc2UgaWYgKHRpbWUgPCAyNCAqIDYwKSB7XG4gICAgICAgICAgICB1c2VyU3RhdGUgPSBJMThuLmdldEkxOG5UZXh0KCdjb21tb25fdGltZXdvcmRfMicsIE1hdGguZmxvb3IodGltZSAvIDYwKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVzZXJTdGF0ZSA9IEkxOG4uZ2V0STE4blRleHQoJ2NvbW1vbl90aW1ld29yZF8zJywgTWF0aC5mbG9vcigodGltZSAvIDYwKSAvIDI0KSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1c2VyU3RhdGVcbiAgICB9XG4gICAgLy8g5bey55+l5ZyG5b+DLOWNiuW+hCzop5LluqYs5rGC5Z2Q5qCHXG4gICAgc3RhdGljIGdldFBvc2J5QW5nbGUoY2VudGVyWDogbnVtYmVyLCBjZW50ZXJZOiBudW1iZXIsIHJhbmdlOiBudW1iZXIsIGFuZ2xlOiBudW1iZXIpOiB7IHg6IG51bWJlciwgeTogbnVtYmVyIH0ge1xuICAgICAgICBsZXQgcmFkaWFucyA9IHRoaXMuZ2V0UmFkaWFuc0J5QW5nbGUoYW5nbGUpXG4gICAgICAgIGxldCBkeCA9IE1hdGguY29zKHJhZGlhbnMpICogcmFuZ2VcbiAgICAgICAgbGV0IGR5ID0gTWF0aC5zaW4ocmFkaWFucykgKiByYW5nZVxuICAgICAgICByZXR1cm4geyB4OiBjZW50ZXJYICsgZHgsIHk6IGNlbnRlclkgKyBkeSB9XG4gICAgfVxuICAgIC8vIOW3suefpeWdkOagh+axguinkuW6plxuICAgIHN0YXRpYyBnZXRBbmdsZUJ5UG9zKHgxOiBudW1iZXIsIHkxOiBudW1iZXIsIHgyOiBudW1iZXIsIHkyOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBpZiAoeDEgPT0geDIgJiYgeTEgPT0geTIpIHtcbiAgICAgICAgICAgIHJldHVybiAwXG4gICAgICAgIH1cbiAgICAgICAgbGV0IGRlZ3JlZSA9IE1hdGguYXRhbjIoeTIgLSB5MSwgeDIgLSB4MSlcbiAgICAgICAgcmV0dXJuIGRlZ3JlZSAqIDE4MCAvIE1hdGguUElcbiAgICB9XG4gICAgLy/msYLkuKTkuKrngrnnmoTop5LluqZcbiAgICBzdGF0aWMgZ2V0QW5nbGUoc3RhcnRQb3M6IGNjLlZlYzIsIGVuZFBvczogY2MuVmVjMik6IG51bWJlciB7XG4gICAgICAgIC8v6K6h566X5Ye65pyd5ZCRXG4gICAgICAgIHZhciBkeCA9IGVuZFBvcy54IC0gc3RhcnRQb3MueDtcbiAgICAgICAgdmFyIGR5ID0gZW5kUG9zLnkgLSBzdGFydFBvcy55O1xuICAgICAgICB2YXIgZGlyID0gY2MudjIoZHgsIGR5KTtcblxuICAgICAgICAvL+agueaNruacneWQkeiuoeeul+WHuuWkueinkuW8p+W6plxuICAgICAgICB2YXIgYW5nbGUgPSBkaXIuc2lnbkFuZ2xlKGNjLnYyKDEsIDApKTtcblxuICAgICAgICAvL+WwhuW8p+W6pui9rOaNouS4uuasp+aLieinklxuICAgICAgICB2YXIgZGVncmVlID0gYW5nbGUgLyBNYXRoLlBJICogMTgwO1xuXG4gICAgICAgIHJldHVybiAtZGVncmVlXG4gICAgfVxuICAgIC8vIOagueaNruinkuW6puiOt+WPluW8p+W6plxuICAgIHN0YXRpYyBnZXRSYWRpYW5zQnlBbmdsZShhbmdsZTogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBhbmdsZSAvIDE4MCAqIE1hdGguUElcbiAgICB9XG4gICAgLy8g5qC55o2u5byn5bqm6I635Y+W6KeS5bqmXG4gICAgc3RhdGljIGdldEFuZ2xlQnlSYWRpYW5zKHJhZGlhbnM6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gcmFkaWFucyAqIDE4MCAvIE1hdGguUElcbiAgICB9XG5cbiAgICBzdGF0aWMgb2JqMkFycmF5PFQ+KG9iamVjdDogeyBbczogc3RyaW5nXTogVCB9KTogVFtdIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvYmplY3QgIT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMob2JqZWN0KVxuICAgICAgICAvLyBsZXQgYXJyYXkgPSBbXVxuICAgICAgICAvLyBmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgLy8gICAgIGFycmF5LnB1c2gob2JqZWN0W2tleV0pXG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gcmV0dXJuIGFycmF5XG4gICAgfVxuXG4gICAgc3RhdGljIHN0ckRMZW5ndGgoc3RyOiBzdHJpbmcpOiBudW1iZXIge1xuICAgICAgICBsZXQgclN0ciA9IHN0ci5yZXBsYWNlKC9bXlxceDAwLVxceGZmXS9nLCAnJykvL+WPjOWtl+iKguWtl+espu+8mijljIXmi6zmsYnlrZflnKjlhoXvvIzlj6/ku6XnlKjmnaXorqHnrpflrZfnrKbkuLLnmoTplb/luqYo5LiA5Liq5Y+M5a2X6IqC5a2X56ym6ZW/5bqm6K6hMu+8jEFTQ0lJ5a2X56ym6K6hMSkpXG4gICAgICAgIHJldHVybiBzdHIubGVuZ3RoIC0gclN0ci5sZW5ndGhcbiAgICB9XG5cbiAgICAvLyDpppblrZfmr43lpKflhplcbiAgICBzdGF0aWMgZmlyc3RVcENhc2Uoc3RyOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHN0clswXS50b1VwcGVyQ2FzZSgpICsgc3RyLnN1YnN0cmluZygxKVxuICAgIH1cbiAgICAvLyDliKTmlq3lrZfnrKbplb/luqZcbiAgICBzdGF0aWMgZ2V0U3RyQ2hhcmFjdGVyTGVuZ3RoKHN0cik6IG51bWJlciB7XG4gICAgICAgIGxldCBwYXR0ZXJuQ2hpbmVzZSA9IG5ldyBSZWdFeHAoXCJbXFx1NEUwMC1cXHU5RkE1XStcIik7IC8vIOS4reaWh1xuICAgICAgICBsZXQgbGVuZyA9IDBcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHN0ci5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGlmIChwYXR0ZXJuQ2hpbmVzZS50ZXN0KHN0cltpbmRleF0pKSB7XG4gICAgICAgICAgICAgICAgbGVuZyArPSAyXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxlbmcgKz0gMVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsZW5nXG4gICAgfVxuXG4gICAgLy/moLnmja7ntKLlvJXojrflj5blvZPliY3ooYzliJfmlbBcbiAgICAvLyBpbmRleCDlvZPliY3ntKLlvJXlgLzvvIjku44w5byA5aeL77yJICAgZWxlbWVudHNQZXJSb3cgIOS4gOihjOacieWHoOS4qlxuICAgIHN0YXRpYyBnZXRSb3dBbmRDb2x1bW5Gcm9tSW5kZXgoaW5kZXg6IG51bWJlciwgY29sdW1uQ291bnQ6IG51bWJlcikge1xuICAgICAgICBpZiAoY29sdW1uQ291bnQgPCAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbHVtbiBjb3VudCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlci4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByb3dJbmRleCA9IE1hdGguZmxvb3IoaW5kZXggLyBjb2x1bW5Db3VudCk7XG4gICAgICAgIGNvbnN0IGNvbHVtbkluZGV4ID0gaW5kZXggJSBjb2x1bW5Db3VudDtcbiAgICAgICAgcmV0dXJuIHsgcm93SW5kZXgsIGNvbHVtbkluZGV4IH07XG4gICAgfVxuXG4gICAgLy8g5a+55pWw57uE5oyJ5pWw6YeP5YiG57uEXG4gICAgc3RhdGljIGdyb3VwVHdvQnlUd288VD4oaW5wdXQ6IFRbXSwgY291bnQ6IG51bWJlcik6IFRbXVtdIHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBUW11bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSArPSBjb3VudCkge1xuICAgICAgICAgICAgaWYgKGdhbWVNZXRob2QuaXNFbXB0eShpbnB1dFtpXSkgfHwgZ2FtZU1ldGhvZC5pc0VtcHR5KGlucHV0W2kgKyAxXSkpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwi6K+l5pWw57uE5YiG6YWN5LiN6Laz77yM5qOA5p+l5pWw57uE6ZW/5bqmXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaChbaW5wdXRbaV0sIGlucHV0W2kgKyAxXV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuXG5cbi8vIOmYv+aLieS8r+aVsOWtl+i9rOS4reaWh1xuZXhwb3J0IGZ1bmN0aW9uIGNoaW5lc2VCeU51bWJlcihudW1iZXI6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgY2hpbmVzZU51bWJlcnMgPSBbJ+mbticsICfkuIAnLCAn5LqMJywgJ+S4iScsICflm5snLCAn5LqUJywgJ+WFrScsICfkuIMnLCAn5YWrJywgJ+S5nScsICfljYEnXTtcbiAgICBjb25zdCBjaGluZXNlVW5pdHMgPSBbJycsICfljYEnLCAn55m+JywgJ+WNgycsICfkuIcnXTtcbiAgICBpZiAobnVtYmVyIDw9IDEwKSB7XG4gICAgICAgIHJldHVybiBjaGluZXNlTnVtYmVyc1tudW1iZXJdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG51bWJlclN0cmluZyA9IG51bWJlci50b1N0cmluZygpO1xuICAgICAgICBsZXQgcmVzdWx0ID0gJyAnO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtYmVyU3RyaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBkaWdpdCA9IHBhcnNlSW50KG51bWJlclN0cmluZ1tpXSk7XG5cbiAgICAgICAgICAgIGlmIChkaWdpdCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGlmIChudW1iZXJTdHJpbmcubGVuZ3RoID09PSAyICYmIGkgPT09IDAgJiYgZGlnaXQgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGNoaW5lc2VVbml0c1tudW1iZXJTdHJpbmcubGVuZ3RoIC0gaSAtIDFdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBjaGluZXNlTnVtYmVyc1tkaWdpdF0gKyBjaGluZXNlVW5pdHNbbnVtYmVyU3RyaW5nLmxlbmd0aCAtIGkgLSAxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChpID09PSAwIHx8IG51bWJlclN0cmluZ1tpIC0gMV0gIT09ICcwJykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gY2hpbmVzZU51bWJlcnNbZGlnaXRdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbiJdfQ==
|