JsbSystem.js 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. (function() {
  2. var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
  3. var __module = nodeEnv ? module : {exports:{}};
  4. var __filename = 'preview-scripts/assets/script/mk/system/JsbSystem.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, '144031h5xRBsa+umFGEHyuG', 'JsbSystem');
  13. // script/mk/system/JsbSystem.ts
  14. "use strict";
  15. var __spreadArrays = (this && this.__spreadArrays) || function () {
  16. for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
  17. for (var r = Array(s), k = 0, i = 0; i < il; i++)
  18. for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
  19. r[k] = a[j];
  20. return r;
  21. };
  22. Object.defineProperty(exports, "__esModule", { value: true });
  23. /**
  24. * Jsb管理类(与安卓Java类或者IOS交互)
  25. * @description
  26. * @author 冯聪
  27. */
  28. var JsbSystem = /** @class */ (function () {
  29. function JsbSystem() {
  30. }
  31. /**
  32. * 是否文件存在
  33. * @param filePath 文件路径
  34. * @returns 是否文件存在 boolean
  35. */
  36. JsbSystem.isFileExit = function (filePath) {
  37. return jsb.fileUtils.isFileExist(filePath);
  38. };
  39. /**
  40. * 获取写入的路径
  41. * @description
  42. * @returns path 写入路径(string)
  43. */
  44. JsbSystem.getWritablePath = function () {
  45. return jsb.fileUtils.getWritablePath();
  46. };
  47. /**
  48. * 调用项目工程静态方法
  49. * @description 调用Android与IOS对应的静态方法
  50. * @param path 调用路径:"org/cocos2dx/javascript/AppActivity":java中的包名(.换成/)+class文件名,就当是路径好了
  51. * @param methodName 调用的方法名:必须public static
  52. * @param methodSignature 方法签名:“(Ljava/lang/String;)Ljava/lang/String;”:()内的是调用的java方法的参数类型,()外面的是返回值类
  53. * @param parameters 参数:是java方法需要传入的参数(可以多个,与methodSignature中()内的数量和类型一一对应)
  54. */
  55. JsbSystem.callStaticMethod = function (path, methodName, methodSignature) {
  56. var _a;
  57. var parameters = [];
  58. for (var _i = 3; _i < arguments.length; _i++) {
  59. parameters[_i - 3] = arguments[_i];
  60. }
  61. (_a = jsb.reflection).callStaticMethod.apply(_a, __spreadArrays([path, methodName, methodSignature], parameters));
  62. };
  63. /**
  64. * Java调用返回测试
  65. * @description 自定义功能 JavaToCocos
  66. */
  67. JsbSystem.backTest = function () {
  68. };
  69. /**
  70. * 更新设备信息
  71. * @description 自定义功能 JavaToCocos
  72. * @param info info(Java返回)
  73. */
  74. JsbSystem.updateDeviceInfo = function (info) {
  75. if (cc.sys.os == cc.sys.OS_ANDROID) {
  76. //GameConst.updateDeviceInfo(info)
  77. }
  78. else if (cc.sys.os == cc.sys.OS_IOS) {
  79. }
  80. };
  81. /**
  82. * 获取设备信息
  83. * @description 自定义功能 CocosToJava
  84. */
  85. JsbSystem.getDeviceInfo = function () {
  86. if (cc.sys.os == cc.sys.OS_ANDROID) {
  87. this.callStaticMethod(this._JSB_ANDROID_PATH, "getDeviceInfo", "()V");
  88. }
  89. else if (cc.sys.os == cc.sys.OS_IOS) {
  90. this.callStaticMethod(this._JSB_IOS_PATH, "getDeviceInfo", "");
  91. }
  92. };
  93. /**
  94. * 获取包名
  95. * @description 自定义功能 CocosToJava
  96. * @returns packName 包名
  97. */
  98. JsbSystem.getPackageName = function () {
  99. var packName = '';
  100. if (cc.sys.os == cc.sys.OS_ANDROID) {
  101. packName = this.callStaticMethod(this._JSB_ANDROID_PATH, "getPackageName", "()Ljava/lang/String;");
  102. }
  103. else if (cc.sys.os == cc.sys.OS_IOS) {
  104. packName = this.callStaticMethod("CsjAdReward", "getPackageName", "");
  105. }
  106. return packName;
  107. };
  108. /**
  109. * 获取微信appid
  110. * @description 自定义功能 CocosToJava
  111. * @returns appid
  112. */
  113. JsbSystem.getWxAppId = function () {
  114. var appid = "";
  115. if (cc.sys.os == cc.sys.OS_ANDROID) {
  116. appid = this.callStaticMethod(this._JSB_ANDROID_PATH, "getWXAppId", "()Ljava/lang/String;");
  117. }
  118. else if (cc.sys.os == cc.sys.OS_IOS) {
  119. appid = this.callStaticMethod("CsjAdReward", "getWXAppId", "");
  120. }
  121. return appid;
  122. };
  123. /**
  124. * 获取广告渠道和相关id
  125. * @description 自定义功能 CocosToJava
  126. * @returns str
  127. */
  128. JsbSystem.getAdvertisingChannel = function () {
  129. var str = "";
  130. if (cc.sys.os == cc.sys.OS_ANDROID) {
  131. str = this.callStaticMethod(this._JSB_ANDROID_PATH, "getAdvertisingChannel", "()Ljava/lang/String;");
  132. }
  133. else if (cc.sys.os == cc.sys.OS_IOS) {
  134. str = this.callStaticMethod("CsjAdReward", "AdvertisingChannel", "");
  135. }
  136. return str;
  137. };
  138. /**
  139. * 复制到剪切板
  140. * @description Andorid功能 CocosToJava
  141. * @param str 剪切板字符串内容
  142. */
  143. JsbSystem.setClipboard = function (str) {
  144. if (cc.sys.os == cc.sys.OS_ANDROID) {
  145. this.callStaticMethod(this._JSB_ANDROID_PATH, "setClipboard", "(Ljava/lang/String;)V", str);
  146. }
  147. else if (cc.sys.os == cc.sys.OS_IOS) {
  148. }
  149. };
  150. /**
  151. * 请求用户授权
  152. * @description Andorid功能 CocosToJava
  153. */
  154. JsbSystem.requestPermission = function () {
  155. if (cc.sys.os == cc.sys.OS_ANDROID) {
  156. this.callStaticMethod(this._JSB_ANDROID_PATH, "requestPermission", "()V");
  157. }
  158. else if (cc.sys.os == cc.sys.OS_IOS) {
  159. this.callStaticMethod("AppController", "requestPermission", "");
  160. }
  161. };
  162. /**
  163. * 获取安卓的版本号
  164. * @description Andorid功能 CocosToJava
  165. */
  166. JsbSystem.getAppVersion = function () {
  167. if (cc.sys.os == cc.sys.OS_ANDROID) {
  168. this.callStaticMethod(this._JSB_ANDROID_PATH, "getAppVersion", "()V");
  169. }
  170. else if (cc.sys.os == cc.sys.OS_IOS) {
  171. this.callStaticMethod("AppController", "getAppVersion", "");
  172. }
  173. };
  174. /**
  175. * 设置安卓得版本号
  176. * @description Andorid功能 JavaToCocos
  177. * @param appVersion app版本号
  178. */
  179. JsbSystem.setAppVersion = function (appVersion) {
  180. if (cc.sys.os == cc.sys.OS_ANDROID) {
  181. // GameConst.appVersion = appVersion;
  182. }
  183. else if (cc.sys.os == cc.sys.OS_IOS) {
  184. }
  185. };
  186. /**
  187. * 安装apk
  188. * @description Andorid功能 CocosToJava
  189. * @param apkName apkName
  190. */
  191. JsbSystem.installApk = function (apkName) {
  192. var fullPath = this.getWritablePath() + apkName;
  193. if (cc.sys.os == cc.sys.OS_ANDROID) {
  194. this.callStaticMethod(this._JSB_ANDROID_PATH, "installApk", "(Ljava/lang/String;)V", fullPath);
  195. }
  196. else if (cc.sys.os == cc.sys.OS_IOS) {
  197. this.callStaticMethod("GameConfig", "installApk:", "");
  198. }
  199. };
  200. /**
  201. * 是否可以启动游戏
  202. * @param packageName 包名
  203. * @param start 如存在是否启动
  204. * @returns ifCan
  205. */
  206. JsbSystem.ifCanStartGame = function (packageName, start) {
  207. var isCan = false;
  208. if (cc.sys.os == cc.sys.OS_ANDROID) {
  209. isCan = this.callStaticMethod(this._JSB_ANDROID_PATH, "isStartGame", "(Ljava/lang/String;Z)Z", packageName, start);
  210. }
  211. else if (cc.sys.os == cc.sys.OS_IOS) {
  212. isCan = this.callStaticMethod("GameConfig", "installApk:", "");
  213. }
  214. return isCan;
  215. };
  216. /**
  217. * 数数事件注册
  218. * @description 数数SDK功能 已经自动放到AS授权后了 前端无需调用
  219. * @returns
  220. */
  221. JsbSystem.setTAEventRegister = function () {
  222. if (cc.sys.os == cc.sys.OS_ANDROID) {
  223. this.callStaticMethod(this._JSB_ANDROID_PATH, "setTAEventRegister", "()V");
  224. }
  225. else if (cc.sys.os == cc.sys.OS_IOS) {
  226. }
  227. };
  228. /**
  229. * 发送自定义事件 自定义功能 CocosToJava
  230. * @description 发送统计事件
  231. * @param key 事件的key值
  232. * @param value 事件的value值
  233. */
  234. JsbSystem.sendEvent = function (key, value) {
  235. if (cc.sys.os == cc.sys.OS_ANDROID) {
  236. this.callStaticMethod(this._JSB_ANDROID_PATH, "sendEvent", "(Ljava/lang/String;Ljava/lang/String;)V", key, value);
  237. }
  238. else if (cc.sys.os == cc.sys.OS_IOS) {
  239. }
  240. };
  241. /**
  242. * 微信授权
  243. * @description 微信SDK功能 CocosToJava
  244. */
  245. JsbSystem.WxAuth = function () {
  246. if (cc.sys.os == cc.sys.OS_ANDROID) {
  247. this.callStaticMethod(this._JSB_ANDROID_PATH, "WxAuth", "()V");
  248. }
  249. else if (cc.sys.os == cc.sys.OS_IOS) {
  250. this.callStaticMethod("AppController", "WxAuth", "");
  251. }
  252. };
  253. /**
  254. * 获取授权code
  255. * @description 微信SDK功能 JavaToCocos
  256. * @param code 微信code(Java返回)
  257. */
  258. JsbSystem.onGetAccessCode = function (code) {
  259. // 暂时注释,需要网络通信
  260. // GameConst.wxCode = code;
  261. // HttpMgr.Inst.wxlogin(true);
  262. };
  263. /**
  264. * 微信打开小游戏
  265. * @description 微信SDK功能 CocosToJava
  266. */
  267. JsbSystem.OpenMiniGame = function () {
  268. if (cc.sys.os == cc.sys.OS_ANDROID) {
  269. this.callStaticMethod(this._JSB_ANDROID_PATH, "OpenMiniGame", "()V");
  270. }
  271. else if (cc.sys.os == cc.sys.OS_IOS) {
  272. this.callStaticMethod("AppController", "WxAuth", "");
  273. }
  274. };
  275. /**
  276. * 分享成微信小游戏
  277. * @description 微信SDK功能 CocosToJava
  278. */
  279. JsbSystem.ShareToMiniGame = function () {
  280. if (cc.sys.os == cc.sys.OS_ANDROID) {
  281. this.callStaticMethod(this._JSB_ANDROID_PATH, "ShareToMiniGame", "()V");
  282. }
  283. else if (cc.sys.os == cc.sys.OS_IOS) {
  284. this.callStaticMethod("AppController", "WxAuth", "");
  285. }
  286. };
  287. /**代码桥在AS中的路径 */
  288. JsbSystem._JSB_ANDROID_PATH = "org/cocos2dx/javascript/thridSdk/ThirdSdkMgr";
  289. /**代码桥在IOS中的路径 */
  290. JsbSystem._JSB_IOS_PATH = "ThirdSdkMgr";
  291. return JsbSystem;
  292. }());
  293. exports.default = JsbSystem;
  294. window['JsbMgr'] = JsbSystem;
  295. cc._RF.pop();
  296. }
  297. if (nodeEnv) {
  298. __define(__module.exports, __require, __module);
  299. }
  300. else {
  301. __quick_compile_project__.registerModuleFunc(__filename, function () {
  302. __define(__module.exports, __require, __module);
  303. });
  304. }
  305. })();
  306. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcc2NyaXB0XFxta1xcc3lzdGVtXFxKc2JTeXN0ZW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7R0FJRztBQUNIO0lBQUE7SUE2UkEsQ0FBQztJQXRSRzs7OztPQUlHO0lBQ1csb0JBQVUsR0FBeEIsVUFBeUIsUUFBZ0I7UUFDckMsT0FBTyxHQUFHLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNXLHlCQUFlLEdBQTdCO1FBQ0ksT0FBTyxHQUFHLENBQUMsU0FBUyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzNDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ1csMEJBQWdCLEdBQTlCLFVBQStCLElBQVksRUFBRSxVQUFrQixFQUFFLGVBQXVCOztRQUFFLG9CQUFrQjthQUFsQixVQUFrQixFQUFsQixxQkFBa0IsRUFBbEIsSUFBa0I7WUFBbEIsbUNBQWtCOztRQUN4RyxDQUFBLEtBQUEsR0FBRyxDQUFDLFVBQVUsQ0FBQSxDQUFDLGdCQUFnQiwyQkFBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLGVBQWUsR0FBSyxVQUFVLEdBQUU7SUFDdEYsQ0FBQztJQUVEOzs7T0FHRztJQUNXLGtCQUFRLEdBQXRCO0lBRUEsQ0FBQztJQUVEOzs7O09BSUc7SUFDVywwQkFBZ0IsR0FBOUIsVUFBK0IsSUFBSTtRQUMvQixJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFO1lBQ2hDLGtDQUFrQztTQUNyQzthQUNJLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUU7U0FFcEM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ1csdUJBQWEsR0FBM0I7UUFDSSxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFB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XHJcbiAqIEpzYueuoeeQhuexuyjkuI7lronljZNKYXZh57G75oiW6ICFSU9T5Lqk5LqSKVxyXG4gKiBAZGVzY3JpcHRpb25cclxuICogQGF1dGhvciDlhq/ogapcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEpzYlN5c3RlbSB7XHJcblxyXG4gICAgLyoq5Luj56CB5qGl5ZyoQVPkuK3nmoTot6/lvoQgKi9cclxuICAgIHByaXZhdGUgc3RhdGljIF9KU0JfQU5EUk9JRF9QQVRIOiBzdHJpbmcgPSBcIm9yZy9jb2NvczJkeC9qYXZhc2NyaXB0L3RocmlkU2RrL1RoaXJkU2RrTWdyXCI7XHJcbiAgICAvKirku6PnoIHmoaXlnKhJT1PkuK3nmoTot6/lvoQgKi9cclxuICAgIHByaXZhdGUgc3RhdGljIF9KU0JfSU9TX1BBVEg6IHN0cmluZyA9IFwiVGhpcmRTZGtNZ3JcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOaYr+WQpuaWh+S7tuWtmOWcqFxyXG4gICAgICogQHBhcmFtIGZpbGVQYXRoIOaWh+S7tui3r+W+hCBcclxuICAgICAqIEByZXR1cm5zIOaYr+WQpuaWh+S7tuWtmOWcqCBib29sZWFuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgaXNGaWxlRXhpdChmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIGpzYi5maWxlVXRpbHMuaXNGaWxlRXhpc3QoZmlsZVBhdGgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6I635Y+W5YaZ5YWl55qE6Lev5b6EXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gXHJcbiAgICAgKiBAcmV0dXJucyBwYXRoIOWGmeWFpei3r+W+hChzdHJpbmcpXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0V3JpdGFibGVQYXRoKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIGpzYi5maWxlVXRpbHMuZ2V0V3JpdGFibGVQYXRoKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICog6LCD55So6aG555uu5bel56iL6Z2Z5oCB5pa55rOVXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gICAgICAgICAgIOiwg+eUqEFuZHJvaWTkuI5JT1Plr7nlupTnmoTpnZnmgIHmlrnms5VcclxuICAgICAqIEBwYXJhbSBwYXRoICAgICAgICAgICAg6LCD55So6Lev5b6E77yaXCJvcmcvY29jb3MyZHgvamF2YXNjcmlwdC9BcHBBY3Rpdml0eVwi77yaamF2YeS4reeahOWMheWQje+8iC7mjaLmiJAv77yJK2NsYXNz5paH5Lu25ZCN77yM5bCx5b2T5piv6Lev5b6E5aW95LqGXHJcbiAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSAgICAgIOiwg+eUqOeahOaWueazleWQje+8muW/hemhu3B1YmxpYyBzdGF0aWNcclxuICAgICAqIEBwYXJhbSBtZXRob2RTaWduYXR1cmUg5pa55rOV562+5ZCN77ya4oCcKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZzvigJ3vvJrvvIjvvInlhoXnmoTmmK/osIPnlKjnmoRqYXZh5pa55rOV55qE5Y+C5pWw57G75Z6L77yM77yI77yJ5aSW6Z2i55qE5piv6L+U5Zue5YC857G7XHJcbiAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyAgICAgIOWPguaVsO+8muaYr2phdmHmlrnms5XpnIDopoHkvKDlhaXnmoTlj4LmlbDvvIjlj6/ku6XlpJrkuKrvvIzkuI5tZXRob2RTaWduYXR1cmXkuK3vvIjvvInlhoXnmoTmlbDph4/lkoznsbvlnovkuIDkuIDlr7nlupTvvIlcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBjYWxsU3RhdGljTWV0aG9kKHBhdGg6IHN0cmluZywgbWV0aG9kTmFtZTogc3RyaW5nLCBtZXRob2RTaWduYXR1cmU6IHN0cmluZywgLi4ucGFyYW1ldGVyczogYW55KTogYW55IHtcclxuICAgICAgICBqc2IucmVmbGVjdGlvbi5jYWxsU3RhdGljTWV0aG9kKHBhdGgsIG1ldGhvZE5hbWUsIG1ldGhvZFNpZ25hdHVyZSwgLi4ucGFyYW1ldGVycyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBKYXZh6LCD55So6L+U5Zue5rWL6K+VXHJcbiAgICAgKiBAZGVzY3JpcHRpb24g6Ieq5a6a5LmJ5Yqf6IO9IEphdmFUb0NvY29zXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYmFja1Rlc3QoKSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pu05paw6K6+5aSH5L+h5oGvXHJcbiAgICAgKiBAZGVzY3JpcHRpb24g6Ieq5a6a5LmJ5Yqf6IO9IEphdmFUb0NvY29zXHJcbiAgICAgKiBAcGFyYW0gaW5mbyAgaW5mbyhKYXZh6L+U5ZueKVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHVwZGF0ZURldmljZUluZm8oaW5mbykge1xyXG4gICAgICAgIGlmIChjYy5zeXMub3MgPT0gY2Muc3lzLk9TX0FORFJPSUQpIHtcclxuICAgICAgICAgICAgLy9HYW1lQ29uc3QudXBkYXRlRGV2aWNlSW5mbyhpbmZvKVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChjYy5zeXMub3MgPT0gY2Muc3lzLk9TX0lPUykge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDojrflj5borr7lpIfkv6Hmga9cclxuICAgICAqIEBkZXNjcmlwdGlvbiDoh6rlrprkuYnlip/og70gQ29jb3NUb0phdmFcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXREZXZpY2VJbmZvKCkge1xyXG4gICAgICAgIGlmIChjYy5zeXMub3MgPT0gY2Muc3lzLk9TX0FORFJPSUQpIHtcclxuICAgICAgICAgICAgdGhpcy5jYWxsU3RhdGljTWV0aG9kKHRoaXMuX0pTQl9BTkRST0lEX1BBVEgsIFwiZ2V0RGV2aWNlSW5mb1wiLCBcIigpVlwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoY2Muc3lzLm9zID09IGNjLnN5cy5PU19JT1MpIHtcclxuICAgICAgICAgICAgdGhpcy5jYWxsU3RhdGljTWV0aG9kKHRoaXMuX0pTQl9JT1NfUEFUSCwgXCJnZXREZXZpY2VJbmZvXCIsIFwiXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiOt+WPluWMheWQjVxyXG4gICAgICogQGRlc2NyaXB0aW9uIOiHquWumuS5ieWKn+iDvSBDb2Nvc1RvSmF2YVxyXG4gICAgICogQHJldHVybnMgICAgIHBhY2tOYW1lIOWMheWQjVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldFBhY2thZ2VOYW1lKCkge1xyXG4gICAgICAgIGxldCBwYWNrTmFtZSA9ICcnO1xyXG4gICAgICAgIGlmIChjYy5zeXMub3MgPT0gY2Muc3lzLk9TX0FORFJPSUQpIHtcclxuICAgICAgICAgICAgcGFja05hbWUgPSB0aGlzLmNhbGxTdGF0aWNNZXRob2QodGhpcy5fSlNCX0FORFJPSURfUEFUSCwgXCJnZXRQYWNrYWdlTmFtZVwiLCBcIigpTGphdmEvbGFuZy9TdHJpbmc7XCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChjYy5zeXMub3MgPT0gY2Muc3lzLk9TX0lPUykge1xyXG4gICAgICAgICAgICBwYWNrTmFtZSA9IHRoaXMuY2FsbFN0YXRpY01ldGhvZChcIkNzakFkUmV3YXJkXCIsIFwiZ2V0UGFja2FnZU5hbWVcIiwgXCJcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwYWNrTmFtZTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiDojrflj5blvq7kv6FhcHBpZFxyXG4gICAgICogQGRlc2NyaXB0aW9uIOiHquWumuS5ieWKn+iDvSBDb2Nvc1RvSmF2YVxyXG4gICAgICogQHJldHVybnMgICAgIGFwcGlkIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldFd4QXBwSWQoKSB7XHJcbiAgICAgICAgbGV0IGFwcGlkID0gXCJcIjtcclxuICAgICAgICBpZiAoY2Muc3lzLm9zID09IGNjLnN5cy5PU19BTkRST0lEKSB7XHJcbiAgICAgICAgICAgIGFwcGlkID0gdGhpcy5jYWxsU3RhdGljTWV0aG9kKHRoaXMuX0pTQl9BTkRST0lEX1BBVEgsIFwiZ2V0V1hBcHBJZFwiLCBcIigpTGphdmEvbGFuZy9TdHJpbmc7XCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChjYy5zeXMub3MgPT0gY2Muc3lzLk9TX0lPUykge1xyXG4gICAgICAgICAgICBhcHBpZCA9IHRoaXMuY2FsbFN0YXRpY01ldGhvZChcIkNzakFkUmV3YXJkXCIsIFwiZ2V0V1hBcHBJZFwiLCBcIlwiLCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhcHBpZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiOt+WPluW5v+WRiua4oOmBk+WSjOebuOWFs2lkXHJcbiAgICAgKiBAZGVzY3JpcHRpb24g6Ieq5a6a5LmJ5Yqf6IO9IENvY29zVG9KYXZhXHJcbiAgICAgKiBAcmV0dXJucyAgICAgc3RyIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEFkdmVydGlzaW5nQ2hhbm5lbCgpOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBzdHIgPSBcIlwiO1xyXG4gICAgICAgIGlmIChjYy5zeXMub3MgPT0gY2Muc3lzLk9TX0FORFJPSUQpIHtcclxuICAgICAgICAgICAgc3RyID0gdGhpcy5jYWxsU3RhdGljTWV0aG9kKHRoaXMuX0pTQl9BTkRST0lEX1BBVEgsIFwiZ2V0QWR2ZXJ0aXNpbmdDaGFubmVsXCIsIFwiKClMamF2YS9sYW5nL1N0cmluZztcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGNjLnN5cy5vcyA9PSBjYy5zeXMuT1NfSU9TKSB7XHJcbiAgICAgICAgICAgIHN0ciA9IHRoaXMuY2FsbFN0YXRpY01ldGhvZChcIkNzakFkUmV3YXJkXCIsIFwiQWR2ZXJ0aXNpbmdDaGFubmVsXCIsIFwiXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3RyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5aSN5Yi25Yiw5Ymq5YiH5p2/XHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQW5kb3JpZOWKn+iDvSBDb2Nvc1RvSmF2YVxyXG4gICAgICogQHBhcmFtIHN0ciAgIOWJquWIh+adv+Wtl+espuS4suWGheWuuVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHNldENsaXBib2FyZChzdHI6IHN0cmluZykge1xyXG4gICAgICAgIGlmIChjYy5zeXMub3MgPT0gY2Muc3lzLk9TX0FORFJPSUQpIHtcclxuICAgICAgICAgICAgdGhpcy5jYWxsU3RhdGljTWV0aG9kKHRoaXMuX0pTQl9BTkRST0lEX1BBVEgsIFwic2V0Q2xpcGJvYXJkXCIsIFwiKExqYXZhL2xhbmcvU3RyaW5nOylWXCIsIHN0cik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGNjLnN5cy5vcyA9PSBjYy5zeXMuT1NfSU9TKSB7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOivt+axgueUqOaIt+aOiOadgyAgXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQW5kb3JpZOWKn+iDvSBDb2Nvc1RvSmF2YVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHJlcXVlc3RQZXJtaXNzaW9uKCkge1xyXG4gICAgICAgIGlmIChjYy5zeXMub3MgPT0gY2Muc3lzLk9TX0FORFJPSUQpIHtcclxuICAgICAgICAgICAgdGhpcy5jYWxsU3RhdGljTWV0aG9kKHRoaXMuX0pTQl9BTkRST0lEX1BBVEgsIFwicmVxdWVzdFBlcm1pc3Npb25cIiwgXCIoKVZcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGNjLnN5cy5vcyA9PSBjYy5zeXMuT1NfSU9TKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsbFN0YXRpY01ldGhvZChcIkFwcENvbnRyb2xsZXJcIiwgXCJyZXF1ZXN0UGVybWlzc2lvblwiLCBcIlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDojrflj5blronljZPnmoTniYjmnKzlj7cgIFxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFuZG9yaWTlip/og70gQ29jb3NUb0phdmFcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXRBcHBWZXJzaW9uKCkge1xyXG4gICAgICAgIGlmIChjYy5zeXMub3MgPT0gY2Muc3lzLk9TX0FORFJPSUQpIHtcclxuICAgICAgICAgICAgdGhpcy5jYWxsU3RhdGljTWV0aG9kKHRoaXMuX0pTQl9BTkRST0lEX1BBVEgsIFwiZ2V0QXBwVmVyc2lvblwiLCBcIigpVlwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoY2Muc3lzLm9zID09IGNjLnN5cy5PU19JT1MpIHtcclxuICAgICAgICAgICAgdGhpcy5jYWxsU3RhdGljTWV0aG9kKFwiQXBwQ29udHJvbGxlclwiLCBcImdldEFwcFZlcnNpb25cIiwgXCJcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiDorr7nva7lronljZPlvpfniYjmnKzlj7dcclxuICAgICogQGRlc2NyaXB0aW9uIEFuZG9yaWTlip/og70gSmF2YVRvQ29jb3NcclxuICAgICogQHBhcmFtICAgICAgIGFwcFZlcnNpb24gYXBw54mI5pys5Y+3XHJcbiAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBzZXRBcHBWZXJzaW9uKGFwcFZlcnNpb246IHN0cmluZykge1xyXG4gICAgICAgIGlmIChjYy5zeXMub3MgPT0gY2Muc3lzLk9TX0FORFJPSUQpIHtcclxuICAgICAgICAgICAgLy8gR2FtZUNvbnN0LmFwcFZlcnNpb24gPSBhcHBWZXJzaW9uO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChjYy5zeXMub3MgPT0gY2Muc3lzLk9TX0lPUykge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlronoo4VhcGtcclxuICAgICAqIEBkZXNjcmlwdGlvbiAgIEFuZG9yaWTlip/og70gQ29jb3NUb0phdmFcclxuICAgICAqIEBwYXJhbSBhcGtOYW1lIGFwa05hbWVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBpbnN0YWxsQXBrKGFwa05hbWU6IHN0cmluZykge1xyXG4gICAgICAgIGxldCBmdWxsUGF0aCA9IHRoaXMuZ2V0V3JpdGFibGVQYXRoKCkgKyBhcGtOYW1lO1xyXG4gICAgICAgIGlmIChjYy5zeXMub3MgPT0gY2Muc3lzLk9TX0FORFJPSUQpIHtcclxuICAgICAgICAgICAgdGhpcy5jYWxsU3RhdGljTWV0aG9kKHRoaXMuX0pTQl9BTkRST0lEX1BBVEgsIFwiaW5zdGFsbEFwa1wiLCBcIihMamF2YS9sYW5nL1N0cmluZzspVlwiLCBmdWxsUGF0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGNjLnN5cy5vcyA9PSBjYy5zeXMuT1NfSU9TKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsbFN0YXRpY01ldGhvZChcIkdhbWVDb25maWdcIiwgXCJpbnN0YWxsQXBrOlwiLCBcIlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICog5piv5ZCm5Y+v5Lul5ZCv5Yqo5ri45oiPXHJcbiAgICAgKiBAcGFyYW0gcGFja2FnZU5hbWUg5YyF5ZCNXHJcbiAgICAgKiBAcGFyYW0gc3RhcnQgICAgICAg5aaC5a2Y5Zyo5piv5ZCm5ZCv5YqoXHJcbiAgICAgKiBAcmV0dXJucyBpZkNhbiAgICAgICAgIFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgaWZDYW5TdGFydEdhbWUocGFja2FnZU5hbWU6IHN0cmluZywgc3RhcnQ6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgaXNDYW4gPSBmYWxzZTtcclxuICAgICAgICBpZiAoY2Muc3lzLm9zID09IGNjLnN5cy5PU19BTkRST0lEKSB7XHJcbiAgICAgICAgICAgIGlzQ2FuID0gdGhpcy5jYWxsU3RhdGljTWV0aG9kKHRoaXMuX0pTQl9BTkRST0lEX1BBVEgsIFwiaXNTdGFydEdhbWVcIiwgXCIoTGphdmEvbGFuZy9TdHJpbmc7WilaXCIsIHBhY2thZ2VOYW1lLCBzdGFydCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGNjLnN5cy5vcyA9PSBjYy5zeXMuT1NfSU9TKSB7XHJcbiAgICAgICAgICAgIGlzQ2FuID0gdGhpcy5jYWxsU3RhdGljTWV0aG9kKFwiR2FtZUNvbmZpZ1wiLCBcImluc3RhbGxBcGs6XCIsIFwiXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaXNDYW47XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmlbDmlbDkuovku7bms6jlhoxcclxuICAgICAqIEBkZXNjcmlwdGlvbiDmlbDmlbBTREvlip/og70g5bey57uP6Ieq5Yqo5pS+5YiwQVPmjojmnYPlkI7kuoYg5YmN56uv5peg6ZyA6LCD55SoXHJcbiAgICAgKiBAcmV0dXJucyBcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHNldFRBRXZlbnRSZWdpc3RlcigpIHtcclxuICAgICAgICBpZiAoY2Muc3lzLm9zID09IGNjLnN5cy5PU19BTkRST0lEKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsbFN0YXRpY01ldGhvZCh0aGlzLl9KU0JfQU5EUk9JRF9QQVRILCBcInNldFRBRXZlbnRSZWdpc3RlclwiLCBcIigpVlwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoY2Muc3lzLm9zID09IGNjLnN5cy5PU19JT1MpIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Y+R6YCB6Ieq5a6a5LmJ5LqL5Lu2IOiHquWumuS5ieWKn+iDvSBDb2Nvc1RvSmF2YVxyXG4gICAgICogQGRlc2NyaXB0aW9uICDlj5HpgIHnu5/orqHkuovku7ZcclxuICAgICAqIEBwYXJhbSBrZXkgICAg5LqL5Lu255qEa2V55YC8XHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgIOS6i+S7tueahHZhbHVl5YC8XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgc2VuZEV2ZW50KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKGNjLnN5cy5vcyA9PSBjYy5zeXMuT1NfQU5EUk9JRCkge1xyXG4gICAgICAgICAgICB0aGlzLmNhbGxTdGF0aWNNZXRob2QodGhpcy5fSlNCX0FORFJPSURfUEFUSCwgXCJzZW5kRXZlbnRcIiwgXCIoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KVZcIiwga2V5LCB2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGNjLnN5cy5vcyA9PSBjYy5zeXMuT1NfSU9TKSB7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOW+ruS/oeaOiOadg1xyXG4gICAgICogQGRlc2NyaXB0aW9uIOW+ruS/oVNES+WKn+iDvSBDb2Nvc1RvSmF2YVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFd4QXV0aCgpIHtcclxuICAgICAgICBpZiAoY2Muc3lzLm9zID09IGNjLnN5cy5PU19BTkRST0lEKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsbFN0YXRpY01ldGhvZCh0aGlzLl9KU0JfQU5EUk9JRF9QQVRILCBcIld4QXV0aFwiLCBcIigpVlwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoY2Muc3lzLm9zID09IGNjLnN5cy5PU19JT1MpIHtcclxuICAgICAgICAgICAgdGhpcy5jYWxsU3RhdGljTWV0aG9kKFwiQXBwQ29udHJvbGxlclwiLCBcIld4QXV0aFwiLCBcIlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDojrflj5bmjojmnYNjb2RlXHJcbiAgICAgKiBAZGVzY3JpcHRpb24g5b6u5L+hU0RL5Yqf6IO9IEphdmFUb0NvY29zXHJcbiAgICAgKiBAcGFyYW0gY29kZSAg5b6u5L+hY29kZShKYXZh6L+U5ZueKVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIG9uR2V0QWNjZXNzQ29kZShjb2RlKSB7XHJcblxyXG4gICAgICAgIC8vIOaaguaXtuazqOmHiizpnIDopoHnvZHnu5zpgJrkv6FcclxuICAgICAgICAvLyBHYW1lQ29uc3Qud3hDb2RlID0gY29kZTtcclxuICAgICAgICAvLyBIdHRwTWdyLkluc3Qud3hsb2dpbih0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOW+ruS/oeaJk+W8gOWwj+a4uOaIj1xyXG4gICAgICogQGRlc2NyaXB0aW9uIOW+ruS/oVNES+WKn+iDvSBDb2Nvc1RvSmF2YVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIE9wZW5NaW5pR2FtZSgpIHtcclxuICAgICAgICBpZiAoY2Muc3lzLm9zID09IGNjLnN5cy5PU19BTkRST0lEKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsbFN0YXRpY01ldGhvZCh0aGlzLl9KU0JfQU5EUk9JRF9QQVRILCBcIk9wZW5NaW5pR2FtZVwiLCBcIigpVlwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoY2Muc3lzLm9zID09IGNjLnN5cy5PU19JT1MpIHtcclxuICAgICAgICAgICAgdGhpcy5jYWxsU3RhdGljTWV0aG9kKFwiQXBwQ29udHJvbGxlclwiLCBcIld4QXV0aFwiLCBcIlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliIbkuqvmiJDlvq7kv6HlsI/muLjmiI9cclxuICAgICAqIEBkZXNjcmlwdGlvbiDlvq7kv6FTREvlip/og70gQ29jb3NUb0phdmFcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBTaGFyZVRvTWluaUdhbWUoKSB7XHJcbiAgICAgICAgaWYgKGNjLnN5cy5vcyA9PSBjYy5zeXMuT1NfQU5EUk9JRCkge1xyXG4gICAgICAgICAgICB0aGlzLmNhbGxTdGF0aWNNZXRob2QodGhpcy5fSlNCX0FORFJPSURfUEFUSCwgXCJTaGFyZVRvTWluaUdhbWVcIiwgXCIoKVZcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGNjLnN5cy5vcyA9PSBjYy5zeXMuT1NfSU9TKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsbFN0YXRpY01ldGhvZChcIkFwcENvbnRyb2xsZXJcIiwgXCJXeEF1dGhcIiwgXCJcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG53aW5kb3dbJ0pzYk1nciddID0gSnNiU3lzdGVtXHJcbiJdfQ==