AudioManager.js 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. (function() {
  2. var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
  3. var __module = nodeEnv ? module : {exports:{}};
  4. var __filename = 'preview-scripts/assets/script/game/manager/AudioManager.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, '23fb49P+89BR4lApOFB9Q88', 'AudioManager');
  13. // script/game/manager/AudioManager.ts
  14. "use strict";
  15. var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
  16. function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
  17. return new (P || (P = Promise))(function (resolve, reject) {
  18. function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
  19. function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
  20. function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
  21. step((generator = generator.apply(thisArg, _arguments || [])).next());
  22. });
  23. };
  24. var __generator = (this && this.__generator) || function (thisArg, body) {
  25. var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
  26. return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
  27. function verb(n) { return function (v) { return step([n, v]); }; }
  28. function step(op) {
  29. if (f) throw new TypeError("Generator is already executing.");
  30. while (_) try {
  31. if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
  32. if (y = 0, t) op = [op[0] & 2, t.value];
  33. switch (op[0]) {
  34. case 0: case 1: t = op; break;
  35. case 4: _.label++; return { value: op[1], done: false };
  36. case 5: _.label++; y = op[1]; op = [0]; continue;
  37. case 7: op = _.ops.pop(); _.trys.pop(); continue;
  38. default:
  39. if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
  40. if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
  41. if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
  42. if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
  43. if (t[2]) _.ops.pop();
  44. _.trys.pop(); continue;
  45. }
  46. op = body.call(thisArg, _);
  47. } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
  48. if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
  49. }
  50. };
  51. Object.defineProperty(exports, "__esModule", { value: true });
  52. /**
  53. * 音频模块
  54. * @author 薛鸿潇
  55. */
  56. var AudioManager = /** @class */ (function () {
  57. function AudioManager() {
  58. /** 音乐开关 */
  59. this._switchMusic = true;
  60. /** 音效开关 */
  61. this._switchEffect = true;
  62. /** 音效音量 */
  63. this._effectVolume = 1;
  64. /** 音乐音量 */
  65. this._musicVolume = 1;
  66. /** 暂时音效开关 */
  67. this._switchTempEffect = true;
  68. /** 音频map */
  69. this._map_audio = new Map();
  70. }
  71. /** 初始化 */
  72. AudioManager.prototype.init = function () {
  73. // 获取本地开关设置
  74. var effect = cc.sys.localStorage.getItem("switchEffect");
  75. if (effect) {
  76. if (effect == "true") {
  77. this._switchEffect = true;
  78. }
  79. else {
  80. this._switchEffect = false;
  81. }
  82. }
  83. var music = cc.sys.localStorage.getItem("switchMusic");
  84. if (music) {
  85. if (music == "true") {
  86. this._switchMusic = true;
  87. }
  88. else {
  89. this._switchMusic = false;
  90. }
  91. }
  92. if (this._switchMusic) {
  93. this.playMusic('bgm', true);
  94. }
  95. };
  96. /**
  97. * 播放音乐文件
  98. * @param audio_name 音频名字
  99. * @param loop 是否循环【默认循环】
  100. */
  101. AudioManager.prototype.playMusic = function (audio_name, loop) {
  102. if (loop === void 0) { loop = true; }
  103. return __awaiter(this, void 0, void 0, function () {
  104. var asset;
  105. return __generator(this, function (_a) {
  106. switch (_a.label) {
  107. case 0:
  108. asset = this._map_audio.get(audio_name);
  109. if (!!asset) return [3 /*break*/, 2];
  110. return [4 /*yield*/, mk.loader.load(AUDIO_PATH + audio_name, cc.AudioClip)];
  111. case 1:
  112. asset = _a.sent();
  113. this._map_audio.set(audio_name, asset);
  114. _a.label = 2;
  115. case 2:
  116. mk.audio.playMusic(asset, loop);
  117. return [2 /*return*/];
  118. }
  119. });
  120. });
  121. };
  122. /**
  123. * 播放音效文件
  124. * @param audio_name 音频名字
  125. * @param loop 是否循环【默认不循环】
  126. */
  127. AudioManager.prototype.playEffect = function (audio_name, loop) {
  128. if (loop === void 0) { loop = false; }
  129. return __awaiter(this, void 0, void 0, function () {
  130. var asset;
  131. return __generator(this, function (_a) {
  132. switch (_a.label) {
  133. case 0:
  134. if (!(this._switchEffect && this._switchTempEffect)) return [3 /*break*/, 3];
  135. asset = this._map_audio.get(audio_name);
  136. if (!!asset) return [3 /*break*/, 2];
  137. return [4 /*yield*/, mk.loader.load(AUDIO_PATH + audio_name, cc.AudioClip)];
  138. case 1:
  139. asset = _a.sent();
  140. this._map_audio.set(audio_name, asset);
  141. _a.label = 2;
  142. case 2:
  143. mk.audio.playEffect(asset, loop);
  144. _a.label = 3;
  145. case 3: return [2 /*return*/];
  146. }
  147. });
  148. });
  149. };
  150. /**
  151. * 停止播放音效
  152. * @param audio_id 音频id
  153. */
  154. AudioManager.prototype.stopEffect = function (audio_id) {
  155. mk.audio.stopEffect(audio_id);
  156. };
  157. /**
  158. * 转换音效开关
  159. */
  160. AudioManager.prototype.switchEffectFunc = function () {
  161. this._switchEffect = !this._switchEffect;
  162. if (!this._switchEffect) {
  163. this.setStopAllEffect();
  164. }
  165. cc.sys.localStorage.setItem("switchEffect", this._switchEffect.toString());
  166. };
  167. /**
  168. * 获取音效开关状态
  169. * @returns {boolean}
  170. */
  171. AudioManager.prototype.getSwitchEffect = function () {
  172. return this._switchEffect;
  173. };
  174. /**
  175. * 设置音效声音大小
  176. * value: 0.0 - 1.0
  177. */
  178. AudioManager.prototype.setEffectVolume = function (value) {
  179. this._effectVolume = value;
  180. mk.audio.setEffectVolume(value);
  181. cc.sys.localStorage.setItem("audio", JSON.stringify({ effect: this._effectVolume, music: this._musicVolume }));
  182. };
  183. /**
  184. * 获取音效大小
  185. * @return {number} 0.0 - 1.0
  186. */
  187. AudioManager.prototype.getEffectVolume = function () {
  188. return mk.audio.getEffectVolume();
  189. };
  190. /**
  191. * 恢复当前说暂停的所有音效
  192. */
  193. AudioManager.prototype.setResumeAllEffect = function () {
  194. if (this._switchEffect) {
  195. mk.audio.resumeAllEffects();
  196. }
  197. };
  198. /**
  199. * 停止播放所有正在播放的音效
  200. */
  201. AudioManager.prototype.setStopAllEffect = function () {
  202. mk.audio.stopAllEffects();
  203. };
  204. /** 暂时开启关闭音效开关
  205. * @param state true 打开 false 关闭
  206. */
  207. AudioManager.prototype.setTempEffect = function (state) {
  208. this._switchTempEffect = state;
  209. };
  210. /**
  211. * 转换音乐按钮开关
  212. */
  213. AudioManager.prototype.switchMusicFunc = function () {
  214. this._switchMusic = !this._switchMusic;
  215. if (!this._switchMusic) {
  216. this.stopMusic();
  217. }
  218. else {
  219. this.playMusic('bgm');
  220. }
  221. cc.sys.localStorage.setItem("switchMusic", this._switchMusic.toString());
  222. };
  223. /**
  224. * 获取音乐开关状态
  225. * @returns {boolean}
  226. */
  227. AudioManager.prototype.getSwitchMusic = function () {
  228. return this._switchMusic;
  229. };
  230. /**
  231. * 暂停当前播放音乐
  232. */
  233. AudioManager.prototype.setPauseMusic = function () {
  234. mk.audio.pauseMusic();
  235. };
  236. /**
  237. * 恢复当前被暂停音乐音乐
  238. */
  239. AudioManager.prototype.setResumeMusic = function () {
  240. if (this._switchMusic) {
  241. mk.audio.resumeMusic();
  242. }
  243. };
  244. /**
  245. * 暂停所有 music
  246. */
  247. AudioManager.prototype.stopMusic = function () {
  248. mk.audio.stopMusic();
  249. };
  250. /**
  251. * 设置music音量
  252. * @param value 音量
  253. */
  254. AudioManager.prototype.setMusicVolume = function (value) {
  255. this._musicVolume = value;
  256. mk.audio.setMusicVolume(value);
  257. cc.sys.localStorage.setItem("audio", JSON.stringify({ effect: this._effectVolume, music: this._musicVolume }));
  258. };
  259. /**
  260. * 获取当前music音量
  261. * @returns {number} 音量
  262. */
  263. AudioManager.prototype.getMusicVolume = function () {
  264. return mk.audio.getMusicVolume();
  265. };
  266. /**
  267. * 音乐是否正在播放(验证些方法来实现背景音乐是否播放完成)
  268. * @returns {boolen}
  269. */
  270. AudioManager.prototype.isMusicPlaying = function () {
  271. return mk.audio.isMusicPlaying();
  272. };
  273. /**
  274. * 释放指定音效资源
  275. * @param audio 音频资源
  276. */
  277. AudioManager.prototype.releaseAudio = function (audio) {
  278. if (!audio) {
  279. cc.error("【音频】资源" + audio + "不存在, 释放失败");
  280. return;
  281. }
  282. mk.audio.releaseAudio(audio);
  283. };
  284. /** 停止所有音效 */
  285. AudioManager.prototype.stopAllAudio = function () {
  286. mk.audio.stopAllAudio();
  287. };
  288. /** 卸载所有音频 */
  289. AudioManager.prototype.releaseAllAudio = function () {
  290. mk.audio.releaseAllAudio();
  291. };
  292. return AudioManager;
  293. }());
  294. exports.default = AudioManager;
  295. /** 音频路径 */
  296. var AUDIO_PATH = 'music/';
  297. /** 声音枚举 */
  298. var AUDIO_TYPE;
  299. (function (AUDIO_TYPE) {
  300. AUDIO_TYPE["bgm"] = "Background_music1";
  301. AUDIO_TYPE["button"] = "Button_click";
  302. AUDIO_TYPE["turntableDraw"] = "turntable1";
  303. AUDIO_TYPE["turntableDrawEnd"] = "turntable_2";
  304. AUDIO_TYPE["getGold"] = "Get_gold";
  305. })(AUDIO_TYPE || (AUDIO_TYPE = {}));
  306. cc._RF.pop();
  307. }
  308. if (nodeEnv) {
  309. __define(__module.exports, __require, __module);
  310. }
  311. else {
  312. __quick_compile_project__.registerModuleFunc(__filename, function () {
  313. __define(__module.exports, __require, __module);
  314. });
  315. }
  316. })();
  317. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcc2NyaXB0XFxnYW1lXFxtYW5hZ2VyXFxBdWRpb01hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7O0dBR0c7QUFDSDtJQUFBO1FBRUksV0FBVztRQUNILGlCQUFZLEdBQVksSUFBSSxDQUFDO1FBQ3JDLFdBQVc7UUFDSCxrQkFBYSxHQUFZLElBQUksQ0FBQztRQUN0QyxXQUFXO1FBQ0gsa0JBQWEsR0FBVyxDQUFDLENBQUM7UUFDbEMsV0FBVztRQUNILGlCQUFZLEdBQVcsQ0FBQyxDQUFDO1FBQ2pDLGFBQWE7UUFDTCxzQkFBaUIsR0FBWSxJQUFJLENBQUM7UUFDMUMsWUFBWTtRQUNKLGVBQVUsR0FBa0MsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQXlObEUsQ0FBQztJQXZORyxVQUFVO0lBQ0gsMkJBQUksR0FBWDtRQUNJLFdBQVc7UUFDWCxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDekQsSUFBSSxNQUFNLEVBQUU7WUFDUixJQUFJLE1BQU0sSUFBSSxNQUFNLEVBQUU7Z0JBQ2xCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO2FBQzdCO2lCQUFNO2dCQUNILElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO2FBQzlCO1NBQ0o7UUFFRCxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdkQsSUFBSSxLQUFLLEVBQUU7WUFDUCxJQUFJLEtBQUssSUFBSSxNQUFNLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO2FBQzVCO2lCQUFNO2dCQUNILElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO2FBQzdCO1NBQ0o7UUFF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T0EsQUFzT0MsSUFBQTs7QUFDRCxXQUFXO0FBQ1gsSUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDO0FBQzVCLFdBQVc7QUFDWCxJQUFLLFVBTUo7QUFORCxXQUFLLFVBQVU7SUFDWCx1Q0FBeUIsQ0FBQTtJQUN6QixxQ0FBdUIsQ0FBQTtJQUN2QiwwQ0FBNEIsQ0FBQTtJQUM1Qiw4Q0FBZ0MsQ0FBQTtJQUNoQyxrQ0FBb0IsQ0FBQTtBQUN4QixDQUFDLEVBTkksVUFBVSxLQUFWLFVBQVUsUUFNZCIsImZpbGUiOiIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiDpn7PpopHmqKHlnZdcclxuICogQGF1dGhvciDolpvpuL/mvYdcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEF1ZGlvTWFuYWdlciB7XHJcblxyXG4gICAgLyoqIOmfs+S5kOW8gOWFsyAqL1xyXG4gICAgcHJpdmF0ZSBfc3dpdGNoTXVzaWM6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgLyoqIOmfs+aViOW8gOWFsyAqL1xyXG4gICAgcHJpdmF0ZSBfc3dpdGNoRWZmZWN0OiBib29sZWFuID0gdHJ1ZTtcclxuICAgIC8qKiDpn7PmlYjpn7Pph48gKi9cclxuICAgIHByaXZhdGUgX2VmZmVjdFZvbHVtZTogbnVtYmVyID0gMTtcclxuICAgIC8qKiDpn7PkuZDpn7Pph48gKi9cclxuICAgIHByaXZhdGUgX211c2ljVm9sdW1lOiBudW1iZXIgPSAxO1xyXG4gICAgLyoqIOaaguaXtumfs+aViOW8gOWFsyAqL1xyXG4gICAgcHJpdmF0ZSBfc3dpdGNoVGVtcEVmZmVjdDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICAvKiog6Z+z6aKRbWFwICovXHJcbiAgICBwcml2YXRlIF9tYXBfYXVkaW86IE1hcDxBVURJT19OQU1FLCBjYy5BdWRpb0NsaXA+ID0gbmV3IE1hcCgpO1xyXG5cclxuICAgIC8qKiDliJ3lp4vljJYgKi9cclxuICAgIHB1YmxpYyBpbml0KCkge1xyXG4gICAgICAgIC8vIOiOt+WPluacrOWcsOW8gOWFs+iuvue9rlxyXG4gICAgICAgIGxldCBlZmZlY3QgPSBjYy5zeXMubG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJzd2l0Y2hFZmZlY3RcIik7XHJcbiAgICAgICAgaWYgKGVmZmVjdCkge1xyXG4gICAgICAgICAgICBpZiAoZWZmZWN0ID09IFwidHJ1ZVwiKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zd2l0Y2hFZmZlY3QgPSB0cnVlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc3dpdGNoRWZmZWN0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBtdXNpYyA9IGNjLnN5cy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInN3aXRjaE11c2ljXCIpO1xyXG4gICAgICAgIGlmIChtdXNpYykge1xyXG4gICAgICAgICAgICBpZiAobXVzaWMgPT0gXCJ0cnVlXCIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3N3aXRjaE11c2ljID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3N3aXRjaE11c2ljID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9zd2l0Y2hNdXNpYykge1xyXG4gICAgICAgICAgICB0aGlzLnBsYXlNdXNpYygnYmdtJywgdHJ1ZSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmkq3mlL7pn7PkuZDmlofku7ZcclxuICAgICAqIEBwYXJhbSBhdWRpb19uYW1lIOmfs+mikeWQjeWtl1xyXG4gICAgICogQHBhcmFtIGxvb3Ag5piv5ZCm5b6q546v44CQ6buY6K6k5b6q546v44CRXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBwbGF5TXVzaWMoYXVkaW9fbmFtZTogQVVESU9fTkFNRSwgbG9vcDogYm9vbGVhbiA9IHRydWUpIHtcclxuICAgICAgICBsZXQgYXNzZXQgPSB0aGlzLl9tYXBfYXVkaW8uZ2V0KGF1ZGlvX25hbWUpO1xyXG4gICAgICAgIGlmICghYXNzZXQpIHtcclxuICAgICAgICAgICAgYXNzZXQgPSBhd2FpdCBtay5sb2FkZXIubG9hZChBVURJT19QQVRIICsgYXVkaW9fbmFtZSwgY2MuQXVkaW9DbGlwKTtcclxuICAgICAgICAgICAgdGhpcy5fbWFwX2F1ZGlvLnNldChhdWRpb19uYW1lLCBhc3NldCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG1rLmF1ZGlvLnBsYXlNdXNpYyhhc3NldCwgbG9vcCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmkq3mlL7pn7PmlYjmlofku7ZcclxuICAgICAqIEBwYXJhbSBhdWRpb19uYW1lIOmfs+mikeWQjeWtl1xyXG4gICAgICogQHBhcmFtIGxvb3Ag5piv5ZCm5b6q546v44CQ6buY6K6k5LiN5b6q546v44CRXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBwbGF5RWZmZWN0KGF1ZGlvX25hbWU6IEFVRElPX05BTUUsIGxvb3A6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIGlmICh0aGlzLl9zd2l0Y2hFZmZlY3QgJiYgdGhpcy5fc3dpdGNoVGVtcEVmZmVjdCkge1xyXG4gICAgICAgICAgICBsZXQgYXNzZXQgPSB0aGlzLl9tYXBfYXVkaW8uZ2V0KGF1ZGlvX25hbWUpO1xyXG4gICAgICAgICAgICBpZiAoIWFzc2V0KSB7XHJcbiAgICAgICAgICAgICAgICBhc3NldCA9IGF3YWl0IG1rLmxvYWRlci5sb2FkKEFVRElPX1BBVEggKyBhdWRpb19uYW1lLCBjYy5BdWRpb0NsaXApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwX2F1ZGlvLnNldChhdWRpb19uYW1lLCBhc3NldCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbWsuYXVkaW8ucGxheUVmZmVjdChhc3NldCwgbG9vcCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5YGc5q2i5pKt5pS+6Z+z5pWIXHJcbiAgICAgKiBAcGFyYW0gYXVkaW9faWQg6Z+z6aKRaWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0b3BFZmZlY3QoYXVkaW9faWQ6IG51bWJlcikge1xyXG4gICAgICAgIG1rLmF1ZGlvLnN0b3BFZmZlY3QoYXVkaW9faWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6L2s5o2i6Z+z5pWI5byA5YWzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzd2l0Y2hFZmZlY3RGdW5jKCkge1xyXG4gICAgICAgIHRoaXMuX3N3aXRjaEVmZmVjdCA9ICF0aGlzLl9zd2l0Y2hFZmZlY3Q7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9zd2l0Y2hFZmZlY3QpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRTdG9wQWxsRWZmZWN0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNjLnN5cy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShcInN3aXRjaEVmZmVjdFwiLCB0aGlzLl9zd2l0Y2hFZmZlY3QudG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDojrflj5bpn7PmlYjlvIDlhbPnirbmgIFcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0U3dpdGNoRWZmZWN0KCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zd2l0Y2hFZmZlY3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDorr7nva7pn7PmlYjlo7Dpn7PlpKflsI9cclxuICAgICAqIHZhbHVlOiAwLjAgLSAxLjBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldEVmZmVjdFZvbHVtZSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fZWZmZWN0Vm9sdW1lID0gdmFsdWU7XHJcbiAgICAgICAgbWsuYXVkaW8uc2V0RWZmZWN0Vm9sdW1lKHZhbHVlKTtcclxuICAgICAgICBjYy5zeXMubG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJhdWRpb1wiLCBKU09OLnN0cmluZ2lmeSh7IGVmZmVjdDogdGhpcy5fZWZmZWN0Vm9sdW1lLCBtdXNpYzogdGhpcy5fbXVzaWNWb2x1bWUgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6I635Y+W6Z+z5pWI5aSn5bCPXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IDAuMCAtIDEuMFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0RWZmZWN0Vm9sdW1lKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIG1rLmF1ZGlvLmdldEVmZmVjdFZvbHVtZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5oGi5aSN5b2T5YmN6K+05pqC5YGc55qE5omA5pyJ6Z+z5pWIXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRSZXN1bWVBbGxFZmZlY3QoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3N3aXRjaEVmZmVjdCkge1xyXG4gICAgICAgICAgICBtay5hdWRpby5yZXN1bWVBbGxFZmZlY3RzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5YGc5q2i5pKt5pS+5omA5pyJ5q2j5Zyo5pKt5pS+55qE6Z+z5pWIXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRTdG9wQWxsRWZmZWN0KCkge1xyXG4gICAgICAgIG1rLmF1ZGlvLnN0b3BBbGxFZmZlY3RzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIOaaguaXtuW8gOWQr+WFs+mXremfs+aViOW8gOWFs1xyXG4gICAgICogQHBhcmFtIHN0YXRlIHRydWUgIOaJk+W8gCAgZmFsc2Ug5YWz6ZetXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRUZW1wRWZmZWN0KHN0YXRlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5fc3dpdGNoVGVtcEVmZmVjdCA9IHN0YXRlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6L2s5o2i6Z+z5LmQ5oyJ6ZKu5byA5YWzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzd2l0Y2hNdXNpY0Z1bmMoKSB7XHJcbiAgICAgICAgdGhpcy5fc3dpdGNoTXVzaWMgPSAhdGhpcy5fc3dpdGNoTXVzaWM7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9zd2l0Y2hNdXNpYykge1xyXG4gICAgICAgICAgICB0aGlzLnN0b3BNdXNpYygpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMucGxheU11c2ljKCdiZ20nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2Muc3lzLmxvY2FsU3RvcmFnZS5zZXRJdGVtKFwic3dpdGNoTXVzaWNcIiwgdGhpcy5fc3dpdGNoTXVzaWMudG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDojrflj5bpn7PkuZDlvIDlhbPnirbmgIFcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0U3dpdGNoTXVzaWMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N3aXRjaE11c2ljO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pqC5YGc5b2T5YmN5pKt5pS+6Z+z5LmQXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRQYXVzZU11c2ljKCkge1xyXG4gICAgICAgIG1rLmF1ZGlvLnBhdXNlTXVzaWMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaBouWkjeW9k+WJjeiiq+aaguWBnOmfs+S5kOmfs+S5kFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0UmVzdW1lTXVzaWMoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3N3aXRjaE11c2ljKSB7XHJcbiAgICAgICAgICAgIG1rLmF1ZGlvLnJlc3VtZU11c2ljKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pqC5YGc5omA5pyJIG11c2ljXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdG9wTXVzaWMoKSB7XHJcbiAgICAgICAgbWsuYXVkaW8uc3RvcE11c2ljKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDorr7nva5tdXNpY+mfs+mHj1xyXG4gICAgICogQHBhcmFtIHZhbHVlIOmfs+mHj1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0TXVzaWNWb2x1bWUodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX211c2ljVm9sdW1lID0gdmFsdWU7XHJcbiAgICAgICAgbWsuYXVkaW8uc2V0TXVzaWNWb2x1bWUodmFsdWUpO1xyXG4gICAgICAgIGNjLnN5cy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImF1ZGlvXCIsIEpTT04uc3RyaW5naWZ5KHsgZWZmZWN0OiB0aGlzLl9lZmZlY3RWb2x1bWUsIG11c2ljOiB0aGlzLl9tdXNpY1ZvbHVtZSB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDojrflj5blvZPliY1tdXNpY+mfs+mHj1xyXG4gICAgICogQHJldHVybnMge251bWJlcn0g6Z+z6YePXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRNdXNpY1ZvbHVtZSgpIHtcclxuICAgICAgICByZXR1cm4gbWsuYXVkaW8uZ2V0TXVzaWNWb2x1bWUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOmfs+S5kOaYr+WQpuato+WcqOaSreaUvu+8iOmqjOivgeS6m+aWueazleadpeWunueOsOiDjOaZr+mfs+S5kOaYr+WQpuaSreaUvuWujOaIkO+8iVxyXG4gICAgICogQHJldHVybnMge2Jvb2xlbn1cclxuICAgICAqL1xyXG4gICAgcHVibGljIGlzTXVzaWNQbGF5aW5nKCkge1xyXG4gICAgICAgIHJldHVybiBtay5hdWRpby5pc011c2ljUGxheWluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6YeK5pS+5oyH5a6a6Z+z5pWI6LWE5rqQXHJcbiAgICAgKiBAcGFyYW0gYXVkaW8g6Z+z6aKR6LWE5rqQXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZWxlYXNlQXVkaW8oYXVkaW86IGNjLkF1ZGlvQ2xpcCkge1xyXG4gICAgICAgIGlmICghYXVkaW8pIHtcclxuICAgICAgICAgICAgY2MuZXJyb3IoXCLjgJDpn7PpopHjgJHotYTmupBcIiArIGF1ZGlvICsgXCLkuI3lrZjlnKjvvIwg6YeK5pS+5aSx6LSlXCIpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgbWsuYXVkaW8ucmVsZWFzZUF1ZGlvKGF1ZGlvKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiog5YGc5q2i5omA5pyJ6Z+z5pWIICovXHJcbiAgICBwdWJsaWMgc3RvcEFsbEF1ZGlvKCkge1xyXG4gICAgICAgIG1rLmF1ZGlvLnN0b3BBbGxBdWRpbygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiDljbjovb3miYDmnInpn7PpopEgKi9cclxuICAgIHB1YmxpYyByZWxlYXNlQWxsQXVkaW8oKSB7XHJcbiAgICAgICAgbWsuYXVkaW8ucmVsZWFzZUFsbEF1ZGlvKCk7XHJcbiAgICB9XHJcbn1cclxuLyoqIOmfs+mikei3r+W+hCAqL1xyXG5jb25zdCBBVURJT19QQVRIID0gJ211c2ljLyc7XHJcbi8qKiDlo7Dpn7PmnprkuL4gKi9cclxuZW51bSBBVURJT19UWVBFIHtcclxuICAgIGJnbSA9ICdCYWNrZ3JvdW5kX211c2ljMScsICAgICAgICAgICAvL+iDjOaZr+mfs+S5kFxyXG4gICAgYnV0dG9uID0gJ0J1dHRvbl9jbGljaycsICAgICAgICAgICAgLy/mjInpkq7ngrnlh7vpn7PmlYhcclxuICAgIHR1cm50YWJsZURyYXcgPSAndHVybnRhYmxlMScsICAgICAgICAgICAvL+i9rOebmOaKveWllue7k+adn1xyXG4gICAgdHVybnRhYmxlRHJhd0VuZCA9ICd0dXJudGFibGVfMicsICAgICAgICAgICAvL+i9rOebmOaKveWllumfs+aViFxyXG4gICAgZ2V0R29sZCA9ICdHZXRfZ29sZCcsICAgICAgIC8v6I635Y+W6YeR5biB6Z+z5pWIXHJcbn1cclxuLyoqIOWklumDqOivu+WPluWIsOeahOexu+WeiyAqL1xyXG50eXBlIEFVRElPX05BTUUgPSBrZXlvZiB0eXBlb2YgQVVESU9fVFlQRTsiXX0=