|
(function() {
|
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
|
var __module = nodeEnv ? module : {exports:{}};
|
var __filename = 'preview-scripts/assets/Scripts/mod/action/action_model.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, '3f27dqUQapJ4LUEFzPeFEif', 'action_model');
|
// Scripts/mod/action/action_model.js
|
|
"use strict";
|
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
// --------------------------------------------------------------------
|
// @author: xxx@syg.com(必填, 创建模块的人员)
|
// @description:
|
// 这里填写详细说明,主要填写该模块的功能简要
|
// <br/>Create: 2019-03-02 16:49:03
|
// --------------------------------------------------------------------
|
var MainuiController = require("mainui_controller");
|
|
var MainuiConst = require("mainui_const");
|
|
var ActionEvent = require("action_event");
|
|
var ActionConst = require("action_const");
|
|
var ActionModel = cc.Class({
|
"extends": BaseClass,
|
ctor: function ctor() {},
|
properties: {},
|
initConfig: function initConfig() {
|
// -- 基金红点数据
|
this.fund_red_list = {};
|
},
|
//------------------@ 基金活动相关
|
// -- 开启中的基金活动id
|
setOpenFundIds: function setOpenFundIds(id_list) {
|
this.fund_id_list = id_list || [];
|
this.checkFundRedStatus();
|
},
|
getOpenFundIds: function getOpenFundIds() {
|
return this.fund_id_list || [];
|
},
|
// -- 设置基金的数据
|
setFundSrvData: function setFundSrvData(data) {
|
this.fund_datas = this.fund_datas || {};
|
|
if (data && data.id) {
|
this.fund_datas[data.id] = data;
|
this.updateFundStatus(data.id, data.status);
|
}
|
},
|
// -- 获取基金数据
|
getFundSrvDataById: function getFundSrvDataById(id) {
|
this.fund_datas = this.fund_datas || {};
|
return this.fund_datas[id] || {};
|
},
|
updateFundStatus: function updateFundStatus(id, status) {
|
this.fund_id_list = this.fund_id_list || [];
|
|
for (var k = 0; k < this.fund_id_list.length; ++k) {
|
var v = this.fund_id_list[k];
|
|
if (v.id == id) {
|
v.status = status;
|
break;
|
}
|
}
|
|
this.checkFundRedStatus();
|
},
|
//检查超值基金红点
|
checkFundRedStatus: function checkFundRedStatus() {
|
this.fund_id_list = this.fund_id_list || [];
|
|
for (var k = 0; k < this.fund_id_list.length; ++k) {
|
var v = this.fund_id_list[k];
|
|
if (v.id == ActionConst.FundType.type_one) {
|
this.updateFundRedStatus(ActionConst.FundRedIndex.fund_get_one, v.status == 1);
|
this.updateFundRedStatus(ActionConst.FundRedIndex.fund_buy_one, v.status == 0);
|
} else if (v.id == ActionConst.FundType.type_two) {
|
this.updateFundRedStatus(ActionConst.FundRedIndex.fund_get_two, v.status == 1);
|
this.updateFundRedStatus(ActionConst.FundRedIndex.fund_buy_two, v.status == 0);
|
}
|
}
|
},
|
// -- 更新基金红点数据
|
updateFundRedStatus: function updateFundRedStatus(bid, status) {
|
var _status = this.fund_red_list[bid];
|
if (_status == status) return; // -- 购买的红点只有登陆时才显示,点击之后消失,之后不再显示
|
|
if ((bid == ActionConst.FundRedIndex.fund_buy_one || bid == ActionConst.FundRedIndex.fund_buy_two) && _status == false) {
|
return;
|
}
|
|
this.fund_red_list[bid] = status;
|
var red_status = false;
|
|
for (var k in this.fund_red_list) {
|
var v = this.fund_red_list[k];
|
|
if (v == true) {
|
red_status = true;
|
break;
|
}
|
}
|
|
MainuiController.getInstance().setFunctionTipsStatus(MainuiConst.icon.fund, red_status);
|
gcore.GlobalEvent.fire(ActionEvent.UPDATA_FUND_RED_STATUS_EVENT);
|
},
|
updateSevenLoginData: function updateSevenLoginData(data) {
|
this.seven_login_data = data;
|
},
|
getSevenLoginData: function getSevenLoginData() {
|
return this.seven_login_data;
|
},
|
// --desc:获取当前可领取7天登录的最大天数
|
getMaxSevenDay: function getMaxSevenDay() {
|
if (this.seven_login_data == null || this.seven_login_data.status_list == null) return;
|
var status_list = this.seven_login_data.status_list;
|
status_list.sort(function (a, b) {
|
return a.day - b.day;
|
});
|
var day = null;
|
|
for (var i in status_list) {
|
if (status_list[i].status == 2) {
|
day = status_list[i];
|
break;
|
}
|
}
|
|
if (day == null) {
|
day = status_list[status_list.length];
|
}
|
|
return day;
|
},
|
setFirstBtnStatus: function setFirstBtnStatus(data) {
|
this.firstBtnStatus = {};
|
|
for (var i = 0; i < data.length; ++i) {
|
var v = data[i];
|
this.firstBtnStatus[v.id] = v.status;
|
}
|
},
|
getFirstBtnStatus: function getFirstBtnStatus(index) {
|
if (!this.firstBtnStatus) return;
|
return this.firstBtnStatus[index] || 0;
|
},
|
// 获取七日目标的周期数
|
setSevenGoldPeriod: function setSevenGoldPeriod(period) {
|
this.sevenPeriod = period;
|
},
|
getSevenGoldPeriod: function getSevenGoldPeriod() {
|
return this.sevenPeriod;
|
},
|
// 七天目标检查红点 --当前天数以下的
|
checkRedPoint: function checkRedPoint(day) {
|
if (day < 1 || day > 7) return;
|
day = day || 1; // 福利
|
|
this.welfareRetPoint = [];
|
|
for (var i = 1; i <= day; i++) {
|
var welfare = this.getSevenGoalWelfareList(i);
|
this.welfareRetPoint[i] = false;
|
|
for (var k in welfare) {
|
if (welfare[k].status == 1) {
|
this.welfareRetPoint[i] = true;
|
break;
|
}
|
}
|
} // 每日目标
|
|
|
this.growRetPoint = [];
|
|
for (var i = 1; i <= day; i++) {
|
var grow = this.getServerGrowListData(i - 1);
|
this.growRetPoint[i] = false;
|
|
for (var k in grow) {
|
if (grow[k].status == 1) {
|
this.growRetPoint[i] = true;
|
break;
|
}
|
}
|
} // 超值礼包
|
|
|
this.giftRetPoint = [];
|
|
for (var i = 1; i <= day; i++) {
|
var grow = this.getServerGiftListData(i - 1);
|
this.giftRetPoint[i] = false;
|
|
for (var k in grow) {
|
if (grow[k].status == 1) {
|
this.giftRetPoint[i] = true;
|
break;
|
}
|
}
|
}
|
|
this.halfRedPoint = []; // 0、还有领取 1、已领取
|
|
for (var i = 1; i <= day; i++) {
|
var half = this.getHalfGiftList(i);
|
this.halfRedPoint[i] = false;
|
|
for (var k in half) {
|
if (k == 0 && half[k].status == 0) {
|
this.halfRedPoint[i] = true;
|
break;
|
}
|
}
|
} // 宝箱
|
|
|
this.boxRedPoint = [];
|
var box = this.getSevenGoalBoxList();
|
|
for (var i in box) {
|
this.boxRedPoint[i] = false;
|
|
if (box[i].status == 1) {
|
this.boxRedPoint[i] = true;
|
}
|
}
|
|
var redStatus = false;
|
var redStatus1 = false;
|
var redStatus2 = false;
|
var redStatus3 = false;
|
var redStatus4 = false;
|
var redStatus5 = false;
|
|
for (var i in this.welfareRetPoint) {
|
if (this.welfareRetPoint[i] == true) {
|
redStatus1 = true;
|
break;
|
}
|
}
|
|
for (var i in this.growRetPoint) {
|
if (this.growRetPoint[i] == true) {
|
redStatus2 = true;
|
break;
|
}
|
}
|
|
for (var i in this.giftRetPoint) {
|
if (this.giftRetPoint[i] == true) {
|
redStatus3 = true;
|
break;
|
}
|
}
|
|
for (var i in this.halfRedPoint) {
|
if (this.halfRedPoint[i] == true) {
|
redStatus5 = true;
|
break;
|
}
|
}
|
|
for (var i in this.boxRedPoint) {
|
if (this.boxRedPoint[i] == true) {
|
redStatus4 = true;
|
break;
|
}
|
}
|
|
redStatus = redStatus1 || redStatus2 || redStatus3 || redStatus4 || redStatus5;
|
var icon_id = MainuiConst.icon.seven_goal;
|
|
if (this.getSevenGoldPeriod() == 1) {
|
icon_id = MainuiConst.icon.seven_goal;
|
} else if (this.getSevenGoldPeriod() == 2) {
|
icon_id = MainuiConst.icon.seven_goal1;
|
} else if (this.getSevenGoldPeriod() == 3) {
|
icon_id = MainuiConst.icon.seven_goal2;
|
} else {
|
icon_id = MainuiConst.icon.seven_goal3;
|
}
|
|
MainuiController.getInstance().setFunctionTipsStatus(icon_id, redStatus);
|
},
|
// 红点状态
|
getRedPointWelfareStatus: function getRedPointWelfareStatus(day) {
|
if (!this.welfareRetPoint) return;
|
var status = false;
|
status = this.welfareRetPoint[day];
|
return status;
|
},
|
// 更新
|
updataRedPointWelfareStatus: function updataRedPointWelfareStatus(day, status) {
|
if (!this.welfareRetPoint) return;
|
this.welfareRetPoint[day] = status;
|
},
|
getRedPointGrowStatus: function getRedPointGrowStatus(day) {
|
if (!this.growRetPoint) return;
|
var status = false;
|
status = this.growRetPoint[day];
|
return status;
|
},
|
// 更新
|
updataRedPointGrowStatus: function updataRedPointGrowStatus(day, status) {
|
if (!this.growRetPoint) return;
|
this.growRetPoint[day] = status;
|
},
|
getRedPointGiftStatus: function getRedPointGiftStatus(day) {
|
if (!this.giftRetPoint) return;
|
var status = false;
|
status = this.giftRetPoint[day];
|
return status;
|
},
|
// 更新
|
updataRedPointGiftStatus: function updataRedPointGiftStatus(day, status) {
|
if (!this.giftRetPoint) return;
|
this.giftRetPoint[day] = status;
|
},
|
// 福利礼包
|
getRedPointHalfStatus: function getRedPointHalfStatus(day) {
|
if (!this.halfRedPoint) return;
|
var status = false;
|
status = this.halfRedPoint[day];
|
return status;
|
},
|
// 更新
|
updataRedPointHalfStatus: function updataRedPointHalfStatus(day, status) {
|
if (!this.halfRedPoint) return;
|
this.halfRedPoint[day] = status;
|
},
|
getRedPointBoxStatus: function getRedPointBoxStatus(index) {
|
if (!this.boxRedPoint) return;
|
var status = false;
|
status = this.boxRedPoint[index];
|
return status;
|
},
|
// 更新
|
updataRedPointBoxStatus: function updataRedPointBoxStatus(index, status) {
|
if (!this.boxRedPoint) return;
|
this.boxRedPoint[index] = status;
|
},
|
// 七天目标*********** start *****
|
initSevenWalfare: function initSevenWalfare(index) {
|
this.setWalfareData(index);
|
this.setWalfareGrowUpData(index);
|
this.setHalfGiftData(index);
|
this.setBoxRewardData(index);
|
},
|
// 宝箱
|
setBoxRewardData: function setBoxRewardData(index) {
|
var data = Config.day_goals_data.data_all_target[index];
|
this.boxRewardData = [];
|
|
for (var i in data) {
|
this.boxRewardData.push(data[i][0]);
|
}
|
|
this.boxRewardData.sort(function (a, b) {
|
return a.id - b.id;
|
});
|
},
|
getBoxRewardData: function getBoxRewardData() {
|
return this.boxRewardData || [];
|
},
|
// 福利
|
setWalfareData: function setWalfareData(index) {
|
var data = Config.day_goals_data.data_welfarecollection[index];
|
this.welfareData = Utils.deepCopy(data);
|
},
|
// 成长目标
|
setWalfareGrowUpData: function setWalfareGrowUpData(index) {
|
var data = Config.day_goals_data.data_growthtarget[index];
|
this.welfareGrowData = [];
|
this.welfareGiftData = [];
|
|
for (var i in data) {
|
var tab = [];
|
var tab1 = [];
|
|
for (var k in data[i]) {
|
if (data[i][k].target_type == 1) {
|
tab.push(data[i][k]);
|
} else if (data[i][k].target_type == 2) {
|
tab1.push(data[i][k]);
|
}
|
}
|
|
this.welfareGrowData.push(tab);
|
this.welfareGiftData.push(tab1);
|
}
|
},
|
// 福利礼包
|
setHalfGiftData: function setHalfGiftData(index) {
|
var data = Config.day_goals_data.data_halfdiscount[index];
|
this.walfareHalfData = [];
|
|
for (var i = 1; i <= 7; i++) {
|
this.walfareHalfData[i] = [];
|
}
|
|
for (var i in data) {
|
this.walfareHalfData[data[i][0].day].push(data[i][0]);
|
}
|
|
for (var i = 1; i <= 7; i++) {
|
this.walfareHalfData[i].sort(function (a, b) {
|
return a.id - b.id;
|
});
|
}
|
},
|
getWalfareData: function getWalfareData(day) {
|
if (!this.welfareData) return;
|
return this.welfareData[day] || [];
|
},
|
getWalfareGrowUpData: function getWalfareGrowUpData(day) {
|
if (!this.welfareGrowData) return;
|
return this.welfareGrowData[day] || [];
|
},
|
getWelfareGiftData: function getWelfareGiftData(day) {
|
if (!this.welfareGiftData) return;
|
return this.welfareGiftData[day] || [];
|
},
|
getWelfareHalfData: function getWelfareHalfData(day) {
|
if (this.walfareHalfData && this.walfareHalfData[day]) {
|
return this.walfareHalfData[day] || [];
|
}
|
},
|
// *********** 协议相关*********
|
// 七天目标的福利领取
|
setSevenGoalWelfareList: function setSevenGoalWelfareList(data) {
|
this.welfareList = [];
|
|
for (var i = 1; i <= 7; i++) {
|
this.welfareList[i] = [];
|
}
|
|
for (var i in data) {
|
this.welfareList[data[i].day].push(data[i]);
|
}
|
},
|
getSevenGoalWelfareList: function getSevenGoalWelfareList(day) {
|
if (!this.welfareList) return;
|
return this.welfareList[day] || [];
|
},
|
// 更新数据
|
updataGoalWelfareList: function updataGoalWelfareList(day, index, status) {
|
this.welfareList[day][index].status = status;
|
},
|
// 七天目标的成长目标
|
setSevenGoalGrowList: function setSevenGoalGrowList(data) {
|
var grow_list = [];
|
|
for (var i = 1; i <= 7; i++) {
|
grow_list[i] = [];
|
}
|
|
for (var i in data) {
|
grow_list[data[i].day].push(data[i]);
|
}
|
|
this.serverGrowListData = [];
|
this.serverGiftListData = [];
|
|
for (var i in grow_list) {
|
var tab = [];
|
var tab1 = [];
|
|
for (var k in grow_list[i]) {
|
if (grow_list[i][k].target_type == 1) {
|
tab.push(grow_list[i][k]);
|
} else if (grow_list[i][k].target_type == 2) {
|
tab1.push(grow_list[i][k]);
|
}
|
}
|
|
this.serverGrowListData.push(tab);
|
this.serverGiftListData.push(tab1);
|
}
|
},
|
getServerGrowListData: function getServerGrowListData(day) {
|
if (this.serverGrowListData && this.serverGrowListData[day]) {
|
return this.serverGrowListData[day] || [];
|
}
|
|
return [];
|
},
|
// 更新数据
|
updataGrowListData: function updataGrowListData(day, index, status) {
|
this.serverGrowListData[day][index].status = status;
|
},
|
getServerGiftListData: function getServerGiftListData(day) {
|
if (!this.serverGiftListData) return;
|
return this.serverGiftListData[day] || [];
|
},
|
// 更新数据
|
updataGiftListData: function updataGiftListData(day, index, status) {
|
this.serverGiftListData[day][index].status = status;
|
},
|
// 福利礼包礼包购买
|
setHalfGiftList: function setHalfGiftList(data) {
|
this.halfGiftList = [];
|
|
for (var i = 1; i <= 7; i++) {
|
this.halfGiftList[i] = [];
|
}
|
|
for (var i = 1; i <= 7; i++) {
|
var half_list = this.getWelfareHalfData(i);
|
|
for (var k in half_list) {
|
for (var b in data) {
|
if (half_list[k].id == data[b].day) {
|
this.halfGiftList[i].push(data[b]);
|
}
|
}
|
}
|
}
|
},
|
getHalfGiftList: function getHalfGiftList(day) {
|
if (this.halfGiftList && this.halfGiftList[day]) {
|
return this.halfGiftList[day] || [];
|
}
|
},
|
// 更新数据
|
updataHalfListData: function updataHalfListData(day, index, status) {
|
this.halfGiftList[day][index].status = status;
|
},
|
// 活跃宝箱
|
setSevenGoalBoxList: function setSevenGoalBoxList(data) {
|
this.boxList = data;
|
},
|
getSevenGoalBoxList: function getSevenGoalBoxList() {
|
if (!this.boxList) return;
|
this.boxList.sort(Utils.tableLowerSorter(["goal_id"]));
|
return this.boxList || [];
|
},
|
// 更新数据
|
updataBoxListData: function updataBoxListData(index, status) {
|
this.boxList[index].status = status;
|
},
|
sortItemList: function sortItemList(list) {
|
var _tempsort;
|
|
var tempsort = (_tempsort = {}, _defineProperty(_tempsort, 0, 2), _defineProperty(_tempsort, 1, 1), _defineProperty(_tempsort, 2, 3), _tempsort);
|
|
var sortFunc = function sortFunc(objA, objB) {
|
if (objA.status != objB.status) {
|
if (tempsort[objA.status] && tempsort[objB.status]) {
|
return tempsort[objA.status] - tempsort[objB.status];
|
} else {
|
return -1;
|
}
|
} else {
|
return objA.aim - objB.aim;
|
}
|
};
|
|
list.sort(sortFunc);
|
},
|
//设置倒计时
|
setCountDownTime: function setCountDownTime(text, less_time) {
|
var node = text.node;
|
if (!node) return;
|
node.stopAllActions();
|
|
if (less_time > 0) {
|
this.setTimeFormatString(text, less_time);
|
var callfun = cc.callFunc(function () {
|
less_time = less_time - 1;
|
|
if (less_time < 0) {
|
node.stopAllActions();
|
text.string = "00:00:00";
|
} else {
|
this.setTimeFormatString(text, less_time);
|
}
|
}.bind(this));
|
node.runAction(cc.repeatForever(cc.sequence(cc.delayTime(1), callfun)));
|
} else {
|
this.setTimeFormatString(text, less_time);
|
}
|
},
|
setTimeFormatString: function setTimeFormatString(text, time) {
|
var TimeTool = require("timetool");
|
|
if (time > 0) {
|
text.string = TimeTool.getTimeForFunction(time);
|
} else {
|
text.node.stopAllActions();
|
text.string = "00:00:00";
|
}
|
},
|
// *********** end *********************************************
|
// 幸运值
|
setLucklyRewardData: function setLucklyRewardData() {
|
var data = Config.dial_data.data_get_lucky_award;
|
var list = this.sortLucklyData(data);
|
this.lucky_num1 = list[0];
|
this.lucky_num2 = list[1];
|
},
|
getLucklyRewardData: function getLucklyRewardData(index) {
|
if (!this.lucky_num1 || !this.lucky_num2) return [];
|
|
if (index == 1) {
|
return this.lucky_num1 || [];
|
} else if (index == 2) {
|
return this.lucky_num2 || [];
|
}
|
},
|
// 抽奖两个按钮
|
setBuyRewardData: function setBuyRewardData() {
|
var data = Config.dial_data.data_get_limit_open;
|
var list = this.sortLucklyData(data, true);
|
this.buy_num_list1 = list[0];
|
this.buy_num_list2 = list[1];
|
},
|
getBuyRewardData: function getBuyRewardData(index) {
|
if (!this.buy_num_list1 || !this.buy_num_list2) return [];
|
|
if (index == 1) {
|
return this.buy_num_list1 || [];
|
} else if (index == 2) {
|
return this.buy_num_list2 || [];
|
}
|
},
|
sortLucklyData: function sortLucklyData(data, _type) {
|
var list1 = [];
|
var list2 = [];
|
|
for (var i in data) {
|
var v = data[i];
|
|
if (v.type == 1) {
|
list1.push(v);
|
} else if (v.type == 2) {
|
list2.push(v);
|
}
|
}
|
|
if (_type) {
|
list1.sort(function (a, b) {
|
return a.type2 - b.type2;
|
});
|
list2.sort(function (a, b) {
|
return a.type2 - b.type2;
|
});
|
} else {
|
list1.sort(function (a, b) {
|
return a.id - b.id;
|
});
|
list2.sort(function (a, b) {
|
return a.id - b.id;
|
});
|
}
|
|
return [list1, list2];
|
},
|
// ------- 探宝服务器返回----------
|
// 寻宝数据
|
setTreasureInitData: function setTreasureInitData(data) {
|
this.treasureInitData = [];
|
|
for (var i in data) {
|
this.treasureInitData[data[i].type] = data[i];
|
}
|
},
|
getTreasureInitData: function getTreasureInitData(index) {
|
if (!this.treasureInitData) return [];
|
return this.treasureInitData[index] || [];
|
},
|
// 更新
|
updataTreasureInitData: function updataTreasureInitData(index, data) {
|
if (!this.treasureInitData) return;
|
this.treasureInitData[index].count = data.count;
|
this.treasureInitData[index].end_time = data.end_time;
|
this.treasureInitData[index].lucky = data.lucky;
|
this.treasureInitData[index].lucky_award = data.lucky_award;
|
this.treasureInitData[index].rand_lists = data.rand_lists;
|
},
|
// 更新日记
|
updataTreasureLogData: function updataTreasureLogData(index, data) {
|
if (!this.treasureInitData) return;
|
this.treasureInitData[index].log_list = data;
|
},
|
// *********探宝红点*********
|
lucklyRedPoint: function lucklyRedPoint() {
|
this.setLucklyRewardData();
|
this.tab_redpoint = [false, false];
|
|
for (var val = 1; val <= 2; val++) {
|
var data = this.getLucklyRewardData(val);
|
var serve_data = this.getTreasureInitData(val);
|
var status = false;
|
|
for (var j in data) {
|
var _bool = true;
|
|
for (var k in serve_data.lucky_award) {
|
if (data[j].id == serve_data.lucky_award[k].lucky) {
|
_bool = false;
|
break;
|
}
|
}
|
|
if (serve_data.lucky < data[j].lucky_val) {
|
_bool = false;
|
}
|
|
if (_bool == true) {
|
status = true;
|
break;
|
}
|
}
|
|
this.setLucklyTabRedPoint(val, status);
|
}
|
|
MainuiController.getInstance().setFunctionTipsStatus(MainuiConst.icon.lucky_treasure, this.tab_redpoint[1] || this.tab_redpoint[2]);
|
},
|
// 获取幸运探宝页签红点
|
setLucklyTabRedPoint: function setLucklyTabRedPoint(index, status) {
|
this.tab_redpoint[index] = status;
|
},
|
getLucklyTabRedPoint: function getLucklyTabRedPoint(index) {
|
if (this.tab_redpoint && this.tab_redpoint[index]) {
|
return this.tab_redpoint[index];
|
}
|
|
return false;
|
},
|
getFundRedStatusByBid: function getFundRedStatusByBid(bid) {
|
return this.fund_red_list[bid];
|
},
|
//杂货铺数据
|
setStoneShopData: function setStoneShopData(data) {
|
this.stone_shop_data = {};
|
|
for (var i in data) {
|
var v = data[i];
|
this.stone_shop_data[v.id] = v;
|
}
|
},
|
getStoneShopData: function getStoneShopData(id) {
|
if (this.stone_shop_data && this.stone_shop_data[id] != null) {
|
return this.stone_shop_data[id];
|
}
|
|
return null;
|
},
|
// -----------每日红点仅显示一次-----------
|
updateGiftRedPointStatus: function updateGiftRedPointStatus(data) {
|
var bid = data.bid;
|
this.gift_id_list = this.gift_id_list || [];
|
this.gift_id_list[bid] = data;
|
},
|
getGiftRedStatusByBid: function getGiftRedStatusByBid(bid) {
|
if (!this.gift_id_list) return;
|
var list = this.gift_id_list[bid];
|
|
if (list) {
|
return list.status;
|
}
|
},
|
setGiftRedStatus: function setGiftRedStatus(data) {
|
if (!this.gift_id_list) return;
|
var bid = data.bid;
|
var status = data.status;
|
var list = this.gift_id_list[bid];
|
|
if (list && list.status != status) {
|
list.status = status;
|
}
|
|
gcore.GlobalEvent.fire(ActionEvent.SHOW_ACTIVITY_RED_POINT, bid, status);
|
},
|
updataFestvalRedStatus: function updataFestvalRedStatus(bid, data) {
|
var red_status = this.getRedPointStatus(data);
|
var festval_bid = MainuiConst.icon.festval;
|
|
if (bid == ActionConst.ActionRankCommonType.festval_day) {
|
festval_bid = MainuiConst.icon.festval_spring;
|
} else if (bid == ActionConst.ActionRankCommonType.lover_day) {
|
festval_bid = MainuiConst.icon.festval_lover;
|
}
|
|
MainuiController.getInstance().setFunctionTipsStatus(festval_bid, red_status);
|
},
|
getRedPointStatus: function getRedPointStatus(data) {
|
if (!data) return false;
|
var red_status = false;
|
|
for (var k = 0; k < data.length; ++k) {
|
var v = data[k];
|
|
if (v.status == 1) {
|
red_status = true;
|
break;
|
}
|
}
|
|
return red_status;
|
},
|
updataCombineLoginRedStatus: function updataCombineLoginRedStatus(data) {
|
if (!data) return;
|
var red_status = false;
|
|
for (var k = 0; k < data.length; ++k) {
|
var v = data[k];
|
|
if (v.status == 1) {
|
red_status = true;
|
break;
|
}
|
}
|
|
MainuiController.getInstance().setFunctionTipsStatus(MainuiConst.icon.combine_login, red_status);
|
},
|
updataPreferentialRedStatus: function updataPreferentialRedStatus(status, id) {
|
if (true) return; //暂时屏蔽掉 不需要
|
// id = id or MainuiConst.icon.preferential
|
// if status then
|
// if self.prefer_fisrt_flag == nil then
|
// self.prefer_fisrt_flag = {}
|
// end
|
// if not self.prefer_fisrt_flag[id] then
|
// self.prefer_fisrt_flag[id] = true
|
// else
|
// status = false
|
// end
|
// end
|
// MainuiController:getInstance():setFunctionTipsStatus(id, status)
|
},
|
clearFundSrvData: function clearFundSrvData() {
|
this.fund_datas = {};
|
}
|
});
|
|
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxhY3Rpb25cXGFjdGlvbl9tb2RlbC5qcyJdLCJuYW1lcyI6WyJNYWludWlDb250cm9sbGVyIiwicmVxdWlyZSIsIk1haW51aUNvbnN0IiwiQWN0aW9uRXZlbnQiLCJBY3Rpb25Db25zdCIsIkFjdGlvbk1vZGVsIiwiY2MiLCJDbGFzcyIsIkJhc2VDbGFzcyIsImN0b3IiLCJwcm9wZXJ0aWVzIiwiaW5pdENvbmZpZyIsImZ1bmRfcmVkX2xpc3QiLCJzZXRPcGVuRnVuZElkcyIsImlkX2xpc3QiLCJmdW5kX2lkX2xpc3QiLCJjaGVja0Z1bmRSZWRTdGF0dXMiLCJnZXRPcGVuRnVuZElkcyIsInNldEZ1bmRTcnZEYXRhIiwiZGF0YSIsImZ1bmRfZGF0YXMiLCJpZCIsInVwZGF0ZUZ1bmRTdGF0dXMiLCJzdGF0dXMiLCJnZXRGdW5kU3J2RGF0YUJ5SWQiLCJrIiwibGVuZ3RoIiwidiIsIkZ1bmRUeXBlIiwidHlwZV9vbmUiLCJ1cGRhdGVGdW5kUmVkU3RhdHVzIiwiRnVuZFJlZEluZGV4IiwiZnVuZF9nZXRfb25lIiwiZnVuZF9idXlfb25lIiwidHlwZV90d28iLCJmdW5kX2dldF90d28iLCJmdW5kX2J1eV90d28iLCJiaWQiLCJfc3RhdHVzIiwicmVkX3N0YXR1cyIsImdldEluc3RhbmNlIiwic2V0RnVuY3Rpb25UaXBzU3RhdHVzIiwiaWNvbiIsImZ1bmQiLCJnY29yZSIsIkdsb2JhbEV2ZW50IiwiZmlyZSIsIlVQREFUQV9GVU5EX1JFRF9TVEFUVVNfRVZFTlQiLCJ1cGRhdGVTZXZlbkxvZ2luRGF0YSIsInNldmVuX2xvZ2luX2RhdGEiLCJnZXRTZXZlbkxvZ2luRGF0YSIsImdldE1heFNldmVuRGF5Iiwic3RhdHVzX2xpc3QiLCJzb3J0IiwiYSIsImIiLCJkYXkiLCJpIiwic2V0Rmlyc3RCdG5TdGF0dXMiLCJmaXJzdEJ0blN0YXR1cyIsImdldEZpcnN0QnRuU3RhdHVzIiwiaW5kZXgiLCJzZXRTZXZlbkdvbGRQZXJpb2QiLCJwZXJpb2QiLCJzZXZlblBlcmlvZCIsImdldFNldmVuR29sZFBlcmlvZCIsImNoZWNrUmVkUG9pbnQiLCJ3ZWxmYXJlUmV0UG9pbnQiLCJ3ZWxmYXJlIiwiZ2V0U2V2ZW5Hb2FsV2VsZmFyZUxpc3QiLCJncm93UmV0UG9pbnQiLCJncm93IiwiZ2V0U2VydmVyR3Jvd0xpc3REYXRhIiwiZ2lmdFJldFBvaW50IiwiZ2V0U2VydmVyR2lmdExpc3REYXRhIiwiaGFsZlJlZFBvaW50IiwiaGFsZiIsImdldEhhbGZHaWZ0TGlzdCIsImJveFJlZFBvaW50IiwiYm94IiwiZ2V0U2V2ZW5Hb2FsQm94TGlzdCIsInJlZFN0YXR1cyIsInJlZFN0YXR1czEiLCJyZWRTdGF0dXMyIiwicmVkU3RhdHVzMyIsInJlZFN0YXR1czQiLCJyZWRTdGF0dXM1IiwiaWNvbl9pZCIsInNldmVuX2dvYWwiLCJzZXZlbl9nb2FsMSIsInNldmVuX2dvYWwyIiwic2V2ZW5fZ29hbDMiLCJnZXRSZWRQb2ludFdlbGZhcmVTdGF0dXMiLCJ1cGRhdGFSZWRQb2ludFdlbGZhcmVTdGF0dXMiLCJnZXRSZWRQb2ludEdyb3dTdGF0dXMiLCJ1cGRhdGFSZWRQb2ludEdyb3dTdGF0dXMiLCJnZXRSZWRQb2ludEdpZnRTdGF0dXMiLCJ1cGRhdGFSZWRQb2ludEdpZnRTdGF0dXMiLCJnZXRSZWRQb2ludEhhbGZTdGF0dXMiLCJ1cGRhdGFSZWRQb2ludEhhbGZTdGF0dXMiLCJnZXRSZWRQb2ludEJveFN0YXR1cyIsInVwZGF0YVJlZFBvaW50Qm94U3RhdHVzIiwiaW5pdFNldmVuV2FsZmFyZSIsInNldFdhbGZhcmVEYXRhIiwic2V0V2FsZmFyZUdyb3dVcERhdGEiLCJzZXRIYWxmR2lmdERhdGEiLCJzZXRCb3hSZXdhcmREYXRhIiwiQ29uZmlnIiwiZGF5X2dvYWxzX2RhdGEiLCJkYXRhX2FsbF90YXJnZXQiLCJib3hSZXdhcmREYXRhIiwicHVzaCIsImdldEJveFJld2FyZERhdGEiLCJkYXRhX3dlbGZhcmVjb2xsZWN0aW9uIiwid2VsZmFyZURhdGEiLCJVdGlscyIsImRlZXBDb3B5IiwiZGF0YV9ncm93dGh0YXJnZXQiLCJ3ZWxmYXJlR3Jvd0RhdGEiLCJ3ZWxmYXJlR2lmdERhdGEiLCJ0YWIiLCJ0YWIxIiwidGFyZ2V0X3R5cGUiLCJkYXRhX2hhbGZkaXNjb3VudCIsIndhbGZhcmVIYWxmRGF0YSIsImdldFdhbGZhcmVEYXRhIiwiZ2V0V2FsZmFyZUdyb3dVcERhdGEiLCJnZXRXZWxmYXJlR2lmdERhdGEiLCJnZXRXZWxmYXJlSGFsZkRhdGEiLCJzZXRTZXZlbkdvYWxXZWxmYXJlTGlzdCIsIndlbGZhcmVMaXN0IiwidXBkYXRhR29hbFdlbGZhcmVMaXN0Iiwic2V0U2V2ZW5Hb2FsR3Jvd0xpc3QiLCJncm93X2xpc3QiLCJzZXJ2ZXJHcm93TGlzdERhdGEiLCJzZXJ2ZXJHaWZ0TGlzdERhdGEiLCJ1cGRhdGFHcm93TGlzdERhdGEiLCJ1cGRhdGFHaWZ0TGlzdERhdGEiLCJzZXRIYWxmR2lmdExpc3QiLCJoYWxmR2lmdExpc3QiLCJoYWxmX2xpc3QiLCJ1cGRhdGFIYWxmTGlzdERhdGEiLCJzZXRTZXZlbkdvYWxCb3hMaXN0IiwiYm94TGlzdCIsInRhYmxlTG93ZXJTb3J0ZXIiLCJ1cGRhdGFCb3hMaXN0RGF0YSIsInNvcnRJdGVtTGlzdCIsImxpc3QiLCJ0ZW1wc29ydCIsInNvcnRGdW5jIiwib2JqQSIsIm9iakIiLCJhaW0iLCJzZXRDb3VudERvd25UaW1lIiwidGV4dCIsImxlc3NfdGltZSIsIm5vZGUiLCJzdG9wQWxsQWN0aW9ucyIsInNldFRpbWVGb3JtYXRTdHJpbmciLCJjYWxsZnVuIiwiY2FsbEZ1bmMiLCJzdHJpbmciLCJiaW5kIiwicnVuQWN0aW9uIiwicmVwZWF0Rm9yZXZlciIsInNlcXVlbmNlIiwiZGVsYXlUaW1lIiwidGltZSIsIlRpbWVUb29sIiwiZ2V0VGltZUZvckZ1bmN0aW9uIiwic2V0THVja2x5UmV3YXJkRGF0YSIsImRpYWxfZGF0YSIsImRhdGFfZ2V0X2x1Y2t5X2F3YXJkIiwic29ydEx1Y2tseURhdGEiLCJsdWNreV9udW0xIiwibHVja3lfbnVtMiIsImdldEx1Y2tseVJld2FyZERhdGEiLCJzZXRCdXlSZXdhcmREYXRhIiwiZGF0YV9nZXRfbGltaXRfb3BlbiIsImJ1eV9udW1fbGlzdDEiLCJidXlfbnVtX2xpc3QyIiwiZ2V0QnV5UmV3YXJkRGF0YSIsIl90eXBlIiwibGlzdDEiLCJsaXN0MiIsInR5cGUiLCJ0eXBlMiIsInNldFRyZWFzdXJlSW5pdERhdGEiLCJ0cmVhc3VyZUluaXREYXRhIiwiZ2V0VHJlYXN1cmVJbml0RGF0YSIsInVwZGF0YVRyZWFzdXJlSW5pdERhdGEiLCJjb3VudCIsImVuZF90aW1lIiwibHVja3kiLCJsdWNreV9hd2FyZCIsInJhbmRfbGlzdHMiLCJ1cGRhdGFUcmVhc3VyZUxvZ0RhdGEiLCJsb2dfbGlzdCIsImx1Y2tseVJlZFBvaW50IiwidGFiX3JlZHBvaW50IiwidmFsIiwic2VydmVfZGF0YSIsImoiLCJfYm9vbCIsImx1Y2t5X3ZhbCIsInNldEx1Y2tseVRhYlJlZFBvaW50IiwibHVja3lfdHJlYXN1cmUiLCJnZXRMdWNrbHlUYWJSZWRQb2ludCIsImdldEZ1bmRSZWRTdGF0dXNCeUJpZCIsInNldFN0b25lU2hvcERhdGEiLCJzdG9uZV9zaG9wX2RhdGEiLCJnZXRTdG9uZVNob3BEYXRhIiwidXBkYXRlR2lmdFJlZFBvaW50U3RhdHVzIiwiZ2lmdF9pZF9saXN0IiwiZ2V0R2lmdFJlZFN0YXR1c0J5QmlkIiwic2V0R2lmdFJlZFN0YXR1cyIsIlNIT1dfQUNUSVZJVFlfUkVEX1BPSU5UIiwidXBkYXRhRmVzdHZhbFJlZFN0YXR1cyIsImdldFJlZFBvaW50U3RhdHVzIiwiZmVzdHZhbF9iaWQiLCJmZXN0dmFsIiwiQWN0aW9uUmFua0NvbW1vblR5cGUiLCJmZXN0dmFsX2RheSIsImZlc3R2YWxfc3ByaW5nIiwibG92ZXJfZGF5IiwiZmVzdHZhbF9sb3ZlciIsInVwZGF0YUNvbWJpbmVMb2dpblJlZFN0YXR1cyIsImNvbWJpbmVfbG9naW4iLCJ1cGRhdGFQcmVmZXJlbnRpYWxS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LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogeHh4QHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAgIOi/memHjOWhq+WGmeivpue7huivtOaYjizkuLvopoHloavlhpnor6XmqKHlnZfnmoTlip/og73nroDopoFcbi8vIDxici8+Q3JlYXRlOiAyMDE5LTAzLTAyIDE2OjQ5OjAzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIE1haW51aUNvbnRyb2xsZXIgICAgPSByZXF1aXJlKFwibWFpbnVpX2NvbnRyb2xsZXJcIik7XG52YXIgTWFpbnVpQ29uc3QgPSByZXF1aXJlKFwibWFpbnVpX2NvbnN0XCIpO1xudmFyIEFjdGlvbkV2ZW50ID0gcmVxdWlyZShcImFjdGlvbl9ldmVudFwiKVxudmFyIEFjdGlvbkNvbnN0ID0gcmVxdWlyZShcImFjdGlvbl9jb25zdFwiKVxudmFyIEFjdGlvbk1vZGVsID0gY2MuQ2xhc3Moe1xuICAgIGV4dGVuZHM6IEJhc2VDbGFzcyxcbiAgICBjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgfSxcblxuICAgIHByb3BlcnRpZXM6IHtcbiAgICB9LFxuXG4gICAgaW5pdENvbmZpZzogZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyAtLSDln7rph5HnuqLngrnmlbDmja5cbiAgICAgICAgdGhpcy5mdW5kX3JlZF9saXN0ID0ge31cbiAgICB9LFxuXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS1AIOWfuumHkea0u+WKqOebuOWFs1xuICAgIC8vIC0tIOW8gOWQr+S4reeahOWfuumHkea0u+WKqGlkXG4gICAgc2V0T3BlbkZ1bmRJZHMoaWRfbGlzdCkge1xuICAgICAgICB0aGlzLmZ1bmRfaWRfbGlzdCA9IGlkX2xpc3QgfHwgW11cbiAgICAgICAgdGhpcy5jaGVja0Z1bmRSZWRTdGF0dXMoKVxuICAgIH0sXG4gICAgZ2V0T3BlbkZ1bmRJZHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZ1bmRfaWRfbGlzdCB8fCBbXVxuICAgIH0sXG4gICAgLy8gLS0g6K6+572u5Z+66YeR55qE5pWw5o2uXG4gICAgc2V0RnVuZFNydkRhdGEoZGF0YSkge1xuICAgICAgICB0aGlzLmZ1bmRfZGF0YXMgPSB0aGlzLmZ1bmRfZGF0YXMgfHwge31cbiAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5pZCkge1xuICAgICAgICAgICAgdGhpcy5mdW5kX2RhdGFzW2RhdGEuaWRdID0gZGF0YVxuICAgICAgICAgICAgdGhpcy51cGRhdGVGdW5kU3RhdHVzKGRhdGEuaWQsIGRhdGEuc3RhdHVzKVxuICAgICAgICB9XG4gICAgfSxcbiAgICAvLyAtLSDojrflj5bln7rph5HmlbDmja5cbiAgICBnZXRGdW5kU3J2RGF0YUJ5SWQoaWQpIHtcbiAgICAgICAgdGhpcy5mdW5kX2RhdGFzID0gdGhpcy5mdW5kX2RhdGFzIHx8IHt9XG4gICAgICAgIHJldHVybiB0aGlzLmZ1bmRfZGF0YXNbaWRdIHx8IHt9XG4gICAgfSxcbiAgICB1cGRhdGVGdW5kU3RhdHVzKGlkLCBzdGF0dXMpIHtcbiAgICAgICAgdGhpcy5mdW5kX2lkX2xpc3QgPSB0aGlzLmZ1bmRfaWRfbGlzdCB8fCBbXVxuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHRoaXMuZnVuZF9pZF9saXN0Lmxlbmd0aDsgKytrKSB7XG4gICAgICAgICAgICBsZXQgdiA9IHRoaXMuZnVuZF9pZF9saXN0W2tdXG4gICAgICAgICAgICBpZiAodi5pZCA9PSBpZCkge1xuICAgICAgICAgICAgICAgIHYuc3RhdHVzID0gc3RhdHVzXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoZWNrRnVuZFJlZFN0YXR1cygpXG4gICAgfSxcbiAgICAvL+ajgOafpei2heWAvOWfuumHkee6oueCuVxuICAgIGNoZWNrRnVuZFJlZFN0YXR1cygpIHtcbiAgICAgICAgdGhpcy5mdW5kX2lkX2xpc3QgPSB0aGlzLmZ1bmRfaWRfbGlzdCB8fCBbXVxuICAgICAgICBmb3IobGV0IGs9MDtrPHRoaXMuZnVuZF9pZF9saXN0Lmxlbmd0aDsrK2spe1xuICAgICAgICAgICAgbGV0IHYgPSB0aGlzLmZ1bmRfaWRfbGlzdFtrXVxuICAgICAgICAgICAgaWYodi5pZCA9PSBBY3Rpb25Db25zdC5GdW5kVHlwZS50eXBlX29uZSl7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVGdW5kUmVkU3RhdHVzKEFjdGlvbkNvbnN0LkZ1bmRSZWRJbmRleC5mdW5kX2dldF9vbmUsIHYuc3RhdHVzID09IDEpXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVGdW5kUmVkU3RhdHVzKEFjdGlvbkNvbnN0LkZ1bmRSZWRJbmRleC5mdW5kX2J1eV9vbmUsIHYuc3RhdHVzID09IDApXG4gICAgICAgICAgICB9ZWxzZSBpZih2LmlkID09IEFjdGlvbkNvbnN0LkZ1bmRUeXBlLnR5cGVfdHdvKXtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZ1bmRSZWRTdGF0dXMoQWN0aW9uQ29uc3QuRnVuZFJlZEluZGV4LmZ1bmRfZ2V0X3R3bywgdi5zdGF0dXMgPT0gMSlcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZ1bmRSZWRTdGF0dXMoQWN0aW9uQ29uc3QuRnVuZFJlZEluZGV4LmZ1bmRfYnV5X3R3bywgdi5zdGF0dXMgPT0gMClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgLy8gLS0g5pu05paw5Z+66YeR57qi54K55pWw5o2uXG4gICAgdXBkYXRlRnVuZFJlZFN0YXR1cyggYmlkLCBzdGF0dXMgKXtcbiAgICAgICAgbGV0IF9zdGF0dXMgPSB0aGlzLmZ1bmRfcmVkX2xpc3RbYmlkXVxuICAgICAgICBpZihfc3RhdHVzID09IHN0YXR1cykgcmV0dXJuO1xuICAgICAgICAvLyAtLSDotK3kubDnmoTnuqLngrnlj6rmnInnmbvpmYbml7bmiY3mmL7npLrvvIzngrnlh7vkuYvlkI7mtojlpLHvvIzkuYvlkI7kuI3lho3mmL7npLpcbiAgICAgICAgaWYoKGJpZCA9PSBBY3Rpb25Db25zdC5GdW5kUmVkSW5kZXguZnVuZF9idXlfb25lIHx8IGJpZCA9PSBBY3Rpb25Db25zdC5GdW5kUmVkSW5kZXguZnVuZF9idXlfdHdvKSAmJiBfc3RhdHVzID09IGZhbHNlKXtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mdW5kX3JlZF9saXN0W2JpZF0gPSBzdGF0dXNcblxuICAgICAgICBsZXQgcmVkX3N0YXR1cyA9IGZhbHNlXG4gICAgICAgIGZvcihsZXQgayBpbiB0aGlzLmZ1bmRfcmVkX2xpc3Qpe1xuICAgICAgICAgICAgbGV0IHYgPSB0aGlzLmZ1bmRfcmVkX2xpc3Rba11cbiAgICAgICAgICAgIGlmKHYgPT0gdHJ1ZSl7XG4gICAgICAgICAgICAgICAgcmVkX3N0YXR1cyA9IHRydWVcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIE1haW51aUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5zZXRGdW5jdGlvblRpcHNTdGF0dXMoTWFpbnVpQ29uc3QuaWNvbi5mdW5kLCByZWRfc3RhdHVzKVxuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEFjdGlvbkV2ZW50LlVQREFUQV9GVU5EX1JFRF9TVEFUVVNfRVZFTlQpXG4gICAgfSxcbiAgICB1cGRhdGVTZXZlbkxvZ2luRGF0YTogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgdGhpcy5zZXZlbl9sb2dpbl9kYXRhID0gZGF0YTtcbiAgICB9LFxuXG4gICAgZ2V0U2V2ZW5Mb2dpbkRhdGE6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V2ZW5fbG9naW5fZGF0YTtcbiAgICB9LFxuXG4gICAgLy8gLS1kZXNjOuiOt+WPluW9k+WJjeWPr+mihuWPljflpKnnmbvlvZXnmoTmnIDlpKflpKnmlbBcbiAgICBnZXRNYXhTZXZlbkRheTogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5zZXZlbl9sb2dpbl9kYXRhID09IG51bGwgfHwgdGhpcy5zZXZlbl9sb2dpbl9kYXRhLnN0YXR1c19saXN0ID09IG51bGwpIHJldHVybjtcbiAgICAgICAgdmFyIHN0YXR1c19saXN0ID0gdGhpcy5zZXZlbl9sb2dpbl9kYXRhLnN0YXR1c19saXN0O1xuICAgICAgICBzdGF0dXNfbGlzdC5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICByZXR1cm4gYS5kYXkgLSBiLmRheTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIGRheSA9IG51bGw7XG4gICAgICAgIGZvciAodmFyIGkgaW4gc3RhdHVzX2xpc3QpIHtcbiAgICAgICAgICAgIGlmIChzdGF0dXNfbGlzdFtpXS5zdGF0dXMgPT0gMikge1xuICAgICAgICAgICAgICAgIGRheSA9IHN0YXR1c19saXN0W2ldO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkYXkgPT0gbnVsbCkge1xuICAgICAgICAgICAgZGF5ID0gc3RhdHVzX2xpc3Rbc3RhdHVzX2xpc3QubGVuZ3RoXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF5O1xuICAgIH0sXG4gICAgc2V0Rmlyc3RCdG5TdGF0dXM6ZnVuY3Rpb24oZGF0YSl7XG4gICAgICAgIHRoaXMuZmlyc3RCdG5TdGF0dXMgPSB7fVxuICAgICAgICBmb3IobGV0IGk9MDtpPGRhdGEubGVuZ3RoOysraSl7XG4gICAgICAgICAgICBsZXQgdiA9IGRhdGFbaV1cbiAgICAgICAgICAgIHRoaXMuZmlyc3RCdG5TdGF0dXNbdi5pZF0gPSB2LnN0YXR1c1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGdldEZpcnN0QnRuU3RhdHVzOiBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZpcnN0QnRuU3RhdHVzKSByZXR1cm5cbiAgICAgICAgcmV0dXJuIHRoaXMuZmlyc3RCdG5TdGF0dXNbaW5kZXhdIHx8IDBcbiAgICB9LFxuXG4gICAgLy8g6I635Y+W5LiD5pel55uu5qCH55qE5ZGo5pyf5pWwXG4gICAgc2V0U2V2ZW5Hb2xkUGVyaW9kOmZ1bmN0aW9uKHBlcmlvZCl7XG4gICAgICAgIHRoaXMuc2V2ZW5QZXJpb2QgPSBwZXJpb2Q7XG4gICAgfSxcblxuICAgIGdldFNldmVuR29sZFBlcmlvZDpmdW5jdGlvbigpe1xuICAgICAgICByZXR1cm4gdGhpcy5zZXZlblBlcmlvZDtcbiAgICB9LFxuXG4gICAgLy8g5LiD5aSp55uu5qCH5qOA5p+l57qi54K5ICAgLS3lvZPliY3lpKnmlbDku6XkuIvnmoRcbiAgICBjaGVja1JlZFBvaW50OmZ1bmN0aW9uKGRheSl7XG4gICAgICAgIGlmKGRheSA8IDEgfHwgZGF5ID4gNylyZXR1cm47XG4gICAgICAgIGRheSA9IGRheSB8fCAxO1xuICAgICAgICAvLyDnpo/liKlcbiAgICAgICAgdGhpcy53ZWxmYXJlUmV0UG9pbnQgPSBbXTtcbiAgICAgICAgZm9yKHZhciBpPTE7IGk8PWRheTtpKyspe1xuICAgICAgICAgICAgdmFyIHdlbGZhcmUgPSB0aGlzLmdldFNldmVuR29hbFdlbGZhcmVMaXN0KGkpO1xuICAgICAgICAgICAgdGhpcy53ZWxmYXJlUmV0UG9pbnRbaV0gPSBmYWxzZTtcbiAgICAgICAgICAgIGZvcih2YXIgayBpbiB3ZWxmYXJlKXtcbiAgICAgICAgICAgICAgICBpZih3ZWxmYXJlW2tdLnN0YXR1cyA9PSAxKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53ZWxmYXJlUmV0UG9pbnRbaV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8g5q+P5pel55uu5qCHXG4gICAgICAgIHRoaXMuZ3Jvd1JldFBvaW50ID0gW107XG4gICAgICAgIGZvcih2YXIgaT0xOyBpPD1kYXk7aSsrKXtcbiAgICAgICAgICAgIHZhciBncm93ID0gdGhpcy5nZXRTZXJ2ZXJHcm93TGlzdERhdGEoaS0xKTtcbiAgICAgICAgICAgIHRoaXMuZ3Jvd1JldFBvaW50W2ldID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IodmFyIGsgaW4gZ3Jvdyl7XG4gICAgICAgICAgICAgICAgaWYoZ3Jvd1trXS5zdGF0dXMgPT0gMSl7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3Jvd1JldFBvaW50W2ldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIOi2heWAvOekvOWMhVxuICAgICAgICB0aGlzLmdpZnRSZXRQb2ludCA9IFtdO1xuICAgICAgICBmb3IodmFyIGk9MTsgaTw9ZGF5O2krKyl7XG4gICAgICAgICAgICB2YXIgZ3JvdyA9IHRoaXMuZ2V0U2VydmVyR2lmdExpc3REYXRhKGktMSk7XG4gICAgICAgICAgICB0aGlzLmdpZnRSZXRQb2ludFtpXSA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yKHZhciBrIGluIGdyb3cpe1xuICAgICAgICAgICAgICAgIGlmKGdyb3dba10uc3RhdHVzID09IDEpe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdpZnRSZXRQb2ludFtpXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGFsZlJlZFBvaW50ID0gW107XG4gICAgICAgIC8vIDDjgIHov5jmnInpooblj5YgIDHjgIHlt7Lpooblj5ZcbiAgICAgICAgZm9yKHZhciBpPTE7IGk8PWRheTtpKyspe1xuICAgICAgICAgICAgdmFyIGhhbGYgPSB0aGlzLmdldEhhbGZHaWZ0TGlzdChpKTtcbiAgICAgICAgICAgIHRoaXMuaGFsZlJlZFBvaW50W2ldID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IodmFyIGsgaW4gaGFsZil7XG4gICAgICAgICAgICAgICAgaWYoayA9PSAwICYmIGhhbGZba10uc3RhdHVzID09IDApe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbGZSZWRQb2ludFtpXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOWuneeusVxuICAgICAgICB0aGlzLmJveFJlZFBvaW50ID0gW107XG4gICAgICAgIHZhciBib3ggPSB0aGlzLmdldFNldmVuR29hbEJveExpc3QoKTtcbiAgICAgICAgZm9yKHZhciBpIGluIGJveCl7XG4gICAgICAgICAgICB0aGlzLmJveFJlZFBvaW50W2ldID0gZmFsc2U7XG4gICAgICAgICAgICBpZihib3hbaV0uc3RhdHVzID09IDEpe1xuICAgICAgICAgICAgICAgIHRoaXMuYm94UmVkUG9pbnRbaV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJlZFN0YXR1cyA9IGZhbHNlO1xuICAgICAgICB2YXIgcmVkU3RhdHVzMSA9IGZhbHNlO1xuICAgICAgICB2YXIgcmVkU3RhdHVzMiA9IGZhbHNlO1xuICAgICAgICB2YXIgcmVkU3RhdHVzMyA9IGZhbHNlO1xuICAgICAgICB2YXIgcmVkU3RhdHVzNCA9IGZhbHNlO1xuICAgICAgICB2YXIgcmVkU3RhdHVzNSA9IGZhbHNlO1xuXG4gICAgICAgIGZvcih2YXIgaSBpbiB0aGlzLndlbGZhcmVSZXRQb2ludCl7XG4gICAgICAgICAgICBpZih0aGlzLndlbGZhcmVSZXRQb2ludFtpXSA9PSB0cnVlKXtcbiAgICAgICAgICAgICAgICByZWRTdGF0dXMxID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvcih2YXIgaSBpbiB0aGlzLmdyb3dSZXRQb2ludCl7XG4gICAgICAgICAgICBpZih0aGlzLmdyb3dSZXRQb2ludFtpXSA9PSB0cnVlKXtcbiAgICAgICAgICAgICAgICByZWRTdGF0dXMyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvcih2YXIgaSBpbiB0aGlzLmdpZnRSZXRQb2ludCl7XG4gICAgICAgICAgICBpZih0aGlzLmdpZnRSZXRQb2ludFtpXSA9PSB0cnVlKXtcbiAgICAgICAgICAgICAgICByZWRTdGF0dXMzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvcih2YXIgaSBpbiB0aGlzLmhhbGZSZWRQb2ludCl7XG4gICAgICAgICAgICBpZih0aGlzLmhhbGZSZWRQb2ludFtpXSA9PSB0cnVlKXtcbiAgICAgICAgICAgICAgICByZWRTdGF0dXM1ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvcih2YXIgaSBpbiB0aGlzLmJveFJlZFBvaW50KXtcbiAgICAgICAgICAgIGlmKHRoaXMuYm94UmVkUG9pbnRbaV0gPT0gdHJ1ZSl7XG4gICAgICAgICAgICAgICAgcmVkU3RhdHVzNCA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZWRTdGF0dXMgPSByZWRTdGF0dXMxIHx8IHJlZFN0YXR1czIgfHwgcmVkU3RhdHVzMyB8fCByZWRTdGF0dXM0IHx8IHJlZFN0YXR1czU7XG4gICAgICAgIHZhciBpY29uX2lkID0gTWFpbnVpQ29uc3QuaWNvbi5zZXZlbl9nb2FsO1xuICAgICAgICBpZih0aGlzLmdldFNldmVuR29sZFBlcmlvZCgpID09IDEpe1xuICAgICAgICAgICAgaWNvbl9pZCA9IE1haW51aUNvbnN0Lmljb24uc2V2ZW5fZ29hbFxuICAgICAgICB9ZWxzZSBpZih0aGlzLmdldFNldmVuR29sZFBlcmlvZCgpID09IDIpe1xuICAgICAgICAgICAgaWNvbl9pZCA9IE1haW51aUNvbnN0Lmljb24uc2V2ZW5fZ29hbDE7XG4gICAgICAgIH1lbHNlIGlmKHRoaXMuZ2V0U2V2ZW5Hb2xkUGVyaW9kKCkgPT0gMyl7XG4gICAgICAgICAgICBpY29uX2lkID0gTWFpbnVpQ29uc3QuaWNvbi5zZXZlbl9nb2FsMjtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBpY29uX2lkID0gTWFpbnVpQ29uc3QuaWNvbi5zZXZlbl9nb2FsM1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBNYWludWlDb250cm9sbGVyLmdldEluc3RhbmNlKCkuc2V0RnVuY3Rpb25UaXBzU3RhdHVzKGljb25faWQsIHJlZFN0YXR1cyk7XG4gICAgfSxcblxuICAgIC8vIOe6oueCueeKtuaAgVxuICAgIGdldFJlZFBvaW50V2VsZmFyZVN0YXR1czpmdW5jdGlvbihkYXkpe1xuICAgICAgICBpZighdGhpcy53ZWxmYXJlUmV0UG9pbnQpcmV0dXJuO1xuICAgICAgICB2YXIgc3RhdHVzID0gZmFsc2U7XG4gICAgICAgIHN0YXR1cyA9IHRoaXMud2VsZmFyZVJldFBvaW50W2RheV07XG4gICAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgfSxcblxuICAgIC8vIOabtOaWsFxuICAgIHVwZGF0YVJlZFBvaW50V2VsZmFyZVN0YXR1czpmdW5jdGlvbihkYXksIHN0YXR1cyl7XG4gICAgICAgIGlmKCF0aGlzLndlbGZhcmVSZXRQb2ludClyZXR1cm47XG4gICAgICAgIHRoaXMud2VsZmFyZVJldFBvaW50W2RheV0gPSBzdGF0dXM7XG4gICAgfSxcblxuICAgIGdldFJlZFBvaW50R3Jvd1N0YXR1czpmdW5jdGlvbihkYXkpe1xuICAgICAgICBpZighdGhpcy5ncm93UmV0UG9pbnQpcmV0dXJuO1xuICAgICAgICB2YXIgc3RhdHVzID0gZmFsc2U7XG4gICAgICAgIHN0YXR1cyA9IHRoaXMuZ3Jvd1JldFBvaW50W2RheV07XG4gICAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgfSxcblxuICAgIC8vIOabtOaWsFxuICAgIHVwZGF0YVJlZFBvaW50R3Jvd1N0YXR1czpmdW5jdGlvbihkYXksIHN0YXR1cyl7XG4gICAgICAgIGlmKCF0aGlzLmdyb3dSZXRQb2ludClyZXR1cm47XG4gICAgICAgIHRoaXMuZ3Jvd1JldFBvaW50W2RheV0gPSBzdGF0dXM7XG4gICAgfSxcblxuICAgIGdldFJlZFBvaW50R2lmdFN0YXR1czpmdW5jdGlvbihkYXkpe1xuICAgICAgICBpZighdGhpcy5naWZ0UmV0UG9pbnQpcmV0dXJuO1xuICAgICAgICB2YXIgc3RhdHVzID0gZmFsc2U7XG4gICAgICAgIHN0YXR1cyA9IHRoaXMuZ2lmdFJldFBvaW50W2RheV07XG4gICAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgfSxcblxuICAgIC8vIOabtOaWsFxuICAgIHVwZGF0YVJlZFBvaW50R2lmdFN0YXR1czpmdW5jdGlvbihkYXksIHN0YXR1cyl7XG4gICAgICAgIGlmKCF0aGlzLmdpZnRSZXRQb2ludClyZXR1cm47XG4gICAgICAgIHRoaXMuZ2lmdFJldFBvaW50W2RheV0gPSBzdGF0dXM7XG4gICAgfSxcblxuICAgIC8vIOemj+WIqeekvOWMhVxuICAgIGdldFJlZFBvaW50SGFsZlN0YXR1czpmdW5jdGlvbihkYXkpe1xuICAgICAgICBpZighdGhpcy5oYWxmUmVkUG9pbnQpcmV0dXJuO1xuICAgICAgICB2YXIgc3RhdHVzID0gZmFsc2U7XG4gICAgICAgIHN0YXR1cyA9IHRoaXMuaGFsZlJlZFBvaW50W2RheV07XG4gICAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgfSxcblxuICAgIC8vIOabtOaWsFxuICAgIHVwZGF0YVJlZFBvaW50SGFsZlN0YXR1czpmdW5jdGlvbihkYXksIHN0YXR1cyl7XG4gICAgICAgIGlmKCF0aGlzLmhhbGZSZWRQb2ludClyZXR1cm47XG4gICAgICAgIHRoaXMuaGFsZlJlZFBvaW50W2RheV0gPSBzdGF0dXNcbiAgICB9LFxuXG4gICAgZ2V0UmVkUG9pbnRCb3hTdGF0dXM6ZnVuY3Rpb24oaW5kZXgpe1xuICAgICAgICBpZighdGhpcy5ib3hSZWRQb2ludClyZXR1cm47XG4gICAgICAgIHZhciBzdGF0dXMgPSBmYWxzZTtcbiAgICAgICAgc3RhdHVzID0gdGhpcy5ib3hSZWRQb2ludFtpbmRleF07XG4gICAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgfSxcblxuICAgIC8vIOabtOaWsFxuICAgIHVwZGF0YVJlZFBvaW50Qm94U3RhdHVzOmZ1bmN0aW9uKGluZGV4LCBzdGF0dXMpe1xuICAgICAgICBpZighdGhpcy5ib3hSZWRQb2ludClyZXR1cm47XG4gICAgICAgIHRoaXMuYm94UmVkUG9pbnRbaW5kZXhdID0gc3RhdHVzO1xuICAgIH0sXG5cbiAgICAvLyDkuIPlpKnnm67moIcqKioqKioqKioqKiBzdGFydCAqKioqKlxuICAgIGluaXRTZXZlbldhbGZhcmU6ZnVuY3Rpb24oaW5kZXgpe1xuICAgICAgICB0aGlzLnNldFdhbGZhcmVEYXRhKGluZGV4KTtcbiAgICAgICAgdGhpcy5zZXRXYWxmYXJlR3Jvd1VwRGF0YShpbmRleCk7XG4gICAgICAgIHRoaXMuc2V0SGFsZkdpZnREYXRhKGluZGV4KTtcbiAgICAgICAgdGhpcy5zZXRCb3hSZXdhcmREYXRhKGluZGV4KTtcbiAgICB9LFxuXG4gICAgLy8g5a6d566xXG4gICAgc2V0Qm94UmV3YXJkRGF0YTpmdW5jdGlvbihpbmRleCl7XG4gICAgICAgIHZhciBkYXRhID0gQ29uZmlnLmRheV9nb2Fsc19kYXRhLmRhdGFfYWxsX3RhcmdldFtpbmRleF1cbiAgICAgICAgdGhpcy5ib3hSZXdhcmREYXRhID0gW107XG4gICAgICAgIGZvcih2YXIgaSBpbiBkYXRhKXtcbiAgICAgICAgICAgIHRoaXMuYm94UmV3YXJkRGF0YS5wdXNoKGRhdGFbaV1bMF0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYm94UmV3YXJkRGF0YS5zb3J0KGZ1bmN0aW9uKGEsYil7XG4gICAgICAgICAgICByZXR1cm4gYS5pZCAtIGIuaWQ7XG4gICAgICAgIH0pXG4gICAgfSxcblxuICAgIGdldEJveFJld2FyZERhdGE6ZnVuY3Rpb24oKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuYm94UmV3YXJkRGF0YSB8fCBbXTtcbiAgICB9LFxuXG4gICAgLy8g56aP5YipXG4gICAgc2V0V2FsZmFyZURhdGE6ZnVuY3Rpb24oaW5kZXgpe1xuICAgICAgICB2YXIgZGF0YSA9IENvbmZpZy5kYXlfZ29hbHNfZGF0YS5kYXRhX3dlbGZhcmVjb2xsZWN0aW9uW2luZGV4XTtcbiAgICAgICAgdGhpcy53ZWxmYXJlRGF0YSA9IFV0aWxzLmRlZXBDb3B5KGRhdGEpO1xuICAgIH0sXG4gICAgXG4gICAgLy8g5oiQ6ZW/55uu5qCHXG4gICAgc2V0V2FsZmFyZUdyb3dVcERhdGE6ZnVuY3Rpb24oaW5kZXgpe1xuICAgICAgICB2YXIgZGF0YSA9IENvbmZpZy5kYXlfZ29hbHNfZGF0YS5kYXRhX2dyb3d0aHRhcmdldFtpbmRleF07XG4gICAgICAgIHRoaXMud2VsZmFyZUdyb3dEYXRhID0gW107XG4gICAgICAgIHRoaXMud2VsZmFyZUdpZnREYXRhID0gW107XG4gICAgICAgIGZvcih2YXIgaSBpbiBkYXRhKXtcbiAgICAgICAgICAgIHZhciB0YWIgPSBbXTtcbiAgICAgICAgICAgIHZhciB0YWIxID0gW107XG4gICAgICAgICAgICBmb3IodmFyIGsgaW4gZGF0YVtpXSl7XG4gICAgICAgICAgICAgICAgaWYoZGF0YVtpXVtrXS50YXJnZXRfdHlwZSA9PSAxKXtcbiAgICAgICAgICAgICAgICAgICAgdGFiLnB1c2goZGF0YVtpXVtrXSk7XG4gICAgICAgICAgICAgICAgfWVsc2UgaWYoZGF0YVtpXVtrXS50YXJnZXRfdHlwZSA9PSAyKXtcbiAgICAgICAgICAgICAgICAgICAgdGFiMS5wdXNoKGRhdGFbaV1ba10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMud2VsZmFyZUdyb3dEYXRhLnB1c2godGFiKTtcbiAgICAgICAgICAgIHRoaXMud2VsZmFyZUdpZnREYXRhLnB1c2godGFiMSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g56aP5Yip56S85YyFXG4gICAgc2V0SGFsZkdpZnREYXRhOmZ1bmN0aW9uKGluZGV4KXtcbiAgICAgICAgdmFyIGRhdGEgPSBDb25maWcuZGF5X2dvYWxzX2RhdGEuZGF0YV9oYWxmZGlzY291bnRbaW5kZXhdO1xuICAgICAgICB0aGlzLndhbGZhcmVIYWxmRGF0YSA9IFtdO1xuICAgICAgICBmb3IodmFyIGk9MTtpPD03O2krKyl7XG4gICAgICAgICAgICB0aGlzLndhbGZhcmVIYWxmRGF0YVtpXSA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yKHZhciBpIGluIGRhdGEpe1xuICAgICAgICAgICAgdGhpcy53YWxmYXJlSGFsZkRhdGFbZGF0YVtpXVswXS5kYXldLnB1c2goZGF0YVtpXVswXSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IodmFyIGk9MTtpPD03O2krKyl7XG4gICAgICAgICAgICB0aGlzLndhbGZhcmVIYWxmRGF0YVtpXS5zb3J0KGZ1bmN0aW9uKGEsYil7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEuaWQgLSBiLmlkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0V2FsZmFyZURhdGE6ZnVuY3Rpb24oZGF5KXtcbiAgICAgICAgaWYoIXRoaXMud2VsZmFyZURhdGEpcmV0dXJuO1xuICAgICAgICByZXR1cm4gdGhpcy53ZWxmYXJlRGF0YVtkYXldIHx8IFtdO1xuICAgIH0sXG5cbiAgICBnZXRXYWxmYXJlR3Jvd1VwRGF0YTpmdW5jdGlvbihkYXkpe1xuICAgICAgICBpZighdGhpcy53ZWxmYXJlR3Jvd0RhdGEpcmV0dXJuO1xuICAgICAgICByZXR1cm4gdGhpcy53ZWxmYXJlR3Jvd0RhdGFbZGF5XSB8fCBbXTtcbiAgICB9LFxuXG4gICAgZ2V0V2VsZmFyZUdpZnREYXRhOmZ1bmN0aW9uKGRheSl7XG4gICAgICAgIGlmKCF0aGlzLndlbGZhcmVHaWZ0RGF0YSlyZXR1cm47XG4gICAgICAgIHJldHVybiB0aGlzLndlbGZhcmVHaWZ0RGF0YVtkYXldIHx8IFtdO1xuICAgIH0sXG5cbiAgICBnZXRXZWxmYXJlSGFsZkRhdGE6ZnVuY3Rpb24oZGF5KXtcbiAgICAgICAgaWYodGhpcy53YWxmYXJlSGFsZkRhdGEgJiYgdGhpcy53YWxmYXJlSGFsZkRhdGFbZGF5XSl7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53YWxmYXJlSGFsZkRhdGFbZGF5XSB8fCBbXTtcbiAgICAgICAgfVxuICAgIH0sXG5cbi8vICoqKioqKioqKioqIOWNj+iuruebuOWFsyoqKioqKioqKlxuLy8g5LiD5aSp55uu5qCH55qE56aP5Yip6aKG5Y+WXG4gICAgc2V0U2V2ZW5Hb2FsV2VsZmFyZUxpc3Q6ZnVuY3Rpb24oZGF0YSl7XG4gICAgICAgIHRoaXMud2VsZmFyZUxpc3QgPSBbXTtcbiAgICAgICAgZm9yKHZhciBpPTE7aTw9NztpKyspe1xuICAgICAgICAgICAgdGhpcy53ZWxmYXJlTGlzdFtpXSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGZvcih2YXIgaSBpbiBkYXRhKXtcbiAgICAgICAgICAgIHRoaXMud2VsZmFyZUxpc3RbZGF0YVtpXS5kYXldLnB1c2goZGF0YVtpXSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0U2V2ZW5Hb2FsV2VsZmFyZUxpc3Q6ZnVuY3Rpb24oZGF5KXtcbiAgICAgICAgaWYoIXRoaXMud2VsZmFyZUxpc3QpcmV0dXJuO1xuICAgICAgICByZXR1cm4gdGhpcy53ZWxmYXJlTGlzdFtkYXldIHx8IFtdO1xuICAgIH0sXG5cbiAgICAvLyDmm7TmlrDmlbDmja5cbiAgICB1cGRhdGFHb2FsV2VsZmFyZUxpc3Q6ZnVuY3Rpb24oZGF5LCBpbmRleCwgc3RhdHVzKXtcbiAgICAgICAgdGhpcy53ZWxmYXJlTGlzdFtkYXldW2luZGV4XS5zdGF0dXMgPSBzdGF0dXM7ICAgIFxuICAgIH0sXG5cbiAgICAvLyDkuIPlpKnnm67moIfnmoTmiJDplb/nm67moIdcbiAgICBzZXRTZXZlbkdvYWxHcm93TGlzdDpmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgdmFyIGdyb3dfbGlzdCA9IFtdO1xuICAgICAgICBmb3IodmFyIGk9MTtpPD03O2krKyl7XG4gICAgICAgICAgICBncm93X2xpc3RbaV0gPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBmb3IodmFyIGkgaW4gZGF0YSl7XG4gICAgICAgICAgICBncm93X2xpc3RbZGF0YVtpXS5kYXldLnB1c2goZGF0YVtpXSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNlcnZlckdyb3dMaXN0RGF0YSA9IFtdO1xuICAgICAgICB0aGlzLnNlcnZlckdpZnRMaXN0RGF0YSA9IFtdO1xuICAgICAgICBmb3IodmFyIGkgaW4gZ3Jvd19saXN0KXtcbiAgICAgICAgICAgIHZhciB0YWIgPSBbXTtcbiAgICAgICAgICAgIHZhciB0YWIxID0gW107XG4gICAgICAgICAgICBmb3IodmFyIGsgaW4gZ3Jvd19saXN0W2ldKXtcbiAgICAgICAgICAgICAgICBpZihncm93X2xpc3RbaV1ba10udGFyZ2V0X3R5cGUgPT0gMSl7XG4gICAgICAgICAgICAgICAgICAgIHRhYi5wdXNoKGdyb3dfbGlzdFtpXVtrXSk7XG4gICAgICAgICAgICAgICAgfWVsc2UgaWYoZ3Jvd19saXN0W2ldW2tdLnRhcmdldF90eXBlID09IDIpe1xuICAgICAgICAgICAgICAgICAgICB0YWIxLnB1c2goZ3Jvd19saXN0W2ldW2tdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNlcnZlckdyb3dMaXN0RGF0YS5wdXNoKHRhYik7XG4gICAgICAgICAgICB0aGlzLnNlcnZlckdpZnRMaXN0RGF0YS5wdXNoKHRhYjEpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGdldFNlcnZlckdyb3dMaXN0RGF0YTpmdW5jdGlvbihkYXkpe1xuICAgICAgICBpZih0aGlzLnNlcnZlckdyb3dMaXN0RGF0YSAmJiB0aGlzLnNlcnZlckdyb3dMaXN0RGF0YVtkYXldKXtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlcnZlckdyb3dMaXN0RGF0YVtkYXldIHx8IFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9LFxuXG4gICAgLy8g5pu05paw5pWw5o2uXG4gICAgdXBkYXRhR3Jvd0xpc3REYXRhOmZ1bmN0aW9uKGRheSwgaW5kZXgsIHN0YXR1cyl7XG4gICAgICAgIHRoaXMuc2VydmVyR3Jvd0xpc3REYXRhW2RheV1baW5kZXhdLnN0YXR1cyA9IHN0YXR1cztcbiAgICB9LFxuXG4gICAgZ2V0U2VydmVyR2lmdExpc3REYXRhOmZ1bmN0aW9uKGRheSl7XG4gICAgICAgIGlmKCF0aGlzLnNlcnZlckdpZnRMaXN0RGF0YSlyZXR1cm47XG4gICAgICAgIHJldHVybiB0aGlzLnNlcnZlckdpZnRMaXN0RGF0YVtkYXldIHx8IFtdO1xuICAgIH0sXG5cbiAgICAvLyDmm7TmlrDmlbDmja5cbiAgICB1cGRhdGFHaWZ0TGlzdERhdGE6ZnVuY3Rpb24oZGF5LCBpbmRleCwgc3RhdHVzKXtcbiAgICAgICAgdGhpcy5zZXJ2ZXJHaWZ0TGlzdERhdGFbZGF5XVtpbmRleF0uc3RhdHVzID0gc3RhdHVzO1xuICAgIH0sXG5cbiAgICAvLyDnpo/liKnnpLzljIXnpLzljIXotK3kubBcbiAgICBzZXRIYWxmR2lmdExpc3Q6ZnVuY3Rpb24oZGF0YSl7XG4gICAgICAgIHRoaXMuaGFsZkdpZnRMaXN0ID0gW107XG4gICAgICAgIGZvcih2YXIgaT0xO2k8PTc7aSsrKXtcbiAgICAgICAgICAgIHRoaXMuaGFsZkdpZnRMaXN0W2ldID0gW107XG4gICAgICAgIH1cbiAgICAgICAgZm9yKHZhciBpPTE7aTw9NztpKyspe1xuICAgICAgICAgICAgdmFyIGhhbGZfbGlzdCA9IHRoaXMuZ2V0V2VsZmFyZUhhbGZEYXRhKGkpO1xuICAgICAgICAgICAgZm9yKHZhciBrIGluIGhhbGZfbGlzdCl7XG4gICAgICAgICAgICAgICAgZm9yKHZhciBiIGluIGRhdGEpe1xuICAgICAgICAgICAgICAgICAgICBpZihoYWxmX2xpc3Rba10uaWQgPT0gZGF0YVtiXS5kYXkpe1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYWxmR2lmdExpc3RbaV0ucHVzaChkYXRhW2JdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRIYWxmR2lmdExpc3Q6ZnVuY3Rpb24oZGF5KXtcbiAgICAgICAgaWYodGhpcy5oYWxmR2lmdExpc3QgJiYgdGhpcy5oYWxmR2lmdExpc3RbZGF5XSl7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oYWxmR2lmdExpc3RbZGF5XSB8fCBbXTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgXG4gICAgLy8g5pu05paw5pWw5o2uXG4gICAgdXBkYXRhSGFsZkxpc3REYXRhOmZ1bmN0aW9uKGRheSwgaW5kZXgsIHN0YXR1cyl7XG4gICAgICAgIHRoaXMuaGFsZkdpZnRMaXN0W2RheV1baW5kZXhdLnN0YXR1cyA9IHN0YXR1cztcbiAgICB9LFxuXG4gICAgLy8g5rS76LeD5a6d566xXG4gICAgc2V0U2V2ZW5Hb2FsQm94TGlzdDpmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgdGhpcy5ib3hMaXN0ID0gZGF0YTtcbiAgICB9LFxuICAgIFxuICAgIGdldFNldmVuR29hbEJveExpc3Q6ZnVuY3Rpb24oKXtcbiAgICAgICAgaWYoIXRoaXMuYm94TGlzdClyZXR1cm47XG4gICAgICAgIHRoaXMuYm94TGlzdC5zb3J0KFV0aWxzLnRhYmxlTG93ZXJTb3J0ZXIoW1wiZ29hbF9pZFwiXSkpO1xuICAgICAgICByZXR1cm4gdGhpcy5ib3hMaXN0IHx8IFtdO1xuICAgIH0sXG5cbiAgICAvLyDmm7TmlrDmlbDmja5cbiAgICB1cGRhdGFCb3hMaXN0RGF0YTpmdW5jdGlvbihpbmRleCwgc3RhdHVzKXtcbiAgICAgICAgdGhpcy5ib3hMaXN0W2luZGV4XS5zdGF0dXMgPSBzdGF0dXM7XG4gICAgfSxcbiAgICBzb3J0SXRlbUxpc3QobGlzdCl7XG4gICAgICAgIGxldCB0ZW1wc29ydCA9IHtcbiAgICAgICAgICAgIFswXSA6IDIsICAvLy0tIDAg5pyq6aKG5Y+W5pS+5Lit6Ze0XG4gICAgICAgICAgICBbMV0gOiAxLCAgLy8tLSAxIOWPr+mihuWPluaUvuWJjemdolxuICAgICAgICAgICAgWzJdIDogMywgIC8vLS0gMiDlt7Lpooblj5bmlL7mnIDlkI5cbiAgICAgICAgfVxuICAgICAgICBsZXQgc29ydEZ1bmMgPSBmdW5jdGlvbiAob2JqQSxvYmpCKXtcbiAgICAgICAgICAgIGlmIChvYmpBLnN0YXR1cyAhPSBvYmpCLnN0YXR1cyl7XG4gICAgICAgICAgICAgICAgaWYgKHRlbXBzb3J0W29iakEuc3RhdHVzXSAmJiB0ZW1wc29ydFtvYmpCLnN0YXR1c10pe1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGVtcHNvcnRbb2JqQS5zdGF0dXNdIC0gdGVtcHNvcnRbb2JqQi5zdGF0dXNdXG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIHJldHVybiBvYmpBLmFpbSAtIG9iakIuYWltXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGlzdC5zb3J0KHNvcnRGdW5jKVxuICAgIH0sXG4gICAgLy/orr7nva7lgJLorqHml7ZcbiAgICBzZXRDb3VudERvd25UaW1lKHRleHQsbGVzc190aW1lKXtcbiAgICAgICAgbGV0IG5vZGUgPSB0ZXh0Lm5vZGVcbiAgICAgICAgaWYoIW5vZGUpcmV0dXJuXG4gICAgICAgIG5vZGUuc3RvcEFsbEFjdGlvbnMoKTtcbiAgICAgICAgaWYgKGxlc3NfdGltZSA+IDApe1xuICAgICAgICAgICAgdGhpcy5zZXRUaW1lRm9ybWF0U3RyaW5nKHRleHQsbGVzc190aW1lKVxuICAgICAgICAgICAgbGV0IGNhbGxmdW4gPSBjYy5jYWxsRnVuYyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbGVzc190aW1lID0gbGVzc190aW1lIC0gMTtcbiAgICAgICAgICAgICAgICBpZiAobGVzc190aW1lIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLnN0b3BBbGxBY3Rpb25zKCk7XG4gICAgICAgICAgICAgICAgICAgIHRleHQuc3RyaW5nID0gXCIwMDowMDowMFwiXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRUaW1lRm9ybWF0U3RyaW5nKHRleHQsbGVzc190aW1lKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgICAgIG5vZGUucnVuQWN0aW9uKGNjLnJlcGVhdEZvcmV2ZXIoY2Muc2VxdWVuY2UoY2MuZGVsYXlUaW1lKDEpLCBjYWxsZnVuKSkpXG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdGhpcy5zZXRUaW1lRm9ybWF0U3RyaW5nKHRleHQsbGVzc190aW1lKVxuICAgICAgICB9XG4gICAgfSxcbiAgICBzZXRUaW1lRm9ybWF0U3RyaW5nKHRleHQsdGltZSl7XG4gICAgICAgIHZhciBUaW1lVG9vbCA9IHJlcXVpcmUoXCJ0aW1ldG9vbFwiKVxuICAgICAgICBpZih0aW1lID4gMCl7XG4gICAgICAgICAgICB0ZXh0LnN0cmluZyA9IFRpbWVUb29sLmdldFRpbWVGb3JGdW5jdGlvbih0aW1lKTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB0ZXh0Lm5vZGUuc3RvcEFsbEFjdGlvbnMoKTtcbiAgICAgICAgICAgIHRleHQuc3RyaW5nID0gXCIwMDowMDowMFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8vICoqKioqKioqKioqIGVuZCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAvLyDlubjov5DlgLxcbiAgICBzZXRMdWNrbHlSZXdhcmREYXRhOmZ1bmN0aW9uKCl7XG4gICAgICAgIHZhciBkYXRhID0gQ29uZmlnLmRpYWxfZGF0YS5kYXRhX2dldF9sdWNreV9hd2FyZDtcbiAgICAgICAgdmFyIGxpc3QgPSB0aGlzLnNvcnRMdWNrbHlEYXRhKGRhdGEpO1xuICAgICAgICB0aGlzLmx1Y2t5X251bTEgPSBsaXN0WzBdO1xuICAgICAgICB0aGlzLmx1Y2t5X251bTIgPSBsaXN0WzFdO1xuICAgIH0sXG5cbiAgICBnZXRMdWNrbHlSZXdhcmREYXRhOmZ1bmN0aW9uKGluZGV4KXtcbiAgICAgICAgaWYoIXRoaXMubHVja3lfbnVtMSB8fCAhdGhpcy5sdWNreV9udW0yKXJldHVybiBbXTtcbiAgICAgICAgaWYoaW5kZXggPT0gMSl7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sdWNreV9udW0xIHx8IFtdO1xuICAgICAgICB9ZWxzZSBpZihpbmRleCA9PSAyKXtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmx1Y2t5X251bTIgfHwgW107XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5oq95aWW5Lik5Liq5oyJ6ZKuXG4gICAgc2V0QnV5UmV3YXJkRGF0YTpmdW5jdGlvbigpe1xuICAgICAgICB2YXIgZGF0YSA9IENvbmZpZy5kaWFsX2RhdGEuZGF0YV9nZXRfbGltaXRfb3BlbjtcbiAgICAgICAgdmFyIGxpc3QgPSB0aGlzLnNvcnRMdWNrbHlEYXRhKGRhdGEsIHRydWUpO1xuICAgICAgICB0aGlzLmJ1eV9udW1fbGlzdDEgPSBsaXN0WzBdO1xuICAgICAgICB0aGlzLmJ1eV9udW1fbGlzdDIgPSBsaXN0WzFdO1xuICAgIH0sXG5cbiAgICBnZXRCdXlSZXdhcmREYXRhOmZ1bmN0aW9uKGluZGV4KXtcbiAgICAgICAgaWYoIXRoaXMuYnV5X251bV9saXN0MSB8fCAhdGhpcy5idXlfbnVtX2xpc3QyKXJldHVybiBbXTtcbiAgICAgICAgaWYoaW5kZXggPT0gMSl7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5idXlfbnVtX2xpc3QxIHx8IFtdO1xuICAgICAgICB9ZWxzZSBpZihpbmRleCA9PSAyKXtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1eV9udW1fbGlzdDIgfHwgW107XG4gICAgICAgIH1cbiAgICB9LFxuICAgIFxuICAgIHNvcnRMdWNrbHlEYXRhOmZ1bmN0aW9uKGRhdGEsIF90eXBlKXtcbiAgICAgICAgdmFyIGxpc3QxID0gW107XG4gICAgICAgIHZhciBsaXN0MiA9IFtdO1xuICAgICAgICBmb3IodmFyIGkgaW4gZGF0YSl7XG4gICAgICAgICAgICB2YXIgdiA9IGRhdGFbaV07XG4gICAgICAgICAgICBpZih2LnR5cGUgPT0gMSl7XG4gICAgICAgICAgICAgICAgbGlzdDEucHVzaCh2KTtcbiAgICAgICAgICAgIH1lbHNlIGlmKHYudHlwZSA9PSAyKXtcbiAgICAgICAgICAgICAgICBsaXN0Mi5wdXNoKHYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmKF90eXBlKXtcbiAgICAgICAgICAgIGxpc3QxLnNvcnQoZnVuY3Rpb24oYSwgYil7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEudHlwZTItYi50eXBlMjtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBsaXN0Mi5zb3J0KGZ1bmN0aW9uKGEsIGIpe1xuICAgICAgICAgICAgICAgIHJldHVybiBhLnR5cGUyLWIudHlwZTI7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBsaXN0MS5zb3J0KGZ1bmN0aW9uKGEsIGIpe1xuICAgICAgICAgICAgICAgIHJldHVybiBhLmlkLSBiLmlkO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGxpc3QyLnNvcnQoZnVuY3Rpb24oYSwgYil7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEuaWQgLSBiLmlkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtsaXN0MSxsaXN0Ml07XG4gICAgfSxcblxuICAgIC8vIC0tLS0tLS0g5o6i5a6d5pyN5Yqh5Zmo6L+U5ZueLS0tLS0tLS0tLVxuICAgIC8vIOWvu+WuneaVsOaNrlxuICAgIHNldFRyZWFzdXJlSW5pdERhdGE6ZnVuY3Rpb24oZGF0YSl7XG4gICAgICAgIHRoaXMudHJlYXN1cmVJbml0RGF0YSA9IFtdO1xuICAgICAgICBmb3IodmFyIGkgaW4gZGF0YSl7XG4gICAgICAgICAgICB0aGlzLnRyZWFzdXJlSW5pdERhdGFbZGF0YVtpXS50eXBlXSA9IGRhdGFbaV07XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0VHJlYXN1cmVJbml0RGF0YTpmdW5jdGlvbihpbmRleCl7XG4gICAgICAgIGlmKCF0aGlzLnRyZWFzdXJlSW5pdERhdGEpcmV0dXJuW107XG4gICAgICAgIHJldHVybiB0aGlzLnRyZWFzdXJlSW5pdERhdGFbaW5kZXhdIHx8IFtdO1xuICAgIH0sXG5cbiAgICAvLyDmm7TmlrBcbiAgICB1cGRhdGFUcmVhc3VyZUluaXREYXRhOmZ1bmN0aW9uKGluZGV4LCBkYXRhKXtcbiAgICAgICAgaWYoIXRoaXMudHJlYXN1cmVJbml0RGF0YSlyZXR1cm47XG4gICAgICAgIHRoaXMudHJlYXN1cmVJbml0RGF0YVtpbmRleF0uY291bnQgPSBkYXRhLmNvdW50O1xuICAgICAgICB0aGlzLnRyZWFzdXJlSW5pdERhdGFbaW5kZXhdLmVuZF90aW1lID0gZGF0YS5lbmRfdGltZTtcbiAgICAgICAgdGhpcy50cmVhc3VyZUluaXREYXRhW2luZGV4XS5sdWNreSA9IGRhdGEubHVja3k7XG4gICAgICAgIHRoaXMudHJlYXN1cmVJbml0RGF0YVtpbmRleF0ubHVja3lfYXdhcmQgPSBkYXRhLmx1Y2t5X2F3YXJkO1xuICAgICAgICB0aGlzLnRyZWFzdXJlSW5pdERhdGFbaW5kZXhdLnJhbmRfbGlzdHMgPSBkYXRhLnJhbmRfbGlzdHM7XG4gICAgfSxcblxuICAgIC8vIOabtOaWsOaXpeiusFxuICAgIHVwZGF0YVRyZWFzdXJlTG9nRGF0YTpmdW5jdGlvbihpbmRleCwgZGF0YSl7XG4gICAgICAgIGlmKCF0aGlzLnRyZWFzdXJlSW5pdERhdGEpcmV0dXJuO1xuICAgICAgICB0aGlzLnRyZWFzdXJlSW5pdERhdGFbaW5kZXhdLmxvZ19saXN0ID0gZGF0YTtcbiAgICB9LFxuXG4gICAgLy8gKioqKioqKioq5o6i5a6d57qi54K5KioqKioqKioqXG4gICAgbHVja2x5UmVkUG9pbnQ6ZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy5zZXRMdWNrbHlSZXdhcmREYXRhKCk7XG4gICAgICAgIHRoaXMudGFiX3JlZHBvaW50ID0gW2ZhbHNlLGZhbHNlXTtcbiAgICAgICAgZm9yKHZhciB2YWw9MTt2YWw8PTI7dmFsKyspe1xuICAgICAgICAgICAgdmFyIGRhdGEgPSB0aGlzLmdldEx1Y2tseVJld2FyZERhdGEodmFsKTtcbiAgICAgICAgICAgIHZhciBzZXJ2ZV9kYXRhID0gdGhpcy5nZXRUcmVhc3VyZUluaXREYXRhKHZhbCk7XG4gICAgICAgICAgICB2YXIgc3RhdHVzID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IodmFyIGogaW4gZGF0YSl7XG4gICAgICAgICAgICAgICAgdmFyIF9ib29sID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBmb3IodmFyIGsgaW4gc2VydmVfZGF0YS5sdWNreV9hd2FyZCl7XG4gICAgICAgICAgICAgICAgICAgIGlmKGRhdGFbal0uaWQgPT0gc2VydmVfZGF0YS5sdWNreV9hd2FyZFtrXS5sdWNreSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYm9vbCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYoc2VydmVfZGF0YS5sdWNreSA8IGRhdGFbal0ubHVja3lfdmFsKXtcbiAgICAgICAgICAgICAgICAgICAgX2Jvb2wgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZihfYm9vbCA9PSB0cnVlKXtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXRMdWNrbHlUYWJSZWRQb2ludCh2YWwsc3RhdHVzKTtcbiAgICAgICAgfVxuICAgICAgICBNYWludWlDb250cm9sbGVyLmdldEluc3RhbmNlKCkuc2V0RnVuY3Rpb25UaXBzU3RhdHVzKE1haW51aUNvbnN0Lmljb24ubHVja3lfdHJlYXN1cmUsIHRoaXMudGFiX3JlZHBvaW50WzFdIHx8IHRoaXMudGFiX3JlZHBvaW50WzJdKTtcbiAgICB9LFxuXG4gICAgLy8g6I635Y+W5bm46L+Q5o6i5a6d6aG1562+57qi54K5XG4gICAgc2V0THVja2x5VGFiUmVkUG9pbnQ6ZnVuY3Rpb24oaW5kZXgsc3RhdHVzKXtcbiAgICAgICAgdGhpcy50YWJfcmVkcG9pbnRbaW5kZXhdID0gc3RhdHVzO1xuICAgIH0sXG4gICAgXG4gICAgZ2V0THVja2x5VGFiUmVkUG9pbnQ6ZnVuY3Rpb24oaW5kZXgpe1xuICAgICAgICBpZih0aGlzLnRhYl9yZWRwb2ludCAmJiB0aGlzLnRhYl9yZWRwb2ludFtpbmRleF0pe1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGFiX3JlZHBvaW50W2luZGV4XTsgICAgXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG5cbiAgICBnZXRGdW5kUmVkU3RhdHVzQnlCaWQoIGJpZCApe1xuICAgICAgICByZXR1cm4gdGhpcy5mdW5kX3JlZF9saXN0W2JpZF1cbiAgICB9LFxuXG5cbiAgICAvL+adgui0p+mTuuaVsOaNrlxuICAgIHNldFN0b25lU2hvcERhdGE6ZnVuY3Rpb24oZGF0YSl7XG4gICAgICAgIHRoaXMuc3RvbmVfc2hvcF9kYXRhID0ge307XG4gICAgICAgIGZvcih2YXIgaSBpbiBkYXRhKXtcbiAgICAgICAgICAgIHZhciB2ID0gZGF0YVtpXTtcbiAgICAgICAgICAgIHRoaXMuc3RvbmVfc2hvcF9kYXRhW3YuaWRdPSB2O1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGdldFN0b25lU2hvcERhdGE6ZnVuY3Rpb24oaWQpe1xuICAgICAgICBpZih0aGlzLnN0b25lX3Nob3BfZGF0YSAmJiB0aGlzLnN0b25lX3Nob3BfZGF0YVtpZF0gIT0gbnVsbCl7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdG9uZV9zaG9wX2RhdGFbaWRdXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICB9LFxuXG4gICAgLy8gLS0tLS0tLS0tLS3mr4/ml6XnuqLngrnku4XmmL7npLrkuIDmrKEtLS0tLS0tLS0tLVxuICAgIHVwZGF0ZUdpZnRSZWRQb2ludFN0YXR1czpmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgdmFyIGJpZCA9IGRhdGEuYmlkO1xuICAgICAgICB0aGlzLmdpZnRfaWRfbGlzdCA9IHRoaXMuZ2lmdF9pZF9saXN0IHx8IFtdO1xuICAgICAgICB0aGlzLmdpZnRfaWRfbGlzdFtiaWRdID0gZGF0YTtcbiAgICB9LFxuXG4gICAgZ2V0R2lmdFJlZFN0YXR1c0J5QmlkOmZ1bmN0aW9uKGJpZCl7XG4gICAgICAgIGlmKCF0aGlzLmdpZnRfaWRfbGlzdClyZXR1cm47XG4gICAgICAgIHZhciBsaXN0ID0gdGhpcy5naWZ0X2lkX2xpc3RbYmlkXTtcbiAgICAgICAgaWYobGlzdCl7XG4gICAgICAgICAgICByZXR1cm4gbGlzdC5zdGF0dXNcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBzZXRHaWZ0UmVkU3RhdHVzOmZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICBpZighdGhpcy5naWZ0X2lkX2xpc3QpcmV0dXJuO1xuICAgICAgICB2YXIgYmlkID0gZGF0YS5iaWQ7XG4gICAgICAgIHZhciBzdGF0dXMgPSBkYXRhLnN0YXR1cztcbiAgICAgICAgdmFyIGxpc3QgPSB0aGlzLmdpZnRfaWRfbGlzdFtiaWRdO1xuICAgICAgICBpZihsaXN0ICYmIGxpc3Quc3RhdHVzICE9IHN0YXR1cyl7XG4gICAgICAgICAgICBsaXN0LnN0YXR1cyA9IHN0YXR1cztcbiAgICAgICAgfVxuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEFjdGlvbkV2ZW50LlNIT1dfQUNUSVZJVFlfUkVEX1BPSU5ULCBiaWQsIHN0YXR1cyk7XG4gICAgfSxcblxuICAgIHVwZGF0YUZlc3R2YWxSZWRTdGF0dXMoYmlkLGRhdGEpe1xuICAgICAgICBsZXQgcmVkX3N0YXR1cyA9IHRoaXMuZ2V0UmVkUG9pbnRTdGF0dXMoZGF0YSlcbiAgICAgICAgbGV0IGZlc3R2YWxfYmlkID0gTWFpbnVpQ29uc3QuaWNvbi5mZXN0dmFsXG4gICAgICAgIGlmKGJpZCA9PSBBY3Rpb25Db25zdC5BY3Rpb25SYW5rQ29tbW9uVHlwZS5mZXN0dmFsX2RheSl7XG4gICAgICAgICAgICBmZXN0dmFsX2JpZCA9IE1haW51aUNvbnN0Lmljb24uZmVzdHZhbF9zcHJpbmdcbiAgICAgICAgfWVsc2UgaWYoYmlkID09IEFjdGlvbkNvbnN0LkFjdGlvblJhbmtDb21tb25UeXBlLmxvdmVyX2RheSl7XG4gICAgICAgICAgICBmZXN0dmFsX2JpZCA9IE1haW51aUNvbnN0Lmljb24uZmVzdHZhbF9sb3ZlclxuICAgICAgICB9XG4gICAgICAgIE1haW51aUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5zZXRGdW5jdGlvblRpcHNTdGF0dXMoZmVzdHZhbF9iaWQsIHJlZF9zdGF0dXMpXG4gICAgfSxcbiAgICBnZXRSZWRQb2ludFN0YXR1cyhkYXRhKXtcbiAgICAgICAgaWYoIWRhdGEpICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGxldCByZWRfc3RhdHVzID0gZmFsc2UgXG4gICAgICAgIGZvcihsZXQgaz0wO2s8ZGF0YS5sZW5ndGg7KytrKXtcbiAgICAgICAgICAgIGxldCB2ID0gZGF0YVtrXVxuICAgICAgICAgICAgaWYodi5zdGF0dXMgPT0gMSl7XG4gICAgICAgICAgICAgICAgcmVkX3N0YXR1cyA9IHRydWUgXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVkX3N0YXR1c1xuICAgIH0sXG4gICAgdXBkYXRhQ29tYmluZUxvZ2luUmVkU3RhdHVzKGRhdGEpe1xuICAgICAgICBpZighZGF0YSkgcmV0dXJuO1xuICAgICAgICBsZXQgcmVkX3N0YXR1cyA9IGZhbHNlIFxuICAgICAgICBmb3IobGV0IGs9MDtrPGRhdGEubGVuZ3RoOysrayl7XG4gICAgICAgICAgICBsZXQgdiA9IGRhdGFba11cbiAgICAgICAgICAgIGlmKHYuc3RhdHVzID09IDEpe1xuICAgICAgICAgICAgICAgIHJlZF9zdGF0dXMgPSB0cnVlIFxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgTWFpbnVpQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLnNldEZ1bmN0aW9uVGlwc1N0YXR1cyhNYWludWlDb25zdC5pY29uLmNvbWJpbmVfbG9naW4sIHJlZF9zdGF0dXMpXG4gICAgfSxcbiAgICB1cGRhdGFQcmVmZXJlbnRpYWxSZWRTdGF0dXMoIHN0YXR1cywgaWQgKXtcbiAgICAgICAgaWYodHJ1ZSkgIHJldHVybjsgIC8v5pqC5pe25bGP6JS95o6JIOS4jemcgOimgVxuXG4gICAgICAgIC8vIGlkID0gaWQgb3IgTWFpbnVpQ29uc3QuaWNvbi5wcmVmZXJlbnRpYWxcbiAgICAgICAgLy8gaWYgc3RhdHVzIHRoZW5cbiAgICAgICAgLy8gICAgIGlmIHNlbGYucHJlZmVyX2Zpc3J0X2ZsYWcgPT0gbmlsIHRoZW5cbiAgICAgICAgLy8gICAgICAgICBzZWxmLnByZWZlcl9maXNydF9mbGFnID0ge31cbiAgICAgICAgLy8gICAgIGVuZFxuICAgICAgICAvLyAgICAgaWYgbm90IHNlbGYucHJlZmVyX2Zpc3J0X2ZsYWdbaWRdIHRoZW5cbiAgICAgICAgLy8gICAgICAgICBzZWxmLnByZWZlcl9maXNydF9mbGFnW2lkXSA9IHRydWVcbiAgICAgICAgLy8gICAgIGVsc2VcbiAgICAgICAgLy8gICAgICAgICBzdGF0dXMgPSBmYWxzZVxuICAgICAgICAvLyAgICAgZW5kXG4gICAgICAgIC8vIGVuZFxuICAgICAgICAvLyBNYWludWlDb250cm9sbGVyOmdldEluc3RhbmNlKCk6c2V0RnVuY3Rpb25UaXBzU3RhdHVzKGlkLCBzdGF0dXMpXG4gICAgfSxcbiAgICBjbGVhckZ1bmRTcnZEYXRhKCAgKXtcbiAgICAgICAgdGhpcy5mdW5kX2RhdGFzID0ge31cbiAgICB9XG59KTsiXX0=
|