PlatformTaoBao.js 68 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542
  1. (function() {
  2. var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
  3. var __module = nodeEnv ? module : {exports:{}};
  4. var __filename = 'preview-scripts/assets/script/plat/PlatformTaoBao.js';
  5. var __require = nodeEnv ? function (request) {
  6. return cc.require(request);
  7. } : function (request) {
  8. return __quick_compile_project__.require(request, __filename);
  9. };
  10. function __define (exports, require, module) {
  11. if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict";
  12. cc._RF.push(module, '571a65mEzNKSp3gUn62tiB2', 'PlatformTaoBao');
  13. // script/plat/PlatformTaoBao.ts
  14. "use strict";
  15. var __extends = (this && this.__extends) || (function () {
  16. var extendStatics = function (d, b) {
  17. extendStatics = Object.setPrototypeOf ||
  18. ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
  19. function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
  20. return extendStatics(d, b);
  21. };
  22. return function (d, b) {
  23. extendStatics(d, b);
  24. function __() { this.constructor = d; }
  25. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  26. };
  27. })();
  28. Object.defineProperty(exports, "__esModule", { value: true });
  29. /**
  30. 游戏名称:逍遥仙(淘宝)
  31. 小程序ID:
  32. */
  33. var gameMethod_1 = require("../common/gameMethod");
  34. var Xyc_1 = require("../common/Xyc");
  35. var Config_1 = require("../Config");
  36. var EventConst_1 = require("../data/const/EventConst");
  37. var TypeConst_1 = require("../data/const/TypeConst");
  38. var GameDataCenter_1 = require("../data/GameDataCenter");
  39. var GameController_1 = require("../GameController");
  40. var UIHelp_1 = require("../logic/ui/UIHelp");
  41. var EventMng_1 = require("../manager/EventMng");
  42. var PlatformBase_1 = require("./PlatformBase");
  43. var PlatformTaoBao = /** @class */ (function (_super) {
  44. __extends(PlatformTaoBao, _super);
  45. function PlatformTaoBao() {
  46. var _this = _super.call(this) || this;
  47. _this.AdXiaDanSuc = false; //初始化
  48. // 切换到前台
  49. var listener = function (res) {
  50. // console.log("-----tb.onShow 回调触发111:", res)
  51. console.log("-----tb.onShow 回调触发222:", this.AdXiaDanSuc);
  52. // if (this.AdXiaDanSuc) {
  53. this.AdXiaDanSuc = false;
  54. console.log("有广告任务,发起奖励请求");
  55. // GameDataCenter.adVideo.onTaoBaoXiadanSucc() // 向服务端请求奖励
  56. // }
  57. this.dealQuery(res);
  58. GameDataCenter_1.default.audio.resumeMusic();
  59. // IOS系统,在后台切回时似乎回失去常亮功能,这里再调用一次
  60. my.setKeepScreenOn({
  61. keepScreenOn: true
  62. });
  63. EventMng_1.default.emit(EventConst_1.GameEvent.ON_SHOW_APP);
  64. };
  65. my.onShow(function (res) {
  66. console.log("-----tb.onShow 回调触发:", res);
  67. // if (this.AdXiaDanSuc) {
  68. // this.AdXiaDanSuc = false
  69. // console.log("有广告任务,发起奖励请求")
  70. // //连续请求5次
  71. // if (Config.paySuccAdokId != null) {
  72. // clearInterval(Config.paySuccAdokId)
  73. // Config.paySuccAdokId = null
  74. // }
  75. // Config.paySuccAdokIndex = 0
  76. // Config.paySuccAdokId = setInterval(() => {
  77. // Config.paySuccAdokIndex++
  78. // if (Config.paySuccAdokIndex >= 5) {
  79. // clearInterval(Config.paySuccAdokId)
  80. // Config.paySuccAdokId = null
  81. // }
  82. // GameDataCenter.adVideo.onTaoBaoXiadanSucc() // 向服务端请求奖励
  83. // }, 1000)
  84. // }
  85. _this.dealQuery(res);
  86. GameDataCenter_1.default.audio.resumeMusic();
  87. // IOS系统,在后台切回时似乎回失去常亮功能,这里再调用一次
  88. my.setKeepScreenOn({
  89. keepScreenOn: true
  90. });
  91. EventMng_1.default.emit(EventConst_1.GameEvent.ON_SHOW_APP);
  92. });
  93. // my.offShow(listener)
  94. var hideListener = function (res) {
  95. console.log("-----tb.onHide 回调触发:", res);
  96. // GameDataCenter.plat.instance.reportRole(ReportRoleType.offline)
  97. // this.dealQuery(res)
  98. GameDataCenter_1.default.audio.stopAllEffects();
  99. GameDataCenter_1.default.audio.pauseMusic();
  100. };
  101. my.onHide(function (res) {
  102. console.log("-----tb.onHide 回调触发:", res);
  103. // GameDataCenter.plat.instance.reportRole(ReportRoleType.offline)
  104. // this.dealQuery(res)
  105. GameDataCenter_1.default.audio.stopAllEffects();
  106. GameDataCenter_1.default.audio.pauseMusic();
  107. });
  108. // my.offHide(hideListener);
  109. //该方法不支持ide
  110. // my.setPreferredFramesPerSecond(30);
  111. my.setKeepScreenOn({
  112. keepScreenOn: true
  113. });
  114. if (my.getUpdateManager) {
  115. var updateManager_1 = my.getUpdateManager();
  116. updateManager_1.onCheckForUpdate(function (res) {
  117. //请求完新版本信息的回调
  118. console.log(res.hasUpdate);
  119. });
  120. updateManager_1.onUpdateReady(function () {
  121. my.confirm({
  122. title: '更新提示',
  123. content: '新版本已经准备好,是否重启应用?',
  124. success: function (res) {
  125. if (res.confirm) {
  126. // 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
  127. updateManager_1.applyUpdate();
  128. }
  129. }
  130. });
  131. });
  132. }
  133. // 初始化并获取sdk实例
  134. if (my.tb.getInteractiveSDK) {
  135. _this.sdk = my.tb.getInteractiveSDK(); //调用此函数即可初始化SDK
  136. // 获取运营活动控制器
  137. _this.gameActivityController = _this.sdk.getGameActivityController({
  138. bizCode: 'xiaoyaoxiannew1',
  139. });
  140. }
  141. return _this;
  142. }
  143. PlatformTaoBao.prototype.showLoginView = function () {
  144. var _this = this;
  145. console.log("淘宝小游戏平台静默登录");
  146. EventMng_1.default.emit(EventConst_1.LoadEvent.LOAD_PROGRESS, 0.25, "login");
  147. my.getSystemInfo({
  148. success: function (res) {
  149. console.log("systemInfo: " + JSON.stringify(res));
  150. if (res["platform"] == "Android") {
  151. GameDataCenter_1.default.plat.instance.deviceOS = TypeConst_1.PlatFormDevType.android;
  152. }
  153. else {
  154. GameDataCenter_1.default.plat.instance.deviceOS = TypeConst_1.PlatFormDevType.ios;
  155. }
  156. }
  157. });
  158. // async function GetOpenId() {
  159. // let result
  160. // try {
  161. // result = await window['cloud'].application.httpRequest({
  162. // //不需要完整域名,只需要接口访问路径即可
  163. // 'path': '/welcome',
  164. // 'method': 'GET',
  165. // 'headers': {},
  166. // 'params': {},
  167. // 'body':{},
  168. // //cloudAppId填写开启本地调试的云应用ID,否则会调到云端
  169. // 'exts': { "cloudAppId": "55088", "timeout": 4000 }
  170. // });
  171. // } catch (error) {
  172. // console.log(error)
  173. // }
  174. // }
  175. my.authorize({
  176. scopes: 'scope.userInfo',
  177. success: function (res) {
  178. console.log("淘宝授权:" + JSON.stringify(res));
  179. EventMng_1.default.emit(EventConst_1.LoadEvent.LOAD_PROGRESS, 0.75, "login");
  180. // GetOpenId().then(res => {
  181. // console.log("openId == ",res)
  182. var code = res.accessToken.accessToken;
  183. console.log("淘宝静默登录成功");
  184. var tagInfo = _this.sdk.getChannelTag();
  185. console.log('ChannelTag', tagInfo);
  186. var params = {
  187. pid: Config_1.default.pid,
  188. param: [code]
  189. };
  190. GameController_1.default.network.send(Xyc_1.PlayerLogin.url, params, function (result) {
  191. console.log("后段验证返回");
  192. EventMng_1.default.emit(EventConst_1.LoadEvent.LOAD_PROGRESS, 1, "login");
  193. if (result.type == 1 && result.platBack) {
  194. _this.openId = result.platBack.openid;
  195. _this.loginParams = [result.platBack.token, JSON.stringify(tagInfo)];
  196. console.log("后端验证成功", _this.openId);
  197. // 获取邀请者uuid
  198. var inviter = "";
  199. // if (wx.getEnterOptionsSync) {
  200. // let obj = wx.getEnterOptionsSync()
  201. // if (obj.query && obj.query['inviter']) {
  202. // inviter = obj.query['inviter']
  203. // }
  204. // }
  205. _this.login(inviter);
  206. }
  207. else {
  208. console.log("PlayerLogin.url 返回数据异常");
  209. if (gameMethod_1.gameMethod.isEmpty(result.win) || gameMethod_1.gameMethod.isEmpty(result.win.msgOut)) {
  210. GameDataCenter_1.default.plat.showErrDialog(TypeConst_1.GameErrCode.errGamePlatLogin);
  211. }
  212. }
  213. // 获取用户设置信息
  214. console.log("获取用户设置信息");
  215. my.getSetting({
  216. withSubscriptions: true,
  217. success: function (res) {
  218. console.log("获取用户设置信息 回调:", res);
  219. if (res.authSetting && res.authSetting["scope.userInfo"]) {
  220. // 已授权
  221. console.log("已授权");
  222. GameDataCenter_1.default.plat.instance.hasAuthUserInfo = true;
  223. }
  224. }
  225. });
  226. });
  227. // })
  228. },
  229. fail: function (res) {
  230. // UIHelp.ShowTips("授权失败,请点击右上角的三个点,开启授权后重新登录")
  231. EventMng_1.default.emit(EventConst_1.LoadEvent.LOAD_PROGRESS, 0.75, "login");
  232. // GetOpenId().then(res => {
  233. // console.log("openId == ",res)
  234. // let code = res.accessToken.accessToken;
  235. console.log("淘宝静默登录成功");
  236. var tagInfo = _this.sdk.getChannelTag();
  237. console.log('ChannelTag', tagInfo);
  238. var params = {
  239. pid: Config_1.default.pid,
  240. param: []
  241. };
  242. GameController_1.default.network.send(Xyc_1.PlayerLogin.url, params, function (result) {
  243. console.log("后段验证返回");
  244. EventMng_1.default.emit(EventConst_1.LoadEvent.LOAD_PROGRESS, 1, "login");
  245. if (result.type == 1 && result.platBack) {
  246. _this.openId = result.platBack.openid;
  247. _this.loginParams = [result.platBack.token, JSON.stringify(tagInfo)];
  248. console.log("后端验证成功", _this.openId);
  249. // 获取邀请者uuid
  250. var inviter = "";
  251. // if (wx.getEnterOptionsSync) {
  252. // let obj = wx.getEnterOptionsSync()
  253. // if (obj.query && obj.query['inviter']) {
  254. // inviter = obj.query['inviter']
  255. // }
  256. // }
  257. _this.login(inviter);
  258. }
  259. else {
  260. console.log("PlayerLogin.url 返回数据异常");
  261. if (gameMethod_1.gameMethod.isEmpty(result.win) || gameMethod_1.gameMethod.isEmpty(result.win.msgOut)) {
  262. GameDataCenter_1.default.plat.showErrDialog(TypeConst_1.GameErrCode.errGamePlatLogin);
  263. }
  264. }
  265. // 获取用户设置信息
  266. console.log("获取用户设置信息");
  267. my.getSetting({
  268. withSubscriptions: true,
  269. success: function (res) {
  270. console.log("获取用户设置信息 回调:", res);
  271. if (res.authSetting && res.authSetting["scope.userInfo"]) {
  272. // 已授权
  273. console.log("已授权");
  274. GameDataCenter_1.default.plat.instance.hasAuthUserInfo = true;
  275. }
  276. }
  277. });
  278. });
  279. // })
  280. }
  281. });
  282. };
  283. PlatformTaoBao.prototype.dealQuery = function (res) {
  284. if (res.scene) {
  285. GameDataCenter_1.default.plat.queryparams.scene = res.scene;
  286. }
  287. var shareInfo = this.sdk.getShareInfo();
  288. if (shareInfo['inviter']) {
  289. GameDataCenter_1.default.plat.queryparams.inviter = shareInfo['inviter'];
  290. }
  291. if (shareInfo['sharer']) {
  292. GameDataCenter_1.default.plat.queryparams.sharer = shareInfo['sharer'];
  293. }
  294. EventMng_1.default.emit(EventConst_1.PlatEvent.ON_SCENE_CHANGED);
  295. };
  296. PlatformTaoBao.prototype.pay = function (orderId, order10cs, param) {
  297. my.tb.virtualTrade({
  298. itemId: param.productId,
  299. outOrderId: orderId,
  300. success: function (res) {
  301. // do something
  302. console.log("====== :", res);
  303. if (Config_1.default.paySuccAdokId != null) {
  304. clearInterval(Config_1.default.paySuccAdokId);
  305. Config_1.default.paySuccAdokId = null;
  306. }
  307. Config_1.default.paySuccAdokIndex = 0;
  308. Config_1.default.paySuccAdokId = setInterval(function () {
  309. Config_1.default.paySuccAdokIndex++;
  310. if (Config_1.default.paySuccAdokIndex >= 5) {
  311. clearInterval(Config_1.default.paySuccAdokId);
  312. Config_1.default.paySuccAdokId = null;
  313. }
  314. GameDataCenter_1.default.time.sendAdok();
  315. }, 1000);
  316. },
  317. fail: function (errData) {
  318. // do something
  319. console.log("======支付失败:", errData);
  320. UIHelp_1.default.ShowTips("支付失败");
  321. }
  322. });
  323. };
  324. // 打开客服窗口
  325. PlatformTaoBao.prototype.openService = function () {
  326. // 打开客服窗口
  327. if (my.tb.openMessage) {
  328. my.tb.openMessage({ sellerNick: "摩西游戏化旗舰店" });
  329. }
  330. };
  331. // showRewardAd(adId: string, kid: string, order11Id: string): void {
  332. // if (gameMethod.isEmpty(adId)) {
  333. // UIHelp.ShowTips("暂无广告配置")
  334. // return
  335. // }
  336. // // 获取任务控制器
  337. // let taskController = this.sdk.getTaskController({
  338. // materialId: '33002', //请找淘宝PD协助申请
  339. // materialCode: '6dZEr8Pk2xOTdGGIeUlUQUb' //请找淘宝PD协助申请
  340. // });
  341. // taskController.getTaskList()
  342. // .then(res => {
  343. // console.log("taskList:"+JSON.stringify(res))
  344. // let taskList = res.main
  345. // //找到对应的任务类型,直接触发
  346. // let targetTask = null;
  347. // for (let key in taskList) {
  348. // if (Object.prototype.hasOwnProperty.call(taskList, key)) {
  349. // let taskInfo = taskList[key];
  350. // if (taskInfo.consumeType == adId) {
  351. // targetTask = taskInfo
  352. // break;
  353. // }
  354. // }
  355. // }
  356. // if (targetTask != null) {
  357. // if (targetTask.count >= targetTask.maxCount) {
  358. // UIHelp.ShowTips("当前任务奖励已达领取上限")
  359. // return
  360. // }
  361. // taskController.executeTask(targetTask.id)
  362. // .then(res => {
  363. // this.AdXiaDanSuc = true;
  364. // console.log("executeTask succ:"+JSON.stringify(res))
  365. // })
  366. // .catch(err => {
  367. // UIHelp.ShowTips("淘宝任务执行异常")
  368. // console.log(err)
  369. // });
  370. // } else {
  371. // UIHelp.ShowTips("找不到对应的广告类型")
  372. // }
  373. // })
  374. // .catch(err => {
  375. // UIHelp.ShowTips("淘宝任务获取列表异常")
  376. // console.log(err)
  377. // });
  378. // }
  379. PlatformTaoBao.prototype.showRewardAd = function (adId, kid, order11Id) {
  380. var _this = this;
  381. if (gameMethod_1.gameMethod.isEmpty(adId)) {
  382. UIHelp_1.default.ShowTips(kid + "\u6682\u65E0\u5E7F\u544A\u914D\u7F6E");
  383. return;
  384. }
  385. // 小游戏
  386. if (gameMethod_1.gameMethod.isEmpty(this.RewardedVideoAd)) {
  387. this.RewardedVideoAd = my.createRewardedAd({ adUnitId: adId });
  388. }
  389. var isLoaded = true;
  390. // 按钮或者自定义事件触发
  391. var invoke = function () {
  392. if (isLoaded) {
  393. _this.RewardedVideoAd
  394. .show()
  395. .then(function () {
  396. console.log("广告显示成功");
  397. // 展示成功清除
  398. isLoaded = false;
  399. // this.RewardedVideoAd.offLoad(loadCallback)
  400. })
  401. .catch(function (err) {
  402. console.log("广告组件出现问题", err);
  403. // 再次重试加载一次
  404. _this.RewardedVideoAd
  405. .load()
  406. .then(function () {
  407. console.log("手动加载成功");
  408. invoke();
  409. });
  410. });
  411. }
  412. else {
  413. console.log('广告没加载完成');
  414. }
  415. };
  416. invoke();
  417. // const loadCallback = (res) => {
  418. // console.log('loadCallback:', res);
  419. // isLoaded = true;
  420. // invoke();
  421. // }
  422. // 完成广告回回调
  423. var completeCallback = function (res) {
  424. console.log('completeCallback', res);
  425. // this.AdXiaDanSuc = true;
  426. GameDataCenter_1.default.adVideo.onTaoBaoXiadanSucc();
  427. // 在合适的时机去释放监听
  428. // RewardedVideoAd.offLoad(loadCallback)
  429. // this.RewardedVideoAd.offComplete(completeCallback)
  430. // this.RewardedVideoAd.offClose(closeCallback)
  431. // this.RewardedVideoAd.offError(errorCallback)
  432. };
  433. // 完成广告或者未完成广告,关闭广告会回调
  434. var closeCallback = function (res) {
  435. console.warn('closeCallbak', res);
  436. };
  437. // 广告接口报错的回调
  438. var errorCallback = function (e) {
  439. console.error('errorCallback', e);
  440. };
  441. // 监听广告的事件
  442. // this.RewardedVideoAd.onLoad(loadCallback)
  443. this.RewardedVideoAd.onClose(closeCallback);
  444. this.RewardedVideoAd.onComplete(completeCallback);
  445. this.RewardedVideoAd.onError(errorCallback);
  446. };
  447. PlatformTaoBao.prototype.reportRoleData = function (actionName, type) {
  448. if (type === void 0) { type = 1; }
  449. if (type == 1) {
  450. try {
  451. this.sdk.reportExposure({ actionName: actionName });
  452. }
  453. catch (e) {
  454. console.error(e);
  455. }
  456. }
  457. else {
  458. try {
  459. this.sdk.reportClick({ actionName: actionName });
  460. }
  461. catch (e) {
  462. console.error(e);
  463. }
  464. }
  465. };
  466. //检测新人组件是否开启
  467. PlatformTaoBao.prototype.checkGameActivityController = function (cb) {
  468. if (gameMethod_1.gameMethod.isEmpty(this.gameActivityController)) {
  469. cb(false);
  470. }
  471. this.gameActivityController.getInfo().then(function (res) {
  472. console.log("checkGameActivityController res=>", res);
  473. // if (res.showModule) {
  474. // let params: UserSetZjPram = {
  475. // }
  476. // GameController.network.send(UserSetZj.url, params, (result: SevBack) => {
  477. // })
  478. // }
  479. cb(res.showModule);
  480. }).catch(function (err) {
  481. console.error("checkGameActivityController err:", err);
  482. });
  483. };
  484. //淘宝新人组件
  485. PlatformTaoBao.prototype.openGameActivityController = function () {
  486. var _this = this;
  487. if (gameMethod_1.gameMethod.isEmpty(this.gameActivityController)) {
  488. UIHelp_1.default.ShowTips("淘宝新人组件初始化失败");
  489. return;
  490. }
  491. // 释放监听
  492. this.gameActivityController.offViewClose(function () {
  493. });
  494. this.gameActivityController.getInfo().then(function (res) {
  495. console.log("getInfo=>", res);
  496. if (!gameMethod_1.gameMethod.isEmpty(_this.gameActivityController) && res.showModule) {
  497. _this.gameActivityController.openView().then(function (res) {
  498. console.log("openView=>", res);
  499. // 增加监听
  500. _this.gameActivityController.onViewClose(function () {
  501. });
  502. }).catch(function (err) {
  503. console.error("openGameActivityController err:", err);
  504. });
  505. }
  506. else {
  507. UIHelp_1.default.ShowTips("无法打开新人组件");
  508. }
  509. }).catch(function (err) {
  510. console.error(err);
  511. });
  512. };
  513. //淘宝用户关键行为上报
  514. PlatformTaoBao.prototype.reportUserAction = function (actionId) {
  515. console.log("reportUserAction actionId=>", actionId);
  516. this.sdk.reportScene({
  517. sceneId: 401,
  518. timestamp: Date.now(),
  519. costTime: 2000,
  520. extra: {
  521. raw: actionId
  522. }
  523. });
  524. };
  525. return PlatformTaoBao;
  526. }(PlatformBase_1.default));
  527. exports.default = PlatformTaoBao;
  528. cc._RF.pop();
  529. }
  530. if (nodeEnv) {
  531. __define(__module.exports, __require, __module);
  532. }
  533. else {
  534. __quick_compile_project__.registerModuleFunc(__filename, function () {
  535. __define(__module.exports, __require, __module);
  536. });
  537. }
  538. })();
  539. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0cy9zY3JpcHQvcGxhdC9QbGF0Zm9ybVRhb0Jhby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7O0dBR0c7QUFDSCxtREFBa0Q7QUFDbEQscUNBQTZEO0FBRTdELG9DQUErQjtBQUMvQix1REFBMkU7QUFDM0UscURBQXNHO0FBQ3RHLHlEQUFvRDtBQUNwRCxvREFBK0M7QUFDL0MsNkNBQXdDO0FBQ3hDLGdEQUEyQztBQUMzQywrQ0FBMEM7QUFDMUM7SUFBNEMsa0NBQVk7SUFJcEQ7UUFBQSxZQUNJLGlCQUFPLFNBd0dWO1FBdkdHLEtBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLENBQUEsS0FBSztRQUM5QixRQUFRO1FBQ1IsSUFBTSxRQUFRLEdBQUcsVUFBVSxHQUFHO1lBQzFCLDhDQUE4QztZQUM5QyxPQUFPLENBQUMsR0FBRyxDQUFDLHlCQUF5QixFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQTtZQUN4RCwwQkFBMEI7WUFDMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUE7WUFDeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQTtZQUMzQiwwREFBMEQ7WUFDMUQsSUFBSTtZQUVKLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDbkIsd0JBQWMsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUE7WUFFbEMsZ0NBQWdDO1lBQ2hDLEVBQUUsQ0FBQyxlQUFlLENBQUM7Z0JBQ2YsWUFBWSxFQUFFLElBQUk7YUFDckIsQ0FBQyxDQUFBO1lBRUYsa0JBQVEsQ0FBQyxJQUFJLENBQUMsc0JBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUN4QyxDQUFDLENBQUE7UUFDRCxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQUMsR0FBRztZQUNWLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLEVBQUUsR0FBRyxDQUFDLENBQUE7WUFDeEMs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QUFFLElBQUk7WUFDZCxLQUFLLEVBQUU7Z0JBQ0gsR0FBRyxFQUFFLFFBQVE7YUFDaEI7U0FDSixDQUFDLENBQUM7SUFDUCxDQUFDO0lBQ0wscUJBQUM7QUFBRCxDQS9lQSxBQStlQyxDQS9lMkMsc0JBQVksR0ErZXZEIiwiZmlsZSI6IiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG7muLjmiI/lkI3np7A66YCN6YGl5LuZ77yI5reY5a6d77yJXG7lsI/nqIvluo9JRDpcbiAqL1xuaW1wb3J0IHsgZ2FtZU1ldGhvZCB9IGZyb20gXCIuLi9jb21tb24vZ2FtZU1ldGhvZFwiO1xuaW1wb3J0IHsgUGxheWVyTG9naW4sIFBsYXllckxvZ2luUHJhbSB9IGZyb20gXCIuLi9jb21tb24vWHljXCI7XG5pbXBvcnQgeyBTZXZCYWNrIH0gZnJvbSBcIi4uL2NvbW1vbi9YeXNcIjtcbmltcG9ydCBDb25maWcgZnJvbSBcIi4uL0NvbmZpZ1wiO1xuaW1wb3J0IHsgR2FtZUV2ZW50LCBMb2FkRXZlbnQsIFBsYXRFdmVudCB9IGZyb20gXCIuLi9kYXRhL2NvbnN0L0V2ZW50Q29uc3RcIjtcbmltcG9ydCB7IEFEX1ZJREVPX0tFWSwgR2FtZUVyckNvZGUsIFBheVByb2R1Y3RQYXJhbSwgUGxhdEZvcm1EZXZUeXBlIH0gZnJvbSBcIi4uL2RhdGEvY29uc3QvVHlwZUNvbnN0XCI7XG5pbXBvcnQgR2FtZURhdGFDZW50ZXIgZnJvbSBcIi4uL2RhdGEvR2FtZURhdGFDZW50ZXJcIjtcbmltcG9ydCBHYW1lQ29udHJvbGxlciBmcm9tIFwiLi4vR2FtZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBVSUhlbHAgZnJvbSBcIi4uL2xvZ2ljL3VpL1VJSGVscFwiO1xuaW1wb3J0IEV2ZW50TW5nIGZyb20gXCIuLi9tYW5hZ2VyL0V2ZW50TW5nXCI7XG5pbXBvcnQgUGxhdGZvcm1CYXNlIGZyb20gXCIuL1BsYXRmb3JtQmFzZVwiO1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGxhdGZvcm1UYW9CYW8gZXh0ZW5kcyBQbGF0Zm9ybUJhc2Uge1xuICAgIHNkazogYW55O1xuICAgIGdhbWVBY3Rpdml0eUNvbnRyb2xsZXI6IGFueTtcbiAgICBSZXdhcmRlZFZpZGVvQWQ6IGFueTtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgICAgICB0aGlzLkFkWGlhRGFuU3VjID0gZmFsc2U7Ly/liJ3lp4vljJZcbiAgICAgICAgLy8g5YiH5o2i5Yiw5YmN5Y+wXG4gICAgICAgIGNvbnN0IGxpc3RlbmVyID0gZnVuY3Rpb24gKHJlcykge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCItLS0tLXRiLm9uU2hvdyDlm57osIPop6blj5ExMTE6XCIsIHJlcylcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiLS0tLS10Yi5vblNob3cg5Zue6LCD6Kem5Y+RMjIyOlwiLCB0aGlzLkFkWGlhRGFuU3VjKVxuICAgICAgICAgICAgLy8gaWYgKHRoaXMuQWRYaWFEYW5TdWMpIHtcbiAgICAgICAgICAgIHRoaXMuQWRYaWFEYW5TdWMgPSBmYWxzZVxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLmnInlub/lkYrku7vliqHvvIzlj5HotbflpZblirHor7fmsYJcIilcbiAgICAgICAgICAgIC8vIEdhbWVEYXRhQ2VudGVyLmFkVmlkZW8ub25UYW9CYW9YaWFkYW5TdWNjKCkgLy8g5ZCR5pyN5Yqh56uv6K+35rGC5aWW5YqxXG4gICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgIHRoaXMuZGVhbFF1ZXJ5KHJlcylcbiAgICAgICAgICAgIEdhbWVEYXRhQ2VudGVyLmF1ZGlvLnJlc3VtZU11c2ljKClcblxuICAgICAgICAgICAgLy8gSU9T57O757ufLOWcqOWQjuWPsOWIh+WbnuaXtuS8vOS5juWbnuWkseWOu+W4uOS6ruWKn+iDvSzov5nph4zlho3osIPnlKjkuIDmrKFcbiAgICAgICAgICAgIG15LnNldEtlZXBTY3JlZW5Pbih7XG4gICAgICAgICAgICAgICAga2VlcFNjcmVlbk9uOiB0cnVlXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBFdmVudE1uZy5lbWl0KEdhbWVFdmVudC5PTl9TSE9XX0FQUClcbiAgICAgICAgfVxuICAgICAgICBteS5vblNob3coKHJlcykgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCItLS0tLXRiLm9uU2hvdyDlm57osIPop6blj5E6XCIsIHJlcylcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLkFkWGlhRGFuU3VjKSB7XG4gICAgICAgICAgICAvLyAgICAgdGhpcy5BZFhpYURhblN1YyA9IGZhbHNlXG4gICAgICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCLmnInlub/lkYrku7vliqHvvIzlj5HotbflpZblirHor7fmsYJcIilcbiAgICAgICAgICAgIC8vICAgICAvL+i/nue7reivt+axgjXmrKFcbiAgICAgICAgICAgIC8vICAgICBpZiAoQ29uZmlnLnBheVN1Y2NBZG9rSWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gICAgICAgICBjbGVhckludGVydmFsKENvbmZpZy5wYXlTdWNjQWRva0lkKVxuICAgICAgICAgICAgLy8gICAgICAgICBDb25maWcucGF5U3VjY0Fkb2tJZCA9IG51bGxcbiAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAvLyAgICAgQ29uZmlnLnBheVN1Y2NBZG9rSW5kZXggPSAwXG4gICAgICAgICAgICAvLyAgICAgQ29uZmlnLnBheVN1Y2NBZG9rSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICAvLyAgICAgICAgIENvbmZpZy5wYXlTdWNjQWRva0luZGV4KytcbiAgICAgICAgICAgIC8vICAgICAgICAgaWYgKENvbmZpZy5wYXlTdWNjQWRva0luZGV4ID49IDUpIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoQ29uZmlnLnBheVN1Y2NBZG9rSWQpXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICBDb25maWcucGF5U3VjY0Fkb2tJZCA9IG51bGxcbiAgICAgICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAgICAgLy8gICAgICAgICBHYW1lRGF0YUNlbnRlci5hZFZpZGVvLm9uVGFvQmFvWGlhZGFuU3VjYygpIC8vIOWQkeacjeWKoeerr+ivt+axguWlluWKsVxuICAgICAgICAgICAgLy8gICAgIH0sIDEwMDApXG4gICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgIHRoaXMuZGVhbFF1ZXJ5KHJlcylcbiAgICAgICAgICAgIEdhbWVEYXRhQ2VudGVyLmF1ZGlvLnJlc3VtZU11c2ljKClcblxuICAgICAgICAgICAgLy8gSU9T57O757ufLOWcqOWQjuWPsOWIh+WbnuaXtuS8vOS5juWbnuWkseWOu+W4uOS6ruWKn+iDvSzov5nph4zlho3osIPnlKjkuIDmrKFcbiAgICAgICAgICAgIG15LnNldEtlZXBTY3JlZW5Pbih7XG4gICAgICAgICAgICAgICAga2VlcFNjcmVlbk9uOiB0cnVlXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBFdmVudE1uZy5lbWl0KEdhbWVFdmVudC5PTl9TSE9XX0FQUClcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIG15Lm9mZlNob3cobGlzdGVuZXIpXG4gICAgICAgIGNvbnN0IGhpZGVMaXN0ZW5lciA9IGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiLS0tLS10Yi5vbkhpZGUg5Zue6LCD6Kem5Y+ROlwiLCByZXMpXG4gICAgICAgICAgICAvLyBHYW1lRGF0YUNlbnRlci5wbGF0Lmluc3RhbmNlLnJlcG9ydFJvbGUoUmVwb3J0Um9sZVR5cGUub2ZmbGluZSlcbiAgICAgICAgICAgIC8vIHRoaXMuZGVhbFF1ZXJ5KHJlcylcbiAgICAgICAgICAgIEdhbWVEYXRhQ2VudGVyLmF1ZGlvLnN0b3BBbGxFZmZlY3RzKClcbiAgICAgICAgICAgIEdhbWVEYXRhQ2VudGVyLmF1ZGlvLnBhdXNlTXVzaWMoKVxuICAgICAgICB9XG4gICAgICAgIG15Lm9uSGlkZSgocmVzKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIi0tLS0tdGIub25IaWRlIOWbnuiwg+inpuWPkTpcIiwgcmVzKVxuICAgICAgICAgICAgLy8gR2FtZURhdGFDZW50ZXIucGxhdC5pbnN0YW5jZS5yZXBvcnRSb2xlKFJlcG9ydFJvbGVUeXBlLm9mZmxpbmUpXG4gICAgICAgICAgICAvLyB0aGlzLmRlYWxRdWVyeShyZXMpXG4gICAgICAgICAgICBHYW1lRGF0YUNlbnRlci5hdWRpby5zdG9wQWxsRWZmZWN0cygpXG4gICAgICAgICAgICBHYW1lRGF0YUNlbnRlci5hdWRpby5wYXVzZU11c2ljKClcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIG15Lm9mZkhpZGUoaGlkZUxpc3RlbmVyKTtcbiAgICAgICAgLy/or6Xmlrnms5XkuI3mlK/mjIFpZGVcbiAgICAgICAgLy8gbXkuc2V0UHJlZmVycmVkRnJhbWVzUGVyU2Vjb25kKDMwKTtcblxuICAgICAgICBteS5zZXRLZWVwU2NyZWVuT24oe1xuICAgICAgICAgICAga2VlcFNjcmVlbk9uOiB0cnVlXG4gICAgICAgIH0pXG4gICAgICAgIGlmIChteS5nZXRVcGRhdGVNYW5hZ2VyKSB7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVNYW5hZ2VyID0gbXkuZ2V0VXBkYXRlTWFuYWdlcigpXG5cbiAgICAgICAgICAgIHVwZGF0ZU1hbmFnZXIub25DaGVja0ZvclVwZGF0ZShmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgICAgICAgICAgLy/or7fmsYLlrozmlrDniYjmnKzkv6Hmga/nmoTlm57osINcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXMuaGFzVXBkYXRlKVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgdXBkYXRlTWFuYWdlci5vblVwZGF0ZVJlYWR5KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBteS5jb25maXJtKHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICfmm7TmlrDmj5DnpLonLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50OiAn5paw54mI5pys5bey57uP5YeG5aSH5aW977yM5piv5ZCm6YeN5ZCv5bqU55So77yfJyxcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKHJlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5jb25maXJtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5paw55qE54mI5pys5bey57uP5LiL6L295aW977yM6LCD55SoIGFwcGx5VXBkYXRlIOW6lOeUqOaWsOeJiOacrOW5tumHjeWQr1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZU1hbmFnZXIuYXBwbHlVcGRhdGUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgLy8g5Yid5aeL5YyW5bm26I635Y+Wc2Rr5a6e5L6LXG4gICAgICAgIGlmIChteS50Yi5nZXRJbnRlcmFjdGl2ZVNESykge1xuICAgICAgICAgICAgdGhpcy5zZGsgPSBteS50Yi5nZXRJbnRlcmFjdGl2ZVNESygpOyAvL+iwg+eUqOatpOWHveaVsOWNs+WPr+WIneWni+WMllNES1xuICAgICAgICAgICAgLy8g6I635Y+W6L+Q6JCl5rS75Yqo5o6n5Yi25ZmoXG4gICAgICAgICAgICB0aGlzLmdhbWVBY3Rpdml0eUNvbnRyb2xsZXIgPSB0aGlzLnNkay5nZXRHYW1lQWN0aXZpdHlDb250cm9sbGVyKHtcbiAgICAgICAgICAgICAgICBiaXpDb2RlOiAneGlhb3lhb3hpYW5uZXcxJywvL+ivt+eUs+ivt1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzaG93TG9naW5WaWV3KCk6IHZvaWQge1xuICAgICAgICBjb25zb2xlLmxvZyhcIua3mOWuneWwj+a4uOaIj+W5s+WPsOmdmem7mOeZu+W9lVwiKVxuICAgICAgICBFdmVudE1uZy5lbWl0KExvYWRFdmVudC5MT0FEX1BST0dSRVNTLCAwLjI1LCBcImxvZ2luXCIpXG4gICAgICAgIG15LmdldFN5c3RlbUluZm8oe1xuICAgICAgICAgICAgc3VjY2VzczogKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBzeXN0ZW1JbmZvOiAke0pTT04uc3RyaW5naWZ5KHJlcyl9YCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc1tcInBsYXRmb3JtXCJdID09IFwiQW5kcm9pZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIEdhbWVEYXRhQ2VudGVyLnBsYXQuaW5zdGFuY2UuZGV2aWNlT1MgPSBQbGF0Rm9ybURldlR5cGUuYW5kcm9pZDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBHYW1lRGF0YUNlbnRlci5wbGF0Lmluc3RhbmNlLmRldmljZU9TID0gUGxhdEZvcm1EZXZUeXBlLmlvcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBhc3luYyBmdW5jdGlvbiBHZXRPcGVuSWQoKSB7XG4gICAgICAgIC8vIGxldCByZXN1bHRcbiAgICAgICAgLy8gICAgIHRyeSB7XG4gICAgICAgIC8vICAgICByZXN1bHQgPSBhd2FpdCB3aW5kb3dbJ2Nsb3VkJ10uYXBwbGljYXRpb24uaHR0cFJlcXVlc3Qoe1xuICAgICAgICAvLyAgICAgICAgIC8v5LiN6ZyA6KaB5a6M5pW05Z+f5ZCN77yM5Y+q6ZyA6KaB5o6l5Y+j6K6/6Zeu6Lev5b6E5Y2z5Y+vXG4gICAgICAgIC8vICAgICAgICAgJ3BhdGgnOiAnL3dlbGNvbWUnLFxuICAgICAgICAvLyAgICAgICAgICdtZXRob2QnOiAnR0VUJyxcbiAgICAgICAgLy8gICAgICAgICAnaGVhZGVycyc6IHt9LFxuICAgICAgICAvLyAgICAgICAgICdwYXJhbXMnOiB7fSxcbiAgICAgICAgLy8gICAgICAgICAnYm9keSc6e30sXG4gICAgICAgIC8vICAgICAgICAgLy9jbG91ZEFwcElk5aGr5YaZ5byA5ZCv5pys5Zyw6LCD6K+V55qE5LqR5bqU55SoSUQs5ZCm5YiZ5Lya6LCD5Yiw5LqR56uvXG4gICAgICAgIC8vICAgICAgICAgJ2V4dHMnOiB7IFwiY2xvdWRBcHBJZFwiOiBcIjU1MDg4XCIsIFwidGltZW91dFwiOiA0MDAwIH1cbiAgICAgICAgLy8gICAgIH0pO1xuICAgICAgICAvLyAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gICAgICAgICBjb25zb2xlLmxvZyhlcnJvcilcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuICAgICAgICBteS5hdXRob3JpemUoe1xuICAgICAgICAgICAgc2NvcGVzOiAnc2NvcGUudXNlckluZm8nLFxuICAgICAgICAgICAgc3VjY2VzczogKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLmt5jlrp3mjojmnYPvvJpcIiArIEpTT04uc3RyaW5naWZ5KHJlcykpXG4gICAgICAgICAgICAgICAgRXZlbnRNbmcuZW1pdChMb2FkRXZlbnQuTE9BRF9QUk9HUkVTUywgMC43NSwgXCJsb2dpblwiKVxuICAgICAgICAgICAgICAgIC8vIEdldE9wZW5JZCgpLnRoZW4ocmVzID0+IHsgXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJvcGVuSWQgPT0gXCIscmVzKSBcbiAgICAgICAgICAgICAgICBsZXQgY29kZSA9IHJlcy5hY2Nlc3NUb2tlbi5hY2Nlc3NUb2tlbjtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIua3mOWunemdmem7mOeZu+W9leaIkOWKn1wiKVxuICAgICAgICAgICAgICAgIGxldCB0YWdJbmZvID0gdGhpcy5zZGsuZ2V0Q2hhbm5lbFRhZygpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDaGFubmVsVGFnJywgdGFnSW5mbyk7XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtczogUGxheWVyTG9naW5QcmFtID0ge1xuICAgICAgICAgICAgICAgICAgICBwaWQ6IENvbmZpZy5waWQsXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtOiBbY29kZV1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgR2FtZUNvbnRyb2xsZXIubmV0d29yay5zZW5kKFBsYXllckxvZ2luLnVybCwgcGFyYW1zLCAocmVzdWx0OiBTZXZCYWNrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5ZCO5q616aqM6K+B6L+U5ZueXCIpXG4gICAgICAgICAgICAgICAgICAgIEV2ZW50TW5nLmVtaXQoTG9hZEV2ZW50LkxPQURfUFJPR1JFU1MsIDEsIFwibG9naW5cIilcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC50eXBlID09IDEgJiYgcmVzdWx0LnBsYXRCYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW5JZCA9IHJlc3VsdC5wbGF0QmFjay5vcGVuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9naW5QYXJhbXMgPSBbcmVzdWx0LnBsYXRCYWNrLnRva2VuLCBKU09OLnN0cmluZ2lmeSh0YWdJbmZvKV1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5ZCO56uv6aqM6K+B5oiQ5YqfXCIsIHRoaXMub3BlbklkKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyDojrflj5bpgoDor7fogIV1dWlkXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW52aXRlciA9IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmICh3eC5nZXRFbnRlck9wdGlvbnNTeW5jKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgbGV0IG9iaiA9IHd4LmdldEVudGVyT3B0aW9uc1N5bmMoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGlmIChvYmoucXVlcnkgJiYgb2JqLnF1ZXJ5WydpbnZpdGVyJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgaW52aXRlciA9IG9iai5xdWVyeVsnaW52aXRlciddXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dpbihpbnZpdGVyKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJQbGF5ZXJMb2dpbi51cmwg6L+U5Zue5pWw5o2u5byC5bi4XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHJlc3VsdC53aW4pIHx8IGdhbWVNZXRob2QuaXNFbXB0eShyZXN1bHQud2luLm1zZ091dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHYW1lRGF0YUNlbnRlci5wbGF0LnNob3dFcnJEaWFsb2coR2FtZUVyckNvZGUuZXJyR2FtZVBsYXRMb2dpbilcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyDojrflj5bnlKjmiLforr7nva7kv6Hmga9cbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLojrflj5bnlKjmiLforr7nva7kv6Hmga9cIilcbiAgICAgICAgICAgICAgICAgICAgbXkuZ2V0U2V0dGluZyh7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aXRoU3Vic2NyaXB0aW9uczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MocmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLojrflj5bnlKjmiLforr7nva7kv6Hmga8g5Zue6LCDOlwiLCByZXMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5hdXRoU2V0dGluZyAmJiByZXMuYXV0aFNldHRpbmdbXCJzY29wZS51c2VySW5mb1wiXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDlt7LmjojmnYNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLlt7LmjojmnYNcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2FtZURhdGFDZW50ZXIucGxhdC5pbnN0YW5jZS5oYXNBdXRoVXNlckluZm8gPSB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLy8gfSlcblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZhaWw6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFVJSGVscC5TaG93VGlwcyhcIuaOiOadg+Wksei0pe+8jOivt+eCueWHu+WPs+S4iuinkueahOS4ieS4queCue+8jOW8gOWQr+aOiOadg+WQjumHjeaWsOeZu+W9lVwiKVxuICAgICAgICAgICAgICAgIEV2ZW50TW5nLmVtaXQoTG9hZEV2ZW50LkxPQURfUFJPR1JFU1MsIDAuNzUsIFwibG9naW5cIilcbiAgICAgICAgICAgICAgICAvLyBHZXRPcGVuSWQoKS50aGVuKHJlcyA9PiB7IFxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwib3BlbklkID09IFwiLHJlcykgXG4gICAgICAgICAgICAgICAgLy8gbGV0IGNvZGUgPSByZXMuYWNjZXNzVG9rZW4uYWNjZXNzVG9rZW47XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLmt5jlrp3pnZnpu5jnmbvlvZXmiJDlip9cIilcbiAgICAgICAgICAgICAgICBsZXQgdGFnSW5mbyA9IHRoaXMuc2RrLmdldENoYW5uZWxUYWcoKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQ2hhbm5lbFRhZycsIHRhZ0luZm8pO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbXM6IFBsYXllckxvZ2luUHJhbSA9IHtcbiAgICAgICAgICAgICAgICAgICAgcGlkOiBDb25maWcucGlkLFxuICAgICAgICAgICAgICAgICAgICBwYXJhbTogW11cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgR2FtZUNvbnRyb2xsZXIubmV0d29yay5zZW5kKFBsYXllckxvZ2luLnVybCwgcGFyYW1zLCAocmVzdWx0OiBTZXZCYWNrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5ZCO5q616aqM6K+B6L+U5ZueXCIpXG4gICAgICAgICAgICAgICAgICAgIEV2ZW50TW5nLmVtaXQoTG9hZEV2ZW50LkxPQURfUFJPR1JFU1MsIDEsIFwibG9naW5cIilcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC50eXBlID09IDEgJiYgcmVzdWx0LnBsYXRCYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW5JZCA9IHJlc3VsdC5wbGF0QmFjay5vcGVuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9naW5QYXJhbXMgPSBbcmVzdWx0LnBsYXRCYWNrLnRva2VuLCBKU09OLnN0cmluZ2lmeSh0YWdJbmZvKV1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5ZCO56uv6aqM6K+B5oiQ5YqfXCIsIHRoaXMub3BlbklkKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyDojrflj5bpgoDor7fogIV1dWlkXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW52aXRlciA9IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmICh3eC5nZXRFbnRlck9wdGlvbnNTeW5jKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgbGV0IG9iaiA9IHd4LmdldEVudGVyT3B0aW9uc1N5bmMoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGlmIChvYmoucXVlcnkgJiYgb2JqLnF1ZXJ5WydpbnZpdGVyJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgaW52aXRlciA9IG9iai5xdWVyeVsnaW52aXRlciddXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dpbihpbnZpdGVyKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJQbGF5ZXJMb2dpbi51cmwg6L+U5Zue5pWw5o2u5byC5bi4XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHJlc3VsdC53aW4pIHx8IGdhbWVNZXRob2QuaXNFbXB0eShyZXN1bHQud2luLm1zZ091dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHYW1lRGF0YUNlbnRlci5wbGF0LnNob3dFcnJEaWFsb2coR2FtZUVyckNvZGUuZXJyR2FtZVBsYXRMb2dpbilcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyDojrflj5bnlKjmiLforr7nva7kv6Hmga9cbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLojrflj5bnlKjmiLforr7nva7kv6Hmga9cIilcbiAgICAgICAgICAgICAgICAgICAgbXkuZ2V0U2V0dGluZyh7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aXRoU3Vic2NyaXB0aW9uczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MocmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLojrflj5bnlKjmiLforr7nva7kv6Hmga8g5Zue6LCDOlwiLCByZXMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5hdXRoU2V0dGluZyAmJiByZXMuYXV0aFNldHRpbmdbXCJzY29wZS51c2VySW5mb1wiXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDlt7LmjojmnYNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLlt7LmjojmnYNcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2FtZURhdGFDZW50ZXIucGxhdC5pbnN0YW5jZS5oYXNBdXRoVXNlckluZm8gPSB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLy8gfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZWFsUXVlcnkocmVzKSB7XG4gICAgICAgIGlmIChyZXMuc2NlbmUpIHtcbiAgICAgICAgICAgIEdhbWVEYXRhQ2VudGVyLnBsYXQucXVlcnlwYXJhbXMuc2NlbmUgPSByZXMuc2NlbmVcbiAgICAgICAgfVxuICAgICAgICBsZXQgc2hhcmVJbmZvID0gdGhpcy5zZGsuZ2V0U2hhcmVJbmZvKCk7XG4gICAgICAgIGlmIChzaGFyZUluZm9bJ2ludml0ZXInXSkge1xuICAgICAgICAgICAgR2FtZURhdGFDZW50ZXIucGxhdC5xdWVyeXBhcmFtcy5pbnZpdGVyID0gc2hhcmVJbmZvWydpbnZpdGVyJ11cbiAgICAgICAgfVxuICAgICAgICBpZiAoc2hhcmVJbmZvWydzaGFyZXInXSkge1xuICAgICAgICAgICAgR2FtZURhdGFDZW50ZXIucGxhdC5xdWVyeXBhcmFtcy5zaGFyZXIgPSBzaGFyZUluZm9bJ3NoYXJlciddXG4gICAgICAgIH1cbiAgICAgICAgRXZlbnRNbmcuZW1pdChQbGF0RXZlbnQuT05fU0NFTkVfQ0hBTkdFRClcbiAgICB9XG5cbiAgICBwYXkob3JkZXJJZDogc3RyaW5nLCBvcmRlcjEwY3M6IHN0cmluZywgcGFyYW06IFBheVByb2R1Y3RQYXJhbSk6IHZvaWQge1xuICAgICAgICBteS50Yi52aXJ0dWFsVHJhZGUoe1xuICAgICAgICAgICAgaXRlbUlkOiBwYXJhbS5wcm9kdWN0SWQsXG4gICAgICAgICAgICBvdXRPcmRlcklkOiBvcmRlcklkLFxuICAgICAgICAgICAgc3VjY2VzcyhyZXMpIHtcbiAgICAgICAgICAgICAgICAvLyBkbyBzb21ldGhpbmdcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIj09PT09PSA6XCIsIHJlcylcbiAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLnBheVN1Y2NBZG9rSWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKENvbmZpZy5wYXlTdWNjQWRva0lkKVxuICAgICAgICAgICAgICAgICAgICBDb25maWcucGF5U3VjY0Fkb2tJZCA9IG51bGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQ29uZmlnLnBheVN1Y2NBZG9rSW5kZXggPSAwXG4gICAgICAgICAgICAgICAgQ29uZmlnLnBheVN1Y2NBZG9rSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIENvbmZpZy5wYXlTdWNjQWRva0luZGV4KytcbiAgICAgICAgICAgICAgICAgICAgaWYgKENvbmZpZy5wYXlTdWNjQWRva0luZGV4ID49IDUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoQ29uZmlnLnBheVN1Y2NBZG9rSWQpXG4gICAgICAgICAgICAgICAgICAgICAgICBDb25maWcucGF5U3VjY0Fkb2tJZCA9IG51bGxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBHYW1lRGF0YUNlbnRlci50aW1lLnNlbmRBZG9rKClcbiAgICAgICAgICAgICAgICB9LCAxMDAwKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZhaWwoZXJyRGF0YSkge1xuICAgICAgICAgICAgICAgIC8vIGRvIHNvbWV0aGluZ1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiPT09PT095pSv5LuY5aSx6LSlOlwiLCBlcnJEYXRhKVxuICAgICAgICAgICAgICAgIFVJSGVscC5TaG93VGlwcyhcIuaUr+S7mOWksei0pVwiKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8vIOaJk+W8gOWuouacjeeql+WPo1xuICAgIG9wZW5TZXJ2aWNlKCkge1xuICAgICAgICAvLyDmiZPlvIDlrqLmnI3nqpflj6NcbiAgICAgICAgaWYgKG15LnRiLm9wZW5NZXNzYWdlKSB7XG4gICAgICAgICAgICBteS50Yi5vcGVuTWVzc2FnZSh7IHNlbGxlck5pY2s6IFwi5pGp6KW/5ri45oiP5YyW5peX6Iiw5bqXXCIgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNob3dSZXdhcmRBZChhZElkOiBzdHJpbmcsIGtpZDogc3RyaW5nLCBvcmRlcjExSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KGFkSWQpKSB7XG4gICAgLy8gICAgICAgICBVSUhlbHAuU2hvd1RpcHMoXCLmmoLml6Dlub/lkYrphY3nva5cIilcbiAgICAvLyAgICAgICAgIHJldHVyblxuICAgIC8vICAgICB9XG4gICAgLy8gICAgIC8vIOiOt+WPluS7u+WKoeaOp+WItuWZqFxuICAgIC8vICAgICBsZXQgdGFza0NvbnRyb2xsZXIgPSB0aGlzLnNkay5nZXRUYXNrQ29udHJvbGxlcih7XG4gICAgLy8gICAgICAgICBtYXRlcmlhbElkOiAnMzMwMDInLCAvL+ivt+aJvua3mOWunVBE5Y2P5Yqp55Sz6K+3XG4gICAgLy8gICAgICAgICBtYXRlcmlhbENvZGU6ICc2ZFpFcjhQazJ4T1RkR0dJZVVsVVFVYicgLy/or7fmib7mt5jlrp1QROWNj+WKqeeUs+ivt1xuICAgIC8vICAgICB9KTtcbiAgICAvLyAgICAgdGFza0NvbnRyb2xsZXIuZ2V0VGFza0xpc3QoKVxuICAgIC8vICAgICAudGhlbihyZXMgPT4ge1xuICAgIC8vICAgICAgICAgY29uc29sZS5sb2coXCJ0YXNrTGlzdDpcIitKU09OLnN0cmluZ2lmeShyZXMpKVxuICAgIC8vICAgICAgICAgbGV0IHRhc2tMaXN0ID0gcmVzLm1haW5cbiAgICAvLyAgICAgICAgIC8v5om+5Yiw5a+55bqU55qE5Lu75Yqh57G75Z6L77yM55u05o6l6Kem5Y+RXG4gICAgLy8gICAgICAgICBsZXQgdGFyZ2V0VGFzayA9IG51bGw7XG4gICAgLy8gICAgICAgICBmb3IgKGxldCBrZXkgaW4gdGFza0xpc3QpIHtcbiAgICAvLyAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRhc2tMaXN0LCBrZXkpKSB7XG4gICAgLy8gICAgICAgICAgICAgICAgIGxldCB0YXNrSW5mbyA9IHRhc2tMaXN0W2tleV07XG4gICAgLy8gICAgICAgICAgICAgICAgIGlmICh0YXNrSW5mby5jb25zdW1lVHlwZSA9PSBhZElkKSB7XG4gICAgLy8gICAgICAgICAgICAgICAgICAgICB0YXJnZXRUYXNrID0gdGFza0luZm9cbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgICAgICAgICB9XG4gICAgLy8gICAgICAgICAgICAgfVxuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICAgICAgaWYgKHRhcmdldFRhc2sgIT0gbnVsbCkge1xuICAgIC8vICAgICAgICAgICAgIGlmICh0YXJnZXRUYXNrLmNvdW50ID49IHRhcmdldFRhc2subWF4Q291bnQpIHtcbiAgICAvLyAgICAgICAgICAgICAgICAgVUlIZWxwLlNob3dUaXBzKFwi5b2T5YmN5Lu75Yqh5aWW5Yqx5bey6L6+6aKG5Y+W5LiK6ZmQXCIpXG4gICAgLy8gICAgICAgICAgICAgICAgIHJldHVyblxuICAgIC8vICAgICAgICAgICAgIH1cbiAgICAvLyAgICAgICAgICAgICB0YXNrQ29udHJvbGxlci5leGVjdXRlVGFzayh0YXJnZXRUYXNrLmlkKVxuICAgIC8vICAgICAgICAgICAgIC50aGVuKHJlcyA9PiB7XG4gICAgLy8gICAgICAgICAgICAgICAgIHRoaXMuQWRYaWFEYW5TdWMgPSB0cnVlO1xuICAgIC8vICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImV4ZWN1dGVUYXNrIHN1Y2M6XCIrSlNPTi5zdHJpbmdpZnkocmVzKSlcbiAgICAvLyAgICAgICAgICAgICB9KVxuICAgIC8vICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgIC8vICAgICAgICAgICAgICAgICBVSUhlbHAuU2hvd1RpcHMoXCLmt5jlrp3ku7vliqHmiafooYzlvILluLhcIilcbiAgICAvLyAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKVxuICAgIC8vICAgICAgICAgICAgIH0pO1xuICAgIC8vICAgICAgICAgfSBlbHNlIHtcbiAgICAvLyAgICAgICAgICAgICBVSUhlbHAuU2hvd1RpcHMoXCLmib7kuI3liLDlr7nlupTnmoTlub/lkYrnsbvlnotcIilcbiAgICAvLyAgICAgICAgIH1cbiAgICAvLyAgICAgfSlcbiAgICAvLyAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgLy8gICAgICAgICBVSUhlbHAuU2hvd1RpcHMoXCLmt5jlrp3ku7vliqHojrflj5bliJfooajlvILluLhcIilcbiAgICAvLyAgICAgICAgIGNvbnNvbGUubG9nKGVycilcbiAgICAvLyAgICAgfSk7XG4gICAgLy8gfVxuXG4gICAgc2hvd1Jld2FyZEFkKGFkSWQ6IHN0cmluZywga2lkOiBzdHJpbmcsIG9yZGVyMTFJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkoYWRJZCkpIHtcbiAgICAgICAgICAgIFVJSGVscC5TaG93VGlwcyhgJHtraWR95pqC5peg5bm/5ZGK6YWN572uYClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIC8vIOWwj+a4uOaIj1xuICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHRoaXMuUmV3YXJkZWRWaWRlb0FkKSkge1xuICAgICAgICAgICAgdGhpcy5SZXdhcmRlZFZpZGVvQWQgPSBteS5jcmVhdGVSZXdhcmRlZEFkKHsgYWRVbml0SWQ6IGFkSWQgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaXNMb2FkZWQgPSB0cnVlO1xuICAgICAgICAvLyDmjInpkq7miJbogIXoh6rlrprkuYnkuovku7bop6blj5FcbiAgICAgICAgY29uc3QgaW52b2tlID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzTG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5SZXdhcmRlZFZpZGVvQWRcbiAgICAgICAgICAgICAgICAgICAgLnNob3coKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuW5v+WRiuaYvuekuuaIkOWKn1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWxleekuuaIkOWKn+a4hemZpCBcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzTG9hZGVkID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuUmV3YXJkZWRWaWRlb0FkLm9mZkxvYWQobG9hZENhbGxiYWNrKVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLlub/lkYrnu4Tku7blh7rnjrDpl67pophcIiwgZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWGjeasoemHjeivleWKoOi9veS4gOasoSAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUmV3YXJkZWRWaWRlb0FkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxvYWQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLmiYvliqjliqDovb3miJDlip9cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludm9rZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCflub/lkYrmsqHliqDovb3lrozmiJAnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpbnZva2UoKTtcbiAgICAgICAgLy8gY29uc3QgbG9hZENhbGxiYWNrID0gKHJlcykgPT4ge1xuICAgICAgICAvLyAgICAgY29uc29sZS5sb2coJ2xvYWRDYWxsYmFjazonLCByZXMpO1xuICAgICAgICAvLyAgICAgaXNMb2FkZWQgPSB0cnVlO1xuICAgICAgICAvLyAgICAgaW52b2tlKCk7XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8g5a6M5oiQ5bm/5ZGK5Zue5Zue6LCDICBcbiAgICAgICAgY29uc3QgY29tcGxldGVDYWxsYmFjayA9IChyZXMpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdjb21wbGV0ZUNhbGxiYWNrJywgcmVzKTtcbiAgICAgICAgICAgIC8vIHRoaXMuQWRYaWFEYW5TdWMgPSB0cnVlO1xuICAgICAgICAgICAgR2FtZURhdGFDZW50ZXIuYWRWaWRlby5vblRhb0Jhb1hpYWRhblN1Y2MoKTtcbiAgICAgICAgICAgIC8vIOWcqOWQiOmAgueahOaXtuacuuWOu+mHiuaUvuebkeWQrFxuICAgICAgICAgICAgLy8gUmV3YXJkZWRWaWRlb0FkLm9mZkxvYWQobG9hZENhbGxiYWNrKVxuICAgICAgICAgICAgLy8gdGhpcy5SZXdhcmRlZFZpZGVvQWQub2ZmQ29tcGxldGUoY29tcGxldGVDYWxsYmFjaylcbiAgICAgICAgICAgIC8vIHRoaXMuUmV3YXJkZWRWaWRlb0FkLm9mZkNsb3NlKGNsb3NlQ2FsbGJhY2spXG4gICAgICAgICAgICAvLyB0aGlzLlJld2FyZGVkVmlkZW9BZC5vZmZFcnJvcihlcnJvckNhbGxiYWNrKVxuICAgICAgICB9XG4gICAgICAgIC8vIOWujOaIkOW5v+WRiuaIluiAheacquWujOaIkOW5v+WRiu+8jOWFs+mXreW5v+WRiuS8muWbnuiwgyAgXG4gICAgICAgIGNvbnN0IGNsb3NlQ2FsbGJhY2sgPSAocmVzKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ2Nsb3NlQ2FsbGJhaycsIHJlcylcbiAgICAgICAgfVxuICAgICAgICAvLyDlub/lkYrmjqXlj6PmiqXplJnnmoTlm57osIMgXG4gICAgICAgIGNvbnN0IGVycm9yQ2FsbGJhY2sgPSAoZSkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignZXJyb3JDYWxsYmFjaycsIGUpXG4gICAgICAgIH1cbiAgICAgICAgLy8g55uR5ZCs5bm/5ZGK55qE5LqL5Lu2XG4gICAgICAgIC8vIHRoaXMuUmV3YXJkZWRWaWRlb0FkLm9uTG9hZChsb2FkQ2FsbGJhY2spXG4gICAgICAgIHRoaXMuUmV3YXJkZWRWaWRlb0FkLm9uQ2xvc2UoY2xvc2VDYWxsYmFjaylcbiAgICAgICAgdGhpcy5SZXdhcmRlZFZpZGVvQWQub25Db21wbGV0ZShjb21wbGV0ZUNhbGxiYWNrKVxuICAgICAgICB0aGlzLlJld2FyZGVkVmlkZW9BZC5vbkVycm9yKGVycm9yQ2FsbGJhY2spXG4gICAgfVxuICAgIHJlcG9ydFJvbGVEYXRhKGFjdGlvbk5hbWU6IHN0cmluZywgdHlwZTogTnVtYmVyID0gMSkge1xuICAgICAgICBpZiAodHlwZSA9PSAxKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2RrLnJlcG9ydEV4cG9zdXJlKHsgYWN0aW9uTmFtZTogYWN0aW9uTmFtZSB9KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNkay5yZXBvcnRDbGljayh7IGFjdGlvbk5hbWU6IGFjdGlvbk5hbWUgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG5cbiAgICB9XG4gICAgLy/mo4DmtYvmlrDkurrnu4Tku7bmmK/lkKblvIDlkK9cbiAgICBjaGVja0dhbWVBY3Rpdml0eUNvbnRyb2xsZXIoY2I6IChpc09wZW46IGJvb2xlYW4pID0+IHt9KSB7XG4gICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkodGhpcy5nYW1lQWN0aXZpdHlDb250cm9sbGVyKSkge1xuICAgICAgICAgICAgY2IoZmFsc2UpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5nYW1lQWN0aXZpdHlDb250cm9sbGVyLmdldEluZm8oKS50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiY2hlY2tHYW1lQWN0aXZpdHlDb250cm9sbGVyIHJlcz0+XCIsIHJlcylcbiAgICAgICAgICAgIC8vIGlmIChyZXMuc2hvd01vZHVsZSkge1xuICAgICAgICAgICAgLy8gICAgIGxldCBwYXJhbXM6IFVzZXJTZXRaalByYW0gPSB7XG4gICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgLy8gICAgIEdhbWVDb250cm9sbGVyLm5ldHdvcmsuc2VuZChVc2VyU2V0WmoudXJsLCBwYXJhbXMsIChyZXN1bHQ6IFNldkJhY2spID0+IHtcblxuICAgICAgICAgICAgLy8gICAgIH0pXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICBjYihyZXMuc2hvd01vZHVsZSlcbiAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcImNoZWNrR2FtZUFjdGl2aXR5Q29udHJvbGxlciBlcnI6XCIsIGVycik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvL+a3mOWuneaWsOS6uue7hOS7tlxuICAgIG9wZW5HYW1lQWN0aXZpdHlDb250cm9sbGVyKCkge1xuICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHRoaXMuZ2FtZUFjdGl2aXR5Q29udHJvbGxlcikpIHtcbiAgICAgICAgICAgIFVJSGVscC5TaG93VGlwcyhcIua3mOWuneaWsOS6uue7hOS7tuWIneWni+WMluWksei0pVwiKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgLy8g6YeK5pS+55uR5ZCsXG4gICAgICAgIHRoaXMuZ2FtZUFjdGl2aXR5Q29udHJvbGxlci5vZmZWaWV3Q2xvc2UoKCkgPT4ge1xuXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmdhbWVBY3Rpdml0eUNvbnRyb2xsZXIuZ2V0SW5mbygpLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJnZXRJbmZvPT5cIiwgcmVzKTtcbiAgICAgICAgICAgIGlmICghZ2FtZU1ldGhvZC5pc0VtcHR5KHRoaXMuZ2FtZUFjdGl2aXR5Q29udHJvbGxlcikgJiYgcmVzLnNob3dNb2R1bGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdhbWVBY3Rpdml0eUNvbnRyb2xsZXIub3BlblZpZXcoKS50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJvcGVuVmlldz0+XCIsIHJlcyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIOWinuWKoOebkeWQrFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdhbWVBY3Rpdml0eUNvbnRyb2xsZXIub25WaWV3Q2xvc2UoKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIm9wZW5HYW1lQWN0aXZpdHlDb250cm9sbGVyIGVycjpcIiwgZXJyKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgVUlIZWxwLlNob3dUaXBzKFwi5peg5rOV5omT5byA5paw5Lq657uE5Lu2XCIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8v5reY5a6d55So5oi35YWz6ZSu6KGM5Li65LiK5oqlXG4gICAgcmVwb3J0VXNlckFjdGlvbihhY3Rpb25JZDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwicmVwb3J0VXNlckFjdGlvbiBhY3Rpb25JZD0+XCIsIGFjdGlvbklkKTtcbiAgICAgICAgdGhpcy5zZGsucmVwb3J0U2NlbmUoe1xuICAgICAgICAgICAgc2NlbmVJZDogNDAxLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgY29zdFRpbWU6IDIwMDAsXG4gICAgICAgICAgICBleHRyYToge1xuICAgICAgICAgICAgICAgIHJhdzogYWN0aW9uSWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufSJdfQ==