ResKeeper.js 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. (function() {
  2. var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
  3. var __module = nodeEnv ? module : {exports:{}};
  4. var __filename = 'preview-scripts/assets/script/frameWork/compment/ResKeeper.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, '10b47Uxi1NF/KLFTDJMJSo3', 'ResKeeper');
  13. // script/frameWork/compment/ResKeeper.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. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  29. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  30. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  31. else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
  32. return c > 3 && r && Object.defineProperty(target, key, r), r;
  33. };
  34. var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
  35. function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
  36. return new (P || (P = Promise))(function (resolve, reject) {
  37. function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
  38. function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
  39. function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
  40. step((generator = generator.apply(thisArg, _arguments || [])).next());
  41. });
  42. };
  43. var __generator = (this && this.__generator) || function (thisArg, body) {
  44. var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
  45. return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
  46. function verb(n) { return function (v) { return step([n, v]); }; }
  47. function step(op) {
  48. if (f) throw new TypeError("Generator is already executing.");
  49. while (_) try {
  50. 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;
  51. if (y = 0, t) op = [op[0] & 2, t.value];
  52. switch (op[0]) {
  53. case 0: case 1: t = op; break;
  54. case 4: _.label++; return { value: op[1], done: false };
  55. case 5: _.label++; y = op[1]; op = [0]; continue;
  56. case 7: op = _.ops.pop(); _.trys.pop(); continue;
  57. default:
  58. if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
  59. if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
  60. if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
  61. if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
  62. if (t[2]) _.ops.pop();
  63. _.trys.pop(); continue;
  64. }
  65. op = body.call(thisArg, _);
  66. } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
  67. if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
  68. }
  69. };
  70. Object.defineProperty(exports, "__esModule", { value: true });
  71. exports.ResKeeper = void 0;
  72. var AssetsBundleMgr_1 = require("../../utils/AssetsBundleMgr");
  73. var ResBaseAsset_1 = require("./ResBaseAsset");
  74. var ccclass = cc._decorator.ccclass;
  75. /**
  76. * 销毁时自动释放资源组件
  77. */
  78. // @ccclass("ResKeeper")
  79. var ResKeeper = /** @class */ (function (_super) {
  80. __extends(ResKeeper, _super);
  81. function ResKeeper() {
  82. var _this = _super !== null && _super.apply(this, arguments) || this;
  83. _this._i_LoadedAssets = undefined;
  84. return _this;
  85. }
  86. ResKeeper_1 = ResKeeper;
  87. Object.defineProperty(ResKeeper.prototype, "m_LoadedAssets", {
  88. /** 已加载资源列表 */
  89. get: function () {
  90. if (!this._i_LoadedAssets) {
  91. this._i_LoadedAssets = [];
  92. }
  93. return this._i_LoadedAssets;
  94. },
  95. enumerable: false,
  96. configurable: true
  97. });
  98. /**
  99. * 从目标节点或其父节点递归查找一个资源挂载(销毁时自动释放)组件
  100. * @param attachNode 目标节点
  101. * @param autoCreate 当目标节点找不到 ResKeeper 时是否自动创建一个
  102. */
  103. ResKeeper.Get = function (attachNode, autoCreate) {
  104. if (autoCreate === void 0) { autoCreate = false; }
  105. if (attachNode && cc.isValid(attachNode)) {
  106. var ret = attachNode.getComponent(ResKeeper_1);
  107. if (!ret) {
  108. if (autoCreate) {
  109. return attachNode.addComponent(ResKeeper_1);
  110. }
  111. else {
  112. if (!attachNode.parent) {
  113. console.error("ResKeeper >> attachNode \u7684\u7236\u8282\u70B9\u4E0D\u5B58\u5728 >> attachNode.name = " + attachNode.name);
  114. return null;
  115. }
  116. return ResKeeper_1.Get(attachNode.parent, autoCreate);
  117. }
  118. }
  119. return ret;
  120. }
  121. console.error("ResKeeper >> attachNode \u4E3A\u7A7A\u8282\u70B9");
  122. return null;
  123. };
  124. /**
  125. * 加载自动释放的资源
  126. * @param resCollector
  127. */
  128. ResKeeper.prototype.LoadResCollector = function (resCollector, promise) {
  129. return __awaiter(this, void 0, Promise, function () {
  130. var that, __bindAutoReleaseAssetToComp, _onResLoaded, proArr;
  131. var _this = this;
  132. return __generator(this, function (_a) {
  133. that = this;
  134. __bindAutoReleaseAssetToComp = function (url, res) {
  135. // 性能调优: 调试状态才打印加载的 url
  136. // ResKeeper.DEBUG && console.log(`url: ${url} 加载成功`)
  137. if (cc.isValid(that)) {
  138. that.AutoReleaseAsset(res, url);
  139. }
  140. else {
  141. console.warn("资源加载完毕时,节点已不可用");
  142. }
  143. };
  144. _onResLoaded = function (url, err, res, resolve) {
  145. if (err) {
  146. console.error(err);
  147. /** 释放加载项 */
  148. resolve();
  149. return;
  150. }
  151. __bindAutoReleaseAssetToComp(url, res);
  152. resolve();
  153. };
  154. proArr = [];
  155. resCollector.GetResList().forEach(function (loadAssetItem) {
  156. proArr.push(new Promise(function (resolve, reject) {
  157. switch (loadAssetItem.typ) {
  158. case ResBaseAsset_1.EResType.Prefab:
  159. {
  160. var bundleUrl_1 = loadAssetItem.data;
  161. AssetsBundleMgr_1.default.loadBundle(bundleUrl_1.bundle, function (err, bundle) {
  162. if (err) {
  163. console.log("SpineNode:bundle load failed:", err);
  164. return;
  165. }
  166. // let cacheAsset = bundle.get(bundleUrl.url, cc.Prefab);
  167. // if (cacheAsset) {
  168. // _onResLoaded(bundleUrl.url, err, cacheAsset, resolve);
  169. // } else {
  170. bundle.load(bundleUrl_1.url, cc.Prefab, function (err, asset) {
  171. _onResLoaded(bundleUrl_1.url, err, asset, resolve);
  172. });
  173. // }
  174. });
  175. }
  176. break;
  177. case ResBaseAsset_1.EResType.Spine:
  178. {
  179. var bundleUrl_2 = loadAssetItem.data;
  180. AssetsBundleMgr_1.default.loadBundle(bundleUrl_2.bundle, function (err, bundle) {
  181. if (err) {
  182. console.log("SpineNode:bundle load failed:", err);
  183. return;
  184. }
  185. // let cacheAsset = bundle.get(bundleUrl.url, cc.Prefab);
  186. // if (cacheAsset) {
  187. // _onResLoaded(bundleUrl.url, err, cacheAsset, resolve);
  188. // } else {
  189. bundle.load(bundleUrl_2.url, sp.SkeletonData, function (err, asset) {
  190. _onResLoaded(bundleUrl_2.url, err, asset, resolve);
  191. });
  192. // }
  193. });
  194. }
  195. break;
  196. case ResBaseAsset_1.EResType.SpriteFrame:
  197. {
  198. var bundleUrl_3 = loadAssetItem.data;
  199. AssetsBundleMgr_1.default.loadBundle(bundleUrl_3.bundle, function (err, bundle) {
  200. if (err) {
  201. console.log("SpriteFrame:bundle load failed:", err);
  202. return;
  203. }
  204. bundle.load(bundleUrl_3.url, cc.SpriteFrame, function (err, asset) {
  205. _onResLoaded(bundleUrl_3.url, err, asset, resolve);
  206. });
  207. });
  208. }
  209. break;
  210. case ResBaseAsset_1.EResType.Json:
  211. {
  212. var bundleUrl_4 = loadAssetItem.data;
  213. AssetsBundleMgr_1.default.loadBundle(bundleUrl_4.bundle, function (err, bundle) {
  214. if (err) {
  215. console.log("SpriteFrame:bundle load failed:", err);
  216. return;
  217. }
  218. bundle.load(bundleUrl_4.url, cc.JsonAsset, function (err, asset) {
  219. _onResLoaded(bundleUrl_4.url, err, asset, resolve);
  220. });
  221. });
  222. }
  223. break;
  224. default:
  225. {
  226. console.error("\u3010ResKeeper\u3011 >> \u672A\u5904\u7406\u7684\u8D44\u6E90\u52A0\u8F7D\u7C7B\u578B " + loadAssetItem.typ);
  227. }
  228. break;
  229. }
  230. }));
  231. });
  232. return [2 /*return*/, promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
  233. return __generator(this, function (_a) {
  234. switch (_a.label) {
  235. case 0: return [4 /*yield*/, Promise.all(proArr).then(function (values) {
  236. resolve();
  237. })];
  238. case 1:
  239. _a.sent();
  240. return [2 /*return*/];
  241. }
  242. });
  243. }); })];
  244. });
  245. });
  246. };
  247. /**
  248. * 添加自动释放引用
  249. * @param keepItem
  250. */
  251. ResKeeper.prototype.AutoReleaseAsset = function (asset, url) {
  252. /** Borrow 时自动添加了引用计数,销毁时,解引用即可 */
  253. this.m_LoadedAssets.push(new AssetKeepItem(asset, url));
  254. };
  255. /**
  256. * 释放所有引用的资源
  257. */
  258. ResKeeper.prototype.onDestroy = function () {
  259. if (this._i_LoadedAssets) {
  260. this._i_LoadedAssets.forEach(function (it) {
  261. if (it && it.DecRef) {
  262. it.DecRef();
  263. }
  264. });
  265. this._i_LoadedAssets = undefined;
  266. }
  267. };
  268. var ResKeeper_1;
  269. /** 是否调试状态 */
  270. ResKeeper.DEBUG = CC_PREVIEW ? true : false;
  271. ResKeeper = ResKeeper_1 = __decorate([
  272. ccclass
  273. ], ResKeeper);
  274. return ResKeeper;
  275. }(cc.Component));
  276. exports.ResKeeper = ResKeeper;
  277. var AssetKeepItem = /** @class */ (function () {
  278. function AssetKeepItem(asset, url) {
  279. this.mAsset = asset;
  280. this.mUrl = url;
  281. this.AddRef();
  282. }
  283. AssetKeepItem.prototype.AddRef = function () {
  284. this.mAsset.addRef();
  285. };
  286. AssetKeepItem.prototype.DecRef = function () {
  287. this.mAsset.decRef();
  288. };
  289. return AssetKeepItem;
  290. }());
  291. cc._RF.pop();
  292. }
  293. if (nodeEnv) {
  294. __define(__module.exports, __require, __module);
  295. }
  296. else {
  297. __quick_compile_project__.registerModuleFunc(__filename, function () {
  298. __define(__module.exports, __require, __module);
  299. });
  300. }
  301. })();
  302. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0cy9zY3JpcHQvZnJhbWVXb3JrL2NvbXBtZW50L1Jlc0tlZXBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0RBQTBEO0FBQzFELCtDQUEwQztBQUlsQyxJQUFBLE9BQU8sR0FBSyxFQUFFLENBQUMsVUFBVSxRQUFsQixDQUFtQjtBQWdCbEM7O0dBRUc7QUFDSCx3QkFBd0I7QUFFeEI7SUFBK0IsNkJBQVk7SUFBM0M7UUFBQSxxRUFxS0M7UUFsS1cscUJBQWUsR0FBeUIsU0FBUyxDQUFDOztJQWtLOUQsQ0FBQztrQkFyS1ksU0FBUztJQU1sQixzQkFBWSxxQ0FBYztRQUQxQixjQUFjO2FBQ2Q7WUFDSSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtnQkFDdkIsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7YUFDN0I7WUFDRCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDaEMsQ0FBQzs7O09BQUE7SUFDRDs7OztPQUlHO0lBQ1csYUFBRyxHQUFqQixVQUFrQixVQUFtQixFQUFFLFVBQTJCO1FBQTNCLDJCQUFBLEVBQUEsa0JBQTJCO1FBQzlELElBQUksVUFBVSxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDdEMsSUFBSSxHQUFHLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQyxXQUFTLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUMsR0FBRyxFQUFFO2dCQUNOLElBQUksVUFBVSxFQUFFO29CQUNaLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxXQUFTLENBQUMsQ0FBQztpQkFDN0M7cUJBQU07b0JBQ0gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUU7d0JBQ3BCLE9BQU8sQ0FBQyxLQUFLLENBQUMsNkZBQXdELFVBQVUsQ0FBQyxJQUFNLENBQUMs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O1lBQ0wsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsZUFBZSxHQUFHLFNBQVMsQ0FBQztTQUNwQztJQUNMLENBQUM7O0lBbEtELGFBQWE7SUFDTixlQUFLLEdBQVksVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUZ6QyxTQUFTO1FBRHJCLE9BQU87T0FDSyxTQUFTLENBcUtyQjtJQUFELGdCQUFDO0NBcktELEFBcUtDLENBcks4QixFQUFFLENBQUMsU0FBUyxHQXFLMUM7QUFyS1ksOEJBQVM7QUF1S3RCO0lBS0ksdUJBQVksS0FBZSxFQUFFLEdBQVc7UUFDcEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7UUFDaEIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFTSw4QkFBTSxHQUFiO1FBQ0ksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRU0sOEJBQU0sR0FBYjtRQUNJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVMLG9CQUFDO0FBQUQsQ0FuQkEsQUFtQkMsSUFBQSIsImZpbGUiOiIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBBc3NldHNCdW5kbGVNZ3IgZnJvbSBcIi4uLy4uL3V0aWxzL0Fzc2V0c0J1bmRsZU1nclwiO1xuaW1wb3J0IHsgRVJlc1R5cGUgfSBmcm9tIFwiLi9SZXNCYXNlQXNzZXRcIjtcbmltcG9ydCB7IFJlc0NvbGxlY3RvciB9IGZyb20gXCIuL1Jlc0NvbGxlY3RvclwiO1xuXG5cbmNvbnN0IHsgY2NjbGFzcyB9ID0gY2MuX2RlY29yYXRvcjtcblxuZGVjbGFyZSBnbG9iYWwge1xuICAgIC8qKlxuICAgICAqICFBUElcbiAgICAgKi9cbiAgICBpbnRlcmZhY2UgSVJlc0tlZXBlciB7XG4gICAgICAgIC8vIOe7hOS7tumUgOavgeaXtuiHquWKqOmHiuaUvuafkOS4qui1hOa6kFxuICAgICAgICBBdXRvUmVsZWFzZUFzc2V0PFQgZXh0ZW5kcyBjYy5Bc3NldD4oYXNzZXQ6IFQsIHVybDogc3RyaW5nKTogdm9pZDtcblxuICAgICAgICAvLyDliqDovb3otYTmupBcbiAgICAgICAgTG9hZFJlc0NvbGxlY3RvcihyZXNDb2xsZWN0b3I6IFJlc0NvbGxlY3RvciwgcHJvbWlzZTogSVByb21pc2VGdW5jKTogUHJvbWlzZTx2b2lkPjtcblxuICAgIH1cbn1cblxuLyoqXG4gKiDplIDmr4Hml7boh6rliqjph4rmlL7otYTmupDnu4Tku7ZcbiAqL1xuLy8gQGNjY2xhc3MoXCJSZXNLZWVwZXJcIilcbkBjY2NsYXNzXG5leHBvcnQgY2xhc3MgUmVzS2VlcGVyIGV4dGVuZHMgY2MuQ29tcG9uZW50IGltcGxlbWVudHMgSVJlc0tlZXBlciB7XG4gICAgLyoqIOaYr+WQpuiwg+ivleeKtuaAgSAqL1xuICAgIHN0YXRpYyBERUJVRzogYm9vbGVhbiA9IENDX1BSRVZJRVcgPyB0cnVlIDogZmFsc2U7XG4gICAgcHJpdmF0ZSBfaV9Mb2FkZWRBc3NldHM6IEFycmF5PEFzc2V0S2VlcEl0ZW0+ID0gdW5kZWZpbmVkO1xuXG4gICAgLyoqIOW3suWKoOi9vei1hOa6kOWIl+ihqCAqL1xuICAgIHByaXZhdGUgZ2V0IG1fTG9hZGVkQXNzZXRzKCk6IEFycmF5PEFzc2V0S2VlcEl0ZW0+IHtcbiAgICAgICAgaWYgKCF0aGlzLl9pX0xvYWRlZEFzc2V0cykge1xuICAgICAgICAgICAgdGhpcy5faV9Mb2FkZWRBc3NldHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5faV9Mb2FkZWRBc3NldHM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOS7juebruagh+iKgueCueaIluWFtueItuiKgueCuemAkuW9kuafpeaJvuS4gOS4qui1hOa6kOaMgui9ve+8iOmUgOavgeaXtuiHquWKqOmHiuaUvu+8iee7hOS7tlxuICAgICAqIEBwYXJhbSBhdHRhY2hOb2RlIOebruagh+iKgueCuVxuICAgICAqIEBwYXJhbSBhdXRvQ3JlYXRlIOW9k+ebruagh+iKgueCueaJvuS4jeWIsCBSZXNLZWVwZXIg5pe25piv5ZCm6Ieq5Yqo5Yib5bu65LiA5LiqXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBHZXQoYXR0YWNoTm9kZTogY2MuTm9kZSwgYXV0b0NyZWF0ZTogYm9vbGVhbiA9IGZhbHNlKTogSVJlc0tlZXBlciB7XG4gICAgICAgIGlmIChhdHRhY2hOb2RlICYmIGNjLmlzVmFsaWQoYXR0YWNoTm9kZSkpIHtcbiAgICAgICAgICAgIGxldCByZXQgPSBhdHRhY2hOb2RlLmdldENvbXBvbmVudChSZXNLZWVwZXIpO1xuICAgICAgICAgICAgaWYgKCFyZXQpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXV0b0NyZWF0ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXR0YWNoTm9kZS5hZGRDb21wb25lbnQoUmVzS2VlcGVyKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWF0dGFjaE5vZGUucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBSZXNLZWVwZXIgPj4gYXR0YWNoTm9kZSDnmoTniLboioLngrnkuI3lrZjlnKggPj4gYXR0YWNoTm9kZS5uYW1lID0gJHthdHRhY2hOb2RlLm5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzS2VlcGVyLkdldChhdHRhY2hOb2RlLnBhcmVudCwgYXV0b0NyZWF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmVycm9yKGBSZXNLZWVwZXIgPj4gYXR0YWNoTm9kZSDkuLrnqbroioLngrlgKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiDliqDovb3oh6rliqjph4rmlL7nmoTotYTmupBcbiAgICAgKiBAcGFyYW0gcmVzQ29sbGVjdG9yIFxuICAgICAqL1xuICAgIGFzeW5jIExvYWRSZXNDb2xsZWN0b3IocmVzQ29sbGVjdG9yOiBSZXNDb2xsZWN0b3IsIHByb21pc2U6IElQcm9taXNlRnVuYyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB0aGF0ID0gdGhpcztcbiAgICAgICAgbGV0IF9fYmluZEF1dG9SZWxlYXNlQXNzZXRUb0NvbXAgPSA8VCBleHRlbmRzIGNjLkFzc2V0Pih1cmw6IHN0cmluZywgcmVzOiBUKSA9PiB7XG4gICAgICAgICAgICAvLyDmgKfog73osIPkvJjvvJog6LCD6K+V54q25oCB5omN5omT5Y2w5Yqg6L2955qEIHVybFxuICAgICAgICAgICAgLy8gUmVzS2VlcGVyLkRFQlVHICYmIGNvbnNvbGUubG9nKGB1cmw6ICR7dXJsfSDliqDovb3miJDlip9gKVxuICAgICAgICAgICAgaWYgKGNjLmlzVmFsaWQodGhhdCkpIHtcbiAgICAgICAgICAgICAgICB0aGF0LkF1dG9SZWxlYXNlQXNzZXQocmVzLCB1cmwpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCLotYTmupDliqDovb3lrozmr5Xml7bvvIzoioLngrnlt7LkuI3lj6/nlKhcIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgX29uUmVzTG9hZGVkID0gKHVybDogc3RyaW5nLCBlcnIsIHJlcywgcmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICAvKiog6YeK5pS+5Yqg6L296aG5ICovXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF9fYmluZEF1dG9SZWxlYXNlQXNzZXRUb0NvbXAodXJsLCByZXMpO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwcm9BcnI6IFByb21pc2U8Y2MuQXNzZXQ+W10gPSBbXTtcbiAgICAgICAgcmVzQ29sbGVjdG9yLkdldFJlc0xpc3QoKS5mb3JFYWNoKGxvYWRBc3NldEl0ZW0gPT4ge1xuICAgICAgICAgICAgcHJvQXJyLnB1c2gobmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobG9hZEFzc2V0SXRlbS50eXApIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBFUmVzVHlwZS5QcmVmYWI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1bmRsZVVybCA9IGxvYWRBc3NldEl0ZW0uZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIEFzc2V0c0J1bmRsZU1nci5sb2FkQnVuZGxlKGJ1bmRsZVVybC5idW5kbGUsIChlcnIsIGJ1bmRsZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJTcGluZU5vZGU6YnVuZGxlIGxvYWQgZmFpbGVkOlwiLCBlcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsZXQgY2FjaGVBc3NldCA9IGJ1bmRsZS5nZXQoYnVuZGxlVXJsLnVybCwgY2MuUHJlZmFiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAoY2FjaGVBc3NldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBfb25SZXNMb2FkZWQoYnVuZGxlVXJsLnVybCwgZXJyLCBjYWNoZUFzc2V0LCByZXNvbHZlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZS5sb2FkKGJ1bmRsZVVybC51cmwsIGNjLlByZWZhYiwgKGVycjogRXJyb3IsIGFzc2V0OiBjYy5QcmVmYWIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX29uUmVzTG9hZGVkKGJ1bmRsZVVybC51cmwsIGVyciwgYXNzZXQsIHJlc29sdmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBFUmVzVHlwZS5TcGluZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnVuZGxlVXJsID0gbG9hZEFzc2V0SXRlbS5kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgQXNzZXRzQnVuZGxlTWdyLmxvYWRCdW5kbGUoYnVuZGxlVXJsLmJ1bmRsZSwgKGVyciwgYnVuZGxlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlNwaW5lTm9kZTpidW5kbGUgbG9hZCBmYWlsZWQ6XCIsIGVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxldCBjYWNoZUFzc2V0ID0gYnVuZGxlLmdldChidW5kbGVVcmwudXJsLCBjYy5QcmVmYWIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIChjYWNoZUFzc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIF9vblJlc0xvYWRlZChidW5kbGVVcmwudXJsLCBlcnIsIGNhY2hlQXNzZXQsIHJlc29sdmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlLmxvYWQoYnVuZGxlVXJsLnVybCwgc3AuU2tlbGV0b25EYXRhLCAoZXJyOiBFcnJvciwgYXNzZXQ6IHNwLlNrZWxldG9uRGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb25SZXNMb2FkZWQoYnVuZGxlVXJsLnVybCwgZXJyLCBhc3NldCwgcmVzb2x2ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgRVJlc1R5cGUuU3ByaXRlRnJhbWU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1bmRsZVVybCA9IGxvYWRBc3NldEl0ZW0uZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIEFzc2V0c0J1bmRsZU1nci5sb2FkQnVuZGxlKGJ1bmRsZVVybC5idW5kbGUsIChlcnIsIGJ1bmRsZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJTcHJpdGVGcmFtZTpidW5kbGUgbG9hZCBmYWlsZWQ6XCIsIGVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZS5sb2FkKGJ1bmRsZVVybC51cmwsIGNjLlNwcml0ZUZyYW1lLCAoZXJyOiBFcnJvciwgYXNzZXQ6IGNjLlNwcml0ZUZyYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vblJlc0xvYWRlZChidW5kbGVVcmwudXJsLCBlcnIsIGFzc2V0LCByZXNvbHZlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBFUmVzVHlwZS5Kc29uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBidW5kbGVVcmwgPSBsb2FkQXNzZXRJdGVtLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICBBc3NldHNCdW5kbGVNZ3IubG9hZEJ1bmRsZShidW5kbGVVcmwuYnVuZGxlLCAoZXJyLCBidW5kbGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiU3ByaXRlRnJhbWU6YnVuZGxlIGxvYWQgZmFpbGVkOlwiLCBlcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidW5kbGUubG9hZChidW5kbGVVcmwudXJsLCBjYy5Kc29uQXNzZXQsIChlcnI6IEVycm9yLCBhc3NldDogY2MuSnNvbkFzc2V0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vblJlc0xvYWRlZChidW5kbGVVcmwudXJsLCBlcnIsIGFzc2V0LCByZXNvbHZlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihg44CQUmVzS2VlcGVy44CRID4+IOacquWkhOeQhueahOi1hOa6kOWKoOi9veexu+WeiyAke2xvYWRBc3NldEl0ZW0udHlwfWApXG4gICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpXG5cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByb0FycikudGhlbigodmFsdWVzKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuXG5cbiAgICAvKipcbiAgICAgKiDmt7vliqDoh6rliqjph4rmlL7lvJXnlKhcbiAgICAgKiBAcGFyYW0ga2VlcEl0ZW0gXG4gICAgICovXG4gICAgQXV0b1JlbGVhc2VBc3NldDxUIGV4dGVuZHMgY2MuQXNzZXQ+KGFzc2V0OiBULCB1cmw6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICAvKiogQm9ycm93IOaXtuiHquWKqOa3u+WKoOS6huW8leeUqOiuoeaVsO+8jOmUgOavgeaXtu+8jOino+W8leeUqOWNs+WPryAqL1xuICAgICAgICB0aGlzLm1fTG9hZGVkQXNzZXRzLnB1c2gobmV3IEFzc2V0S2VlcEl0ZW0oYXNzZXQsIHVybCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOmHiuaUvuaJgOacieW8leeUqOeahOi1hOa6kFxuICAgICAqL1xuICAgIG9uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lfTG9hZGVkQXNzZXRzKSB7XG4gICAgICAgICAgICB0aGlzLl9pX0xvYWRlZEFzc2V0cy5mb3JFYWNoKGl0ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXQgJiYgaXQuRGVjUmVmKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0LkRlY1JlZigpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLl9pX0xvYWRlZEFzc2V0cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cblxufVxuXG5jbGFzcyBBc3NldEtlZXBJdGVtIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIG1Bc3NldDogY2MuQXNzZXQ7XG4gICAgbVVybDogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IoYXNzZXQ6IGNjLkFzc2V0LCB1cmw6IHN0cmluZykge1xuICAgICAgICB0aGlzLm1Bc3NldCA9IGFzc2V0O1xuICAgICAgICB0aGlzLm1VcmwgPSB1cmw7XG4gICAgICAgIHRoaXMuQWRkUmVmKCk7XG4gICAgfVxuXG4gICAgcHVibGljIEFkZFJlZigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tQXNzZXQuYWRkUmVmKCk7XG4gICAgfVxuXG4gICAgcHVibGljIERlY1JlZigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tQXNzZXQuZGVjUmVmKCk7XG4gICAgfVxuXG59XG4iXX0=