FguiMgr.js 68 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535
  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/fgui/FguiMgr.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, 'e61aeS1Dn1AKZclV6WN+N79', 'FguiMgr');
  13. // script/frameWork/fgui/FguiMgr.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 __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
  29. function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
  30. return new (P || (P = Promise))(function (resolve, reject) {
  31. function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
  32. function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
  33. function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
  34. step((generator = generator.apply(thisArg, _arguments || [])).next());
  35. });
  36. };
  37. var __generator = (this && this.__generator) || function (thisArg, body) {
  38. var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
  39. return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
  40. function verb(n) { return function (v) { return step([n, v]); }; }
  41. function step(op) {
  42. if (f) throw new TypeError("Generator is already executing.");
  43. while (_) try {
  44. 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;
  45. if (y = 0, t) op = [op[0] & 2, t.value];
  46. switch (op[0]) {
  47. case 0: case 1: t = op; break;
  48. case 4: _.label++; return { value: op[1], done: false };
  49. case 5: _.label++; y = op[1]; op = [0]; continue;
  50. case 7: op = _.ops.pop(); _.trys.pop(); continue;
  51. default:
  52. if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
  53. if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
  54. if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
  55. if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
  56. if (t[2]) _.ops.pop();
  57. _.trys.pop(); continue;
  58. }
  59. op = body.call(thisArg, _);
  60. } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
  61. if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
  62. }
  63. };
  64. Object.defineProperty(exports, "__esModule", { value: true });
  65. var StringMap_1 = require("../../Collections/StringMap");
  66. var Config_1 = require("../../Config");
  67. var gameMethod_1 = require("../../common/gameMethod");
  68. var GameDataCenter_1 = require("../../data/GameDataCenter");
  69. var EventConst_1 = require("../../data/const/EventConst");
  70. var TypeConst_1 = require("../../data/const/TypeConst");
  71. var ViewZOrder_1 = require("../../data/const/ViewZOrder");
  72. var EventMng_1 = require("../../manager/EventMng");
  73. var Singleton_1 = require("../../manager/Singleton");
  74. var SpecialPromise_1 = require("../Promise/SpecialPromise");
  75. var ResCollector_1 = require("../compment/ResCollector");
  76. var ResKeeper_1 = require("../compment/ResKeeper");
  77. var FguiLoadMgr_1 = require("./FguiLoadMgr");
  78. var FguiView_1 = require("./mvc/FguiView");
  79. var FguiMgr = /** @class */ (function (_super) {
  80. __extends(FguiMgr, _super);
  81. function FguiMgr() {
  82. var _this = _super !== null && _super.apply(this, arguments) || this;
  83. /** 记录图层节点的Map */
  84. _this._layerNodeMap = new Map();
  85. /** 已开启过的ui */
  86. _this._opened = new StringMap_1.StringMap();
  87. /** 缓存被关闭的ui */
  88. _this._closed = new StringMap_1.StringMap();
  89. /** 记录所加载的包 */
  90. _this._addPkged = new StringMap_1.StringMap();
  91. return _this;
  92. //#endregion
  93. }
  94. FguiMgr.prototype.Init = function () {
  95. var _this = this;
  96. fgui.GRoot.create();
  97. fgui.GRoot.inst.width = Config_1.default.safeAreaRect.width;
  98. fgui.GRoot.inst.height = Config_1.default.realHeight;
  99. fgui.GRoot.inst.node.y = Config_1.default.realHeight + Config_1.default.safeAreaRect.y / 2;
  100. this._layerNodeMap = new Map();
  101. // 创建所有UI层级
  102. Object.values(ViewZOrder_1.ViewZOrder).forEach(function (layer) {
  103. if (typeof layer === 'number') {
  104. var layerName = ViewZOrder_1.ViewZOrder[layer];
  105. _this.createLayer(layerName + 'Layer', layer);
  106. }
  107. });
  108. };
  109. FguiMgr.prototype.createLayer = function (name, zOrder) {
  110. var layer = new fgui.GComponent();
  111. layer.name = name;
  112. layer.node.name = name;
  113. layer.sortingOrder = zOrder;
  114. fgui.GRoot.inst.addChild(layer);
  115. layer.makeFullScreen();
  116. this._layerNodeMap.set(zOrder, layer);
  117. return layer;
  118. };
  119. /**
  120. * @param callback 打开完毕回调函数
  121. * @param intent 传入到UI的参数
  122. */
  123. FguiMgr.prototype.openUI = function (uiClass, zOrder, callback, intent) {
  124. var _this = this;
  125. if (zOrder === void 0) { zOrder = ViewZOrder_1.ViewZOrder.UI; }
  126. if (CC_PREVIEW)
  127. console.log("\u6253\u5F00\u9875\u9762" + uiClass.getViewName());
  128. var viewKey = uiClass.getViewName();
  129. if (this._opened.ContainsKey(viewKey)) {
  130. console.log("FguiMgr::Open " + viewKey + " has already opened.");
  131. return;
  132. }
  133. if (this.getCacheView(uiClass, zOrder, callback)) {
  134. return;
  135. }
  136. var pkgName = uiClass.getPkgName();
  137. EventMng_1.default.emit(EventConst_1.GUIEvent.SHOW_MASK, pkgName, true);
  138. if (fgui.UIPackage.getByName(pkgName) == null) {
  139. // 加载uipackage
  140. FguiLoadMgr_1.default.loadPackage(pkgName, pkgName, function (error, pkg) { return __awaiter(_this, void 0, void 0, function () {
  141. return __generator(this, function (_a) {
  142. if (error) {
  143. EventMng_1.default.emit(EventConst_1.GUIEvent.SHOW_MASK, pkgName, false);
  144. console.error("FguiMgr LoadPackage[" + pkgName + "] error: " + error);
  145. return [2 /*return*/];
  146. }
  147. this.CreateView(uiClass, zOrder, intent, callback);
  148. return [2 /*return*/];
  149. });
  150. }); });
  151. }
  152. else {
  153. this.CreateView(uiClass, zOrder, intent, callback);
  154. }
  155. };
  156. /** 从缓存中加载页面 */
  157. FguiMgr.prototype.getCacheView = function (uiClass, zOrder, callback, intent) {
  158. if (zOrder === void 0) { zOrder = ViewZOrder_1.ViewZOrder.UI; }
  159. var viewKey = uiClass.getViewName();
  160. if (this._closed.ContainsKey(viewKey)) {
  161. var uiview_1 = this._closed.Value(viewKey);
  162. if (uiview_1.viewType == FguiView_1.ViewType.Full) {
  163. this._opened.Foreach(function (key, value) {
  164. if (value.viewType != FguiView_1.ViewType.Part && value.zOrder <= uiview_1.zOrder) {
  165. value.addFullHideCount(1);
  166. }
  167. });
  168. }
  169. this._closed.Remove(viewKey);
  170. this._opened.Add(viewKey, uiview_1);
  171. this.AddPanel(uiview_1.Panel, zOrder);
  172. uiview_1.show(intent);
  173. uiview_1.zOrder = zOrder;
  174. uiview_1.uiPkgName = uiClass.getPkgName();
  175. //回调
  176. callback && callback(uiview_1);
  177. return true;
  178. }
  179. return false;
  180. };
  181. FguiMgr.prototype.CreateView = function (uiClass, zOrder, intent, complete) {
  182. var _this = this;
  183. if (zOrder === void 0) { zOrder = ViewZOrder_1.ViewZOrder.UI; }
  184. var handler = new fgui.AsyncOperation();
  185. handler.callback = function (gObject) { return __awaiter(_this, void 0, void 0, function () {
  186. var panel, uiview, resKeeper, resCollector;
  187. return __generator(this, function (_a) {
  188. switch (_a.label) {
  189. case 0:
  190. if (this._opened.ContainsKey(uiClass.getViewName())) {
  191. EventMng_1.default.emit(EventConst_1.GUIEvent.SHOW_MASK, uiClass.getPkgName(), false);
  192. console.error("FguiMgr::Open " + uiClass.getViewName() + " has already opened.");
  193. return [2 /*return*/];
  194. }
  195. panel = gObject;
  196. if (panel == null) {
  197. EventMng_1.default.emit(EventConst_1.GUIEvent.SHOW_MASK, uiClass.getPkgName(), false);
  198. console.error("FguiMgr createObject[" + uiClass.getViewName + "] error: GObject\u4E3A\u7A7A.");
  199. return [2 /*return*/];
  200. }
  201. panel.node.name = uiClass.getPrefabName();
  202. uiview = new uiClass();
  203. uiview.zOrder = zOrder;
  204. uiview.uiPkgName = uiClass.getPkgName();
  205. uiview.initForward(panel, null);
  206. resKeeper = ResKeeper_1.ResKeeper.Get(panel.node, true);
  207. resCollector = new ResCollector_1.ResCollector();
  208. uiview.Controller.onCollectRes(resCollector, intent);
  209. if (!(resCollector.GetResList().length > 0)) return [3 /*break*/, 2];
  210. return [4 /*yield*/, resKeeper.LoadResCollector(resCollector, SpecialPromise_1.PromiseDefault)];
  211. case 1:
  212. _a.sent();
  213. _a.label = 2;
  214. case 2:
  215. if (uiview.viewType == FguiView_1.ViewType.Full) {
  216. this._opened.Foreach(function (key, value) {
  217. if (value.viewType != FguiView_1.ViewType.Part && value.zOrder <= uiview.zOrder) {
  218. value.addFullHideCount(1);
  219. }
  220. });
  221. }
  222. this._opened.Add(uiClass.getViewName(), uiview);
  223. uiview.init();
  224. this.AddPanel(panel, zOrder);
  225. uiview.show(intent);
  226. this.AddPkgCount(uiClass.getPkgName(), uiClass.getViewName());
  227. EventMng_1.default.emit(EventConst_1.GUIEvent.SHOW_MASK, uiClass.getPkgName(), false);
  228. complete && complete(uiview);
  229. return [2 /*return*/];
  230. }
  231. });
  232. }); };
  233. handler.createObject(uiClass.getPkgName(), uiClass.getPrefabName());
  234. };
  235. /**
  236. * @param isDispose 是否销毁
  237. */
  238. FguiMgr.prototype.closeUI = function (uiClass, isDispose) {
  239. if (isDispose === void 0) { isDispose = false; }
  240. var viewKey = uiClass.getViewName();
  241. if (this._opened.ContainsKey(viewKey)) {
  242. var view_1 = this._opened.Value(viewKey);
  243. this._opened.Remove(viewKey);
  244. view_1.hide(isDispose);
  245. this.RemovePanel(view_1.Panel);
  246. if (isDispose) {
  247. this.DestroyView(view_1, uiClass);
  248. }
  249. else {
  250. this._closed.Add(viewKey, view_1);
  251. }
  252. if (view_1.viewType == FguiView_1.ViewType.Full) {
  253. this._opened.Foreach(function (key, value) {
  254. if (value.viewType != FguiView_1.ViewType.Part && value.zOrder <= view_1.zOrder) {
  255. value.addFullHideCount(-1);
  256. }
  257. });
  258. }
  259. }
  260. else if (isDispose && this._closed.ContainsKey(viewKey)) {
  261. var view = this._closed.Value(viewKey);
  262. this._closed.Remove(viewKey);
  263. this.DestroyView(view, uiClass);
  264. }
  265. };
  266. // 判断界面是否打开
  267. FguiMgr.prototype.isShowing = function (uiClass) {
  268. var viewKey = uiClass === null || uiClass === void 0 ? void 0 : uiClass.getViewName();
  269. if (this._opened.ContainsKey(viewKey)) {
  270. return true;
  271. }
  272. return false;
  273. };
  274. // 获取打开的界面
  275. FguiMgr.prototype.getShowingView = function (uiClass) {
  276. var viewKey = uiClass === null || uiClass === void 0 ? void 0 : uiClass.getViewName();
  277. if (this._opened.ContainsKey(viewKey)) {
  278. var view = this._opened.Value(viewKey);
  279. return view;
  280. }
  281. return null;
  282. };
  283. /**
  284. * 当前是否有除了指定页面以外的其他页面被打开
  285. */
  286. FguiMgr.prototype.checkOtherUIOpen = function (uilist) {
  287. var list = [];
  288. for (var _i = 0, uilist_1 = uilist; _i < uilist_1.length; _i++) {
  289. var i = uilist_1[_i];
  290. list.push(i.getViewName());
  291. }
  292. var haveother = false;
  293. this._opened.Foreach(function (key, value) {
  294. if (list.indexOf(key) < 0) {
  295. haveother = true;
  296. }
  297. });
  298. return haveother;
  299. };
  300. FguiMgr.prototype.isShowingByName = function (uiViewName) {
  301. return this._opened.ContainsKey(uiViewName);
  302. };
  303. // 获取打开的界面
  304. FguiMgr.prototype.getShowingViewByName = function (uiViewName) {
  305. if (this._opened.ContainsKey(uiViewName)) {
  306. var view = this._opened.Value(uiViewName);
  307. return view;
  308. }
  309. return null;
  310. };
  311. FguiMgr.prototype.findNodeByName = function (uiViewName, goName) {
  312. var _a, _b;
  313. if (this._opened.ContainsKey(uiViewName)) {
  314. var view = this._opened.Value(uiViewName);
  315. var goNames = goName.split("/");
  316. var go = null;
  317. var goTemp = view["_viewModel"][goNames[0]];
  318. if (gameMethod_1.gameMethod.isEmpty(goTemp)) {
  319. goTemp = view.Panel.getChild(goNames[0]);
  320. }
  321. for (var i = 1; i < goNames.length; i++) {
  322. if (goTemp === null || goTemp === void 0 ? void 0 : goTemp.Panel) {
  323. goTemp = (_a = goTemp.Panel) === null || _a === void 0 ? void 0 : _a.getChild(goNames[i]);
  324. }
  325. else {
  326. goTemp = goTemp === null || goTemp === void 0 ? void 0 : goTemp.getChild(goNames[i]);
  327. }
  328. }
  329. go = goTemp;
  330. if (!gameMethod_1.gameMethod.isEmpty(go)) {
  331. go.visible = true;
  332. }
  333. else {
  334. console.error("\u754C\u9762\uFF1A" + uiViewName + " \u627E\u4E0D\u5230\u76EE\u6807\u8282\u70B9: " + goNames);
  335. }
  336. return (_b = go === null || go === void 0 ? void 0 : go.node) !== null && _b !== void 0 ? _b : null;
  337. }
  338. return null;
  339. };
  340. FguiMgr.prototype.removePkg = function (uiClass) {
  341. if (!this._addPkged.ContainsKey(uiClass.getPkgName()) || this._addPkged.Value(uiClass.getPkgName()) == 0) {
  342. fgui.UIPackage.removePackage(uiClass.getPkgName());
  343. }
  344. else {
  345. console.warn("removePkg fail");
  346. }
  347. };
  348. FguiMgr.prototype.clearOpenUI = function () {
  349. var _this = this;
  350. this._opened.Foreach(function (viewKey, value) {
  351. value.hide();
  352. _this.RemovePanel(value.Panel);
  353. _this._closed.Add(viewKey, value);
  354. });
  355. this._opened.Clear();
  356. };
  357. FguiMgr.prototype.clearAllUI = function () {
  358. var _this = this;
  359. this._opened.Foreach(function (viewKey, value) {
  360. value.hide();
  361. _this.RemovePanel(value.Panel);
  362. });
  363. this.clearCacheMap();
  364. // this._addPkged.Foreach((pkgName: string, value: number) => {
  365. // fgui.UIPackage.removePackage(pkgName)
  366. // })
  367. this._addPkged.Clear();
  368. };
  369. FguiMgr.prototype.clearCacheMap = function () {
  370. this._opened.Clear();
  371. this._closed.Clear();
  372. };
  373. FguiMgr.prototype.OnUpdate = function (elapseTime) {
  374. this._opened.Foreach(function (k, v) {
  375. v.OnUpdate(elapseTime);
  376. }, this);
  377. };
  378. FguiMgr.prototype.OnLateUpdate = function (elapseTime) {
  379. this._opened.Foreach(function (k, v) {
  380. v.OnLateUpdate(elapseTime);
  381. }, this);
  382. };
  383. FguiMgr.prototype.Dispose = function () {
  384. //TODO 有需要再补充
  385. };
  386. /** 增加fgui pkg计数 */
  387. FguiMgr.prototype.AddPkgCount = function (pkgName, from) {
  388. var _a, _b;
  389. if (this._addPkged.ContainsKey(pkgName)) {
  390. //已存在++
  391. var pkgCount = this._addPkged.Value(pkgName);
  392. pkgCount++;
  393. this._addPkged.Replace(pkgName, pkgCount);
  394. }
  395. else {
  396. this._addPkged.Add(pkgName, 1);
  397. }
  398. if (!gameMethod_1.gameMethod.isEmpty((_b = (_a = GameDataCenter_1.default === null || GameDataCenter_1.default === void 0 ? void 0 : GameDataCenter_1.default.sevBack) === null || _a === void 0 ? void 0 : _a.switch) === null || _b === void 0 ? void 0 : _b.clientLog)) {
  399. console.log(from + " " + pkgName + " count: " + this._addPkged.Value(pkgName));
  400. }
  401. };
  402. /** 减少fgui pkg计数 */
  403. FguiMgr.prototype.DelPkgCount = function (pkgName, from) {
  404. var _a, _b, _c, _d;
  405. if (this._addPkged.ContainsKey(pkgName)) {
  406. //已存在++
  407. var pkgCount = this._addPkged.Value(pkgName);
  408. pkgCount--;
  409. if (!gameMethod_1.gameMethod.isEmpty((_b = (_a = GameDataCenter_1.default === null || GameDataCenter_1.default === void 0 ? void 0 : GameDataCenter_1.default.sevBack) === null || _a === void 0 ? void 0 : _a.switch) === null || _b === void 0 ? void 0 : _b.clientLog)) {
  410. console.log(pkgName + " count: " + pkgCount, from);
  411. }
  412. this._addPkged.Replace(pkgName, pkgCount);
  413. if (pkgCount <= 0 && pkgName != "Common") {
  414. if (!gameMethod_1.gameMethod.isEmpty((_d = (_c = GameDataCenter_1.default === null || GameDataCenter_1.default === void 0 ? void 0 : GameDataCenter_1.default.sevBack) === null || _c === void 0 ? void 0 : _c.switch) === null || _d === void 0 ? void 0 : _d.clientLog)) {
  415. console.log("removePackage:" + pkgName, from);
  416. }
  417. fgui.UIPackage.removePackage(pkgName);
  418. }
  419. }
  420. };
  421. FguiMgr.prototype.AddPkgByPkgName = function (pkgName, cb) {
  422. var _this = this;
  423. var _a, _b;
  424. if (fgui.UIPackage.getByName(pkgName) == null) {
  425. // 加载uipackage
  426. FguiLoadMgr_1.default.loadPackage(pkgName, pkgName, function (error, pkg) {
  427. var _a, _b;
  428. if (error) {
  429. EventMng_1.default.emit(EventConst_1.GUIEvent.SHOW_MASK, pkgName, false);
  430. console.error("FguiMgr LoadPackage[" + pkgName + "] error: " + error);
  431. return;
  432. }
  433. _this.AddPkgCount(pkgName);
  434. if (!gameMethod_1.gameMethod.isEmpty((_b = (_a = GameDataCenter_1.default === null || GameDataCenter_1.default === void 0 ? void 0 : GameDataCenter_1.default.sevBack) === null || _a === void 0 ? void 0 : _a.switch) === null || _b === void 0 ? void 0 : _b.clientLog)) {
  435. console.log(pkgName + " count: " + _this._addPkged.Value(pkgName));
  436. }
  437. cb && cb();
  438. });
  439. }
  440. else {
  441. this.AddPkgCount(pkgName);
  442. if (!gameMethod_1.gameMethod.isEmpty((_b = (_a = GameDataCenter_1.default === null || GameDataCenter_1.default === void 0 ? void 0 : GameDataCenter_1.default.sevBack) === null || _a === void 0 ? void 0 : _a.switch) === null || _b === void 0 ? void 0 : _b.clientLog)) {
  443. console.log(pkgName + " count: " + this._addPkged.Value(pkgName));
  444. }
  445. cb && cb();
  446. }
  447. };
  448. FguiMgr.prototype.RemovePkgByPkgName = function (pkgName) {
  449. //ios平台才释放,安卓平台不释放
  450. if (GameDataCenter_1.default.plat.instance.deviceOS != TypeConst_1.PlatFormDevType.iosH5 && GameDataCenter_1.default.plat.instance.deviceOS != TypeConst_1.PlatFormDevType.ios && GameDataCenter_1.default.plat.instance.deviceOS != TypeConst_1.PlatFormDevType.local) {
  451. return;
  452. }
  453. this.DelPkgCount(pkgName);
  454. };
  455. FguiMgr.prototype.AddPanel = function (panel, zOrder) {
  456. var layerNode = this._layerNodeMap.get(zOrder);
  457. if (layerNode) {
  458. layerNode.addChild(panel);
  459. }
  460. else {
  461. fgui.GRoot.inst.addChild(panel);
  462. }
  463. // UI全屏自适应
  464. panel.makeFullScreen();
  465. };
  466. FguiMgr.prototype.RemovePanel = function (panel) {
  467. fgui.GRoot.inst.removeChild(panel);
  468. };
  469. FguiMgr.prototype.DestroyView = function (uiview, uiClass) {
  470. //ios平台才释放,安卓平台不释放
  471. if (GameDataCenter_1.default.plat.instance.deviceOS != TypeConst_1.PlatFormDevType.iosH5 && GameDataCenter_1.default.plat.instance.deviceOS != TypeConst_1.PlatFormDevType.ios && GameDataCenter_1.default.plat.instance.deviceOS != TypeConst_1.PlatFormDevType.local) {
  472. return;
  473. }
  474. var panel = uiview.Panel;
  475. panel.dispose();
  476. this.DelPkgCount(uiClass.getPkgName());
  477. };
  478. FguiMgr.prototype.CloseUIByLayer = function (zOrder) {
  479. var _this = this;
  480. this._opened.Foreach(function (viewKey, value) {
  481. if (value.zOrder == zOrder) {
  482. var view_2 = _this._opened.Value(viewKey);
  483. _this._opened.Remove(viewKey);
  484. view_2.hide();
  485. _this.RemovePanel(view_2.Panel);
  486. _this._closed.Add(viewKey, view_2);
  487. if (view_2.viewType == FguiView_1.ViewType.Full) {
  488. _this._opened.Foreach(function (key, value) {
  489. if (value.viewType != FguiView_1.ViewType.Part && value.zOrder <= view_2.zOrder) {
  490. value.addFullHideCount(-1);
  491. }
  492. });
  493. }
  494. }
  495. });
  496. };
  497. /** 关闭所有的UI elseView 排除无需关闭的界面 */
  498. FguiMgr.prototype.CloseAllUI = function (elseView) {
  499. var _this = this;
  500. if (elseView === void 0) { elseView = []; }
  501. this._opened.Foreach(function (viewKey, value) {
  502. if (elseView.indexOf(viewKey) < 0) {
  503. var view_3 = _this._opened.Value(viewKey);
  504. _this._opened.Remove(viewKey);
  505. view_3.hide();
  506. _this.RemovePanel(view_3.Panel);
  507. _this._closed.Add(viewKey, view_3);
  508. if (view_3.viewType == FguiView_1.ViewType.Full) {
  509. _this._opened.Foreach(function (key, value) {
  510. if (value.viewType != FguiView_1.ViewType.Part && value.zOrder <= view_3.zOrder) {
  511. value.addFullHideCount(-1);
  512. }
  513. });
  514. }
  515. }
  516. });
  517. };
  518. return FguiMgr;
  519. }(Singleton_1.Singleton()));
  520. exports.default = FguiMgr;
  521. cc._RF.pop();
  522. }
  523. if (nodeEnv) {
  524. __define(__module.exports, __require, __module);
  525. }
  526. else {
  527. __quick_compile_project__.registerModuleFunc(__filename, function () {
  528. __define(__module.exports, __require, __module);
  529. });
  530. }
  531. })();
  532. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0cy9zY3JpcHQvZnJhbWVXb3JrL2ZndWkvRmd1aU1nci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx5REFBd0Q7QUFDeEQsdUNBQWtDO0FBQ2xDLHNEQUFxRDtBQUNyRCw0REFBdUQ7QUFDdkQsMERBQXVEO0FBQ3ZELHdEQUE2RDtBQUM3RCwwREFBeUQ7QUFDekQsbURBQThDO0FBQzlDLHFEQUFvRDtBQUNwRCw0REFBMkQ7QUFDM0QseURBQXdEO0FBQ3hELG1EQUFrRDtBQUNsRCw2Q0FBd0M7QUFJeEMsMkNBQStEO0FBRy9EO0lBQXFDLDJCQUFvQjtJQUF6RDtRQUFBLHFFQThhQztRQTdhRyxpQkFBaUI7UUFDVCxtQkFBYSxHQUFxQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3BFLGNBQWM7UUFDTixhQUFPLEdBQXdCLElBQUkscUJBQVMsRUFBWSxDQUFDO1FBQ2pFLGVBQWU7UUFDUCxhQUFPLEdBQXdCLElBQUkscUJBQVMsRUFBWSxDQUFDO1FBQ2pFLGNBQWM7UUFDTixlQUFTLEdBQXNCLElBQUkscUJBQVMsRUFBVSxDQUFDOztRQXFhL0QsWUFBWTtJQUNoQixDQUFDO0lBbmFHLHNCQUFJLEdBQUo7UUFBQSxpQkFlQztRQWRHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFcEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLGdCQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQTtRQUNqRCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsZ0JBQU0sQ0FBQyxVQUFVLENBQUE7UUFDMUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxnQkFBTSxDQUFDLFVBQVUsR0FBRyxnQkFBTSxDQUFDLFlBQVksQ0FB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LENBQUE7aUJBQ0w7YUFDSjtRQUNMLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUlMLGNBQUM7QUFBRCxDQTlhQSxBQThhQyxDQTlhb0MscUJBQVMsRUFBVyxHQThheEQiLCJmaWxlIjoiIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdHJpbmdNYXAgfSBmcm9tIFwiLi4vLi4vQ29sbGVjdGlvbnMvU3RyaW5nTWFwXCI7XG5pbXBvcnQgQ29uZmlnIGZyb20gXCIuLi8uLi9Db25maWdcIjtcbmltcG9ydCB7IGdhbWVNZXRob2QgfSBmcm9tIFwiLi4vLi4vY29tbW9uL2dhbWVNZXRob2RcIjtcbmltcG9ydCBHYW1lRGF0YUNlbnRlciBmcm9tIFwiLi4vLi4vZGF0YS9HYW1lRGF0YUNlbnRlclwiO1xuaW1wb3J0IHsgR1VJRXZlbnQgfSBmcm9tIFwiLi4vLi4vZGF0YS9jb25zdC9FdmVudENvbnN0XCI7XG5pbXBvcnQgeyBQbGF0Rm9ybURldlR5cGUgfSBmcm9tIFwiLi4vLi4vZGF0YS9jb25zdC9UeXBlQ29uc3RcIjtcbmltcG9ydCB7IFZpZXdaT3JkZXIgfSBmcm9tIFwiLi4vLi4vZGF0YS9jb25zdC9WaWV3Wk9yZGVyXCI7XG5pbXBvcnQgRXZlbnRNbmcgZnJvbSBcIi4uLy4uL21hbmFnZXIvRXZlbnRNbmdcIjtcbmltcG9ydCB7IFNpbmdsZXRvbiB9IGZyb20gXCIuLi8uLi9tYW5hZ2VyL1NpbmdsZXRvblwiO1xuaW1wb3J0IHsgUHJvbWlzZURlZmF1bHQgfSBmcm9tIFwiLi4vUHJvbWlzZS9TcGVjaWFsUHJvbWlzZVwiO1xuaW1wb3J0IHsgUmVzQ29sbGVjdG9yIH0gZnJvbSBcIi4uL2NvbXBtZW50L1Jlc0NvbGxlY3RvclwiO1xuaW1wb3J0IHsgUmVzS2VlcGVyIH0gZnJvbSBcIi4uL2NvbXBtZW50L1Jlc0tlZXBlclwiO1xuaW1wb3J0IEZndWlMb2FkTWdyIGZyb20gXCIuL0ZndWlMb2FkTWdyXCI7XG5pbXBvcnQgeyBJRGlzcG9zYWJsZSB9IGZyb20gXCIuL0ludGVyZmFjZS9JRGlzcG9zYWJsZVwiO1xuaW1wb3J0IHsgSUxhdGVVcGRhdGUgfSBmcm9tIFwiLi9JbnRlcmZhY2UvSUxhdGVVcGRhdGVcIjtcbmltcG9ydCB7IElVcGRhdGUgfSBmcm9tIFwiLi9JbnRlcmZhY2UvSVVwZGF0ZVwiO1xuaW1wb3J0IHsgRmd1aUNsYXNzLCBGZ3VpVmlldywgVmlld1R5cGUgfSBmcm9tIFwiLi9tdmMvRmd1aVZpZXdcIjtcblxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGZ3VpTWdyIGV4dGVuZHMgU2luZ2xldG9uPEZndWlNZ3I+KCkgaW1wbGVtZW50cyBJVXBkYXRlLCBJTGF0ZVVwZGF0ZSwgSURpc3Bvc2FibGUge1xuICAgIC8qKiDorrDlvZXlm77lsYLoioLngrnnmoRNYXAgKi9cbiAgICBwcml2YXRlIF9sYXllck5vZGVNYXA6IE1hcDxWaWV3Wk9yZGVyLCBmZ3VpLkdDb21wb25lbnQ+ID0gbmV3IE1hcCgpO1xuICAgIC8qKiDlt7LlvIDlkK/ov4fnmoR1aSAqL1xuICAgIHByaXZhdGUgX29wZW5lZDogU3RyaW5nTWFwPEZndWlWaWV3PiA9IG5ldyBTdHJpbmdNYXA8Rmd1aVZpZXc+KCk7XG4gICAgLyoqIOe8k+WtmOiiq+WFs+mXreeahHVpICovXG4gICAgcHJpdmF0ZSBfY2xvc2VkOiBTdHJpbmdNYXA8Rmd1aVZpZXc+ID0gbmV3IFN0cmluZ01hcDxGZ3VpVmlldz4oKTtcbiAgICAvKiog6K6w5b2V5omA5Yqg6L2955qE5YyFICovXG4gICAgcHJpdmF0ZSBfYWRkUGtnZWQ6IFN0cmluZ01hcDxudW1iZXI+ID0gbmV3IFN0cmluZ01hcDxudW1iZXI+KCk7XG5cblxuICAgIEluaXQoKTogdm9pZCB7XG4gICAgICAgIGZndWkuR1Jvb3QuY3JlYXRlKCk7XG5cbiAgICAgICAgZmd1aS5HUm9vdC5pbnN0LndpZHRoID0gQ29uZmlnLnNhZmVBcmVhUmVjdC53aWR0aFxuICAgICAgICBmZ3VpLkdSb290Lmluc3QuaGVpZ2h0ID0gQ29uZmlnLnJlYWxIZWlnaHRcbiAgICAgICAgZmd1aS5HUm9vdC5pbnN0Lm5vZGUueSA9IENvbmZpZy5yZWFsSGVpZ2h0ICsgQ29uZmlnLnNhZmVBcmVhUmVjdC55IC8gMlxuXG4gICAgICAgIHRoaXMuX2xheWVyTm9kZU1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgLy8g5Yib5bu65omA5pyJVUnlsYLnuqdcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhWaWV3Wk9yZGVyKS5mb3JFYWNoKChsYXllcikgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBsYXllciA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXllck5hbWUgPSBWaWV3Wk9yZGVyW2xheWVyXTtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUxheWVyKGxheWVyTmFtZSArICdMYXllcicsIGxheWVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIGNyZWF0ZUxheWVyKG5hbWU6IHN0cmluZywgek9yZGVyOiBudW1iZXIpOiBmZ3VpLkdDb21wb25lbnQge1xuICAgICAgICBjb25zdCBsYXllciA9IG5ldyBmZ3VpLkdDb21wb25lbnQoKTtcbiAgICAgICAgbGF5ZXIubmFtZSA9IG5hbWU7XG4gICAgICAgIGxheWVyLm5vZGUubmFtZSA9IG5hbWU7XG4gICAgICAgIGxheWVyLnNvcnRpbmdPcmRlciA9IHpPcmRlcjtcbiAgICAgICAgZmd1aS5HUm9vdC5pbnN0LmFkZENoaWxkKGxheWVyKTtcbiAgICAgICAgbGF5ZXIubWFrZUZ1bGxTY3JlZW4oKTtcbiAgICAgICAgdGhpcy5fbGF5ZXJOb2RlTWFwLnNldCh6T3JkZXIsIGxheWVyKTtcbiAgICAgICAgcmV0dXJuIGxheWVyO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGNhbGxiYWNrIOaJk+W8gOWujOavleWbnuiwg+WHveaVsFxuICAgICAqIEBwYXJhbSBpbnRlbnQg5Lyg5YWl5YiwVUnnmoTlj4LmlbBcbiAgICAqL1xuICAgIHB1YmxpYyBvcGVuVUk8VCBleHRlbmRzIEZndWlWaWV3Pih1aUNsYXNzOiBGZ3VpQ2xhc3M8VD4sIHpPcmRlcjogbnVtYmVyID0gVmlld1pPcmRlci5VSSwgY2FsbGJhY2s/OiBGdW5jdGlvbiwgaW50ZW50PzogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmIChDQ19QUkVWSUVXKSBjb25zb2xlLmxvZyhg5omT5byA6aG16Z2iJHt1aUNsYXNzLmdldFZpZXdOYW1lKCl9YCk7XG4gICAgICAgIGNvbnN0IHZpZXdLZXkgPSB1aUNsYXNzLmdldFZpZXdOYW1lKCk7XG4gICAgICAgIGlmICh0aGlzLl9vcGVuZWQuQ29udGFpbnNLZXkodmlld0tleSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBGZ3VpTWdyOjpPcGVuICR7dmlld0tleX0gaGFzIGFscmVhZHkgb3BlbmVkLmApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmdldENhY2hlVmlldyh1aUNsYXNzLCB6T3JkZXIsIGNhbGxiYWNrKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwa2dOYW1lID0gdWlDbGFzcy5nZXRQa2dOYW1lKCk7XG4gICAgICAgIEV2ZW50TW5nLmVtaXQoR1VJRXZlbnQuU0hPV19NQVNLLCBwa2dOYW1lLCB0cnVlKTtcbiAgICAgICAgaWYgKGZndWkuVUlQYWNrYWdlLmdldEJ5TmFtZShwa2dOYW1lKSA9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyDliqDovb11aXBhY2thZ2VcbiAgICAgICAgICAgIEZndWlMb2FkTWdyLmxvYWRQYWNrYWdlKHBrZ05hbWUsIHBrZ05hbWUsIGFzeW5jIChlcnJvciwgcGtnKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50TW5nLmVtaXQoR1VJRXZlbnQuU0hPV19NQVNLLCBwa2dOYW1lLCBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRmd1aU1nciBMb2FkUGFja2FnZVske3BrZ05hbWV9XSBlcnJvcjogJHtlcnJvcn1gKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLkNyZWF0ZVZpZXcodWlDbGFzcywgek9yZGVyLCBpbnRlbnQsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5DcmVhdGVWaWV3KHVpQ2xhc3MsIHpPcmRlciwgaW50ZW50LCBjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiog5LuO57yT5a2Y5Lit5Yqg6L296aG16Z2iICovXG4gICAgcHJpdmF0ZSBnZXRDYWNoZVZpZXc8VCBleHRlbmRzIEZndWlWaWV3Pih1aUNsYXNzOiBGZ3VpQ2xhc3M8VD4sIHpPcmRlcjogbnVtYmVyID0gVmlld1pPcmRlci5VSSwgY2FsbGJhY2s/OiBGdW5jdGlvbiwgaW50ZW50PzogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHZpZXdLZXkgPSB1aUNsYXNzLmdldFZpZXdOYW1lKCk7XG4gICAgICAgIGlmICh0aGlzLl9jbG9zZWQuQ29udGFpbnNLZXkodmlld0tleSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHVpdmlldyA9IHRoaXMuX2Nsb3NlZC5WYWx1ZSh2aWV3S2V5KTtcbiAgICAgICAgICAgIGlmICh1aXZpZXcudmlld1R5cGUgPT0gVmlld1R5cGUuRnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX29wZW5lZC5Gb3JlYWNoKChrZXk6IHN0cmluZywgdmFsdWU6IEZndWlWaWV3KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS52aWV3VHlwZSAhPSBWaWV3VHlwZS5QYXJ0ICYmIHZhbHVlLnpPcmRlciA8PSB1aXZpZXcuek9yZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5hZGRGdWxsSGlkZUNvdW50KDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2Nsb3NlZC5SZW1vdmUodmlld0tleSk7XG4gICAgICAgICAgICB0aGlzLl9vcGVuZWQuQWRkKHZpZXdLZXksIHVpdmlldyk7XG4gICAgICAgICAgICB0aGlzLkFkZFBhbmVsKHVpdmlldy5QYW5lbCwgek9yZGVyKTtcbiAgICAgICAgICAgIHVpdmlldy5zaG93KGludGVudCk7XG4gICAgICAgICAgICB1aXZpZXcuek9yZGVyID0gek9yZGVyO1xuICAgICAgICAgICAgdWl2aWV3LnVpUGtnTmFtZSA9IHVpQ2xhc3MuZ2V0UGtnTmFtZSgpO1xuICAgICAgICAgICAgLy/lm57osINcbiAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKHVpdmlldyk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIENyZWF0ZVZpZXc8VCBleHRlbmRzIEZndWlWaWV3Pih1aUNsYXNzOiBGZ3VpQ2xhc3M8VD4sIHpPcmRlcjogbnVtYmVyID0gVmlld1pPcmRlci5VSSwgaW50ZW50PzogYW55LCBjb21wbGV0ZT86IEZ1bmN0aW9uKSB7XG4gICAgICAgIGxldCBoYW5kbGVyID0gbmV3IGZndWkuQXN5bmNPcGVyYXRpb24oKTtcbiAgICAgICAgaGFuZGxlci5jYWxsYmFjayA9IGFzeW5jIChnT2JqZWN0KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5fb3BlbmVkLkNvbnRhaW5zS2V5KHVpQ2xhc3MuZ2V0Vmlld05hbWUoKSkpIHtcbiAgICAgICAgICAgICAgICBFdmVudE1uZy5lbWl0KEdVSUV2ZW50LlNIT1dfTUFTSywgdWlDbGFzcy5nZXRQa2dOYW1lKCksIGZhbHNlKVxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZndWlNZ3I6Ok9wZW4gJHt1aUNsYXNzLmdldFZpZXdOYW1lKCl9IGhhcyBhbHJlYWR5IG9wZW5lZC5gKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcGFuZWwgPSBnT2JqZWN0IGFzIGZndWkuR0NvbXBvbmVudDtcbiAgICAgICAgICAgIGlmIChwYW5lbCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgRXZlbnRNbmcuZW1pdChHVUlFdmVudC5TSE9XX01BU0ssIHVpQ2xhc3MuZ2V0UGtnTmFtZSgpLCBmYWxzZSlcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBGZ3VpTWdyIGNyZWF0ZU9iamVjdFske3VpQ2xhc3MuZ2V0Vmlld05hbWV9XSBlcnJvcjogR09iamVjdOS4uuepui5gKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYW5lbC5ub2RlLm5hbWUgPSB1aUNsYXNzLmdldFByZWZhYk5hbWUoKTtcbiAgICAgICAgICAgIGxldCB1aXZpZXcgPSBuZXcgdWlDbGFzcygpO1xuICAgICAgICAgICAgdWl2aWV3LnpPcmRlciA9IHpPcmRlcjtcbiAgICAgICAgICAgIHVpdmlldy51aVBrZ05hbWUgPSB1aUNsYXNzLmdldFBrZ05hbWUoKTtcbiAgICAgICAgICAgIHVpdmlldy5pbml0Rm9yd2FyZChwYW5lbCwgbnVsbCk7XG4gICAgICAgICAgICBjb25zdCByZXNLZWVwZXIgPSBSZXNLZWVwZXIuR2V0KHBhbmVsLm5vZGUsIHRydWUpO1xuICAgICAgICAgICAgbGV0IHJlc0NvbGxlY3RvciA9IG5ldyBSZXNDb2xsZWN0b3IoKTtcbiAgICAgICAgICAgIHVpdmlldy5Db250cm9sbGVyLm9uQ29sbGVjdFJlcyhyZXNDb2xsZWN0b3IsIGludGVudCk7XG4gICAgICAgICAgICBpZiAocmVzQ29sbGVjdG9yLkdldFJlc0xpc3QoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcmVzS2VlcGVyLkxvYWRSZXNDb2xsZWN0b3IocmVzQ29sbGVjdG9yLCBQcm9taXNlRGVmYXVsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodWl2aWV3LnZpZXdUeXBlID09IFZpZXdUeXBlLkZ1bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vcGVuZWQuRm9yZWFjaCgoa2V5OiBzdHJpbmcsIHZhbHVlOiBGZ3VpVmlldykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUudmlld1R5cGUgIT0gVmlld1R5cGUuUGFydCAmJiB2YWx1ZS56T3JkZXIgPD0gdWl2aWV3LnpPcmRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuYWRkRnVsbEhpZGVDb3VudCgxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9vcGVuZWQuQWRkKHVpQ2xhc3MuZ2V0Vmlld05hbWUoKSwgdWl2aWV3KTtcbiAgICAgICAgICAgIHVpdmlldy5pbml0KCk7XG4gICAgICAgICAgICB0aGlzLkFkZFBhbmVsKHBhbmVsLCB6T3JkZXIpO1xuICAgICAgICAgICAgdWl2aWV3LnNob3coaW50ZW50KTtcbiAgICAgICAgICAgIHRoaXMuQWRkUGtnQ291bnQodWlDbGFzcy5nZXRQa2dOYW1lKCksIHVpQ2xhc3MuZ2V0Vmlld05hbWUoKSk7XG5cbiAgICAgICAgICAgIEV2ZW50TW5nLmVtaXQoR1VJRXZlbnQuU0hPV19NQVNLLCB1aUNsYXNzLmdldFBrZ05hbWUoKSwgZmFsc2UpXG4gICAgICAgICAgICBjb21wbGV0ZSAmJiBjb21wbGV0ZSh1aXZpZXcpO1xuICAgICAgICB9O1xuICAgICAgICBoYW5kbGVyLmNyZWF0ZU9iamVjdCh1aUNsYXNzLmdldFBrZ05hbWUoKSwgdWlDbGFzcy5nZXRQcmVmYWJOYW1lKCkpO1xuICAgIH1cblxuXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gaXNEaXNwb3NlIOaYr+WQpumUgOavgVxuICAgICovXG4gICAgcHVibGljIGNsb3NlVUk8VCBleHRlbmRzIEZndWlWaWV3Pih1aUNsYXNzOiBGZ3VpQ2xhc3M8VD4sIGlzRGlzcG9zZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IHZpZXdLZXkgPSB1aUNsYXNzLmdldFZpZXdOYW1lKCk7XG4gICAgICAgIGlmICh0aGlzLl9vcGVuZWQuQ29udGFpbnNLZXkodmlld0tleSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLl9vcGVuZWQuVmFsdWUodmlld0tleSk7XG4gICAgICAgICAgICB0aGlzLl9vcGVuZWQuUmVtb3ZlKHZpZXdLZXkpO1xuICAgICAgICAgICAgdmlldy5oaWRlKGlzRGlzcG9zZSk7XG4gICAgICAgICAgICB0aGlzLlJlbW92ZVBhbmVsKHZpZXcuUGFuZWwpO1xuICAgICAgICAgICAgaWYgKGlzRGlzcG9zZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuRGVzdHJveVZpZXcodmlldywgdWlDbGFzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jbG9zZWQuQWRkKHZpZXdLZXksIHZpZXcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZpZXcudmlld1R5cGUgPT0gVmlld1R5cGUuRnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX29wZW5lZC5Gb3JlYWNoKChrZXk6IHN0cmluZywgdmFsdWU6IEZndWlWaWV3KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS52aWV3VHlwZSAhPSBWaWV3VHlwZS5QYXJ0ICYmIHZhbHVlLnpPcmRlciA8PSB2aWV3LnpPcmRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuYWRkRnVsbEhpZGVDb3VudCgtMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzRGlzcG9zZSAmJiB0aGlzLl9jbG9zZWQuQ29udGFpbnNLZXkodmlld0tleSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLl9jbG9zZWQuVmFsdWUodmlld0tleSk7XG4gICAgICAgICAgICB0aGlzLl9jbG9zZWQuUmVtb3ZlKHZpZXdLZXkpO1xuICAgICAgICAgICAgdGhpcy5EZXN0cm95Vmlldyh2aWV3LCB1aUNsYXNzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyDliKTmlq3nlYzpnaLmmK/lkKbmiZPlvIBcbiAgICBwdWJsaWMgaXNTaG93aW5nPFQgZXh0ZW5kcyBGZ3VpVmlldz4odWlDbGFzczogRmd1aUNsYXNzPFQ+KSB7XG4gICAgICAgIGNvbnN0IHZpZXdLZXkgPSB1aUNsYXNzPy5nZXRWaWV3TmFtZSgpO1xuICAgICAgICBpZiAodGhpcy5fb3BlbmVkLkNvbnRhaW5zS2V5KHZpZXdLZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICAvLyDojrflj5bmiZPlvIDnmoTnlYzpnaJcbiAgICBwdWJsaWMgZ2V0U2hvd2luZ1ZpZXc8VCBleHRlbmRzIEZndWlWaWV3Pih1aUNsYXNzOiBGZ3VpQ2xhc3M8VD4pIHtcbiAgICAgICAgY29uc3Qgdmlld0tleSA9IHVpQ2xhc3M/LmdldFZpZXdOYW1lKCk7XG4gICAgICAgIGlmICh0aGlzLl9vcGVuZWQuQ29udGFpbnNLZXkodmlld0tleSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLl9vcGVuZWQuVmFsdWUodmlld0tleSk7XG4gICAgICAgICAgICByZXR1cm4gdmlld1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICAgIC8qKlxuICAgICAqIOW9k+WJjeaYr+WQpuaciemZpOS6huaMh+WumumhtemdouS7peWklueahOWFtuS7lumhtemdouiiq+aJk+W8gFxuICAgICAqL1xuICAgIHB1YmxpYyBjaGVja090aGVyVUlPcGVuKHVpbGlzdDogRmd1aUNsYXNzPGFueT5bXSkge1xuICAgICAgICBsZXQgbGlzdCA9IFtdXG4gICAgICAgIGZvciAobGV0IGkgb2YgdWlsaXN0KSB7XG4gICAgICAgICAgICBsaXN0LnB1c2goaS5nZXRWaWV3TmFtZSgpKVxuICAgICAgICB9XG4gICAgICAgIGxldCBoYXZlb3RoZXI6IGJvb2xlYW4gPSBmYWxzZVxuICAgICAgICB0aGlzLl9vcGVuZWQuRm9yZWFjaCgoa2V5OiBzdHJpbmcsIHZhbHVlOiBGZ3VpVmlldykgPT4ge1xuICAgICAgICAgICAgaWYgKGxpc3QuaW5kZXhPZihrZXkpIDwgMCkge1xuICAgICAgICAgICAgICAgIGhhdmVvdGhlciA9IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIGhhdmVvdGhlclxuICAgIH1cblxuXG4gICAgcHVibGljIGlzU2hvd2luZ0J5TmFtZSh1aVZpZXdOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29wZW5lZC5Db250YWluc0tleSh1aVZpZXdOYW1lKTtcbiAgICB9XG4gICAgLy8g6I635Y+W5omT5byA55qE55WM6Z2iXG4gICAgcHVibGljIGdldFNob3dpbmdWaWV3QnlOYW1lKHVpVmlld05hbWU6IHN0cmluZykge1xuICAgICAgICBpZiAodGhpcy5fb3BlbmVkLkNvbnRhaW5zS2V5KHVpVmlld05hbWUpKSB7XG4gICAgICAgICAgICBjb25zdCB2aWV3ID0gdGhpcy5fb3BlbmVkLlZhbHVlKHVpVmlld05hbWUpO1xuICAgICAgICAgICAgcmV0dXJuIHZpZXdcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgICBwdWJsaWMgZmluZE5vZGVCeU5hbWUodWlWaWV3TmFtZTogc3RyaW5nLCBnb05hbWU6IHN0cmluZyk6IGNjLk5vZGUge1xuICAgICAgICBpZiAodGhpcy5fb3BlbmVkLkNvbnRhaW5zS2V5KHVpVmlld05hbWUpKSB7XG4gICAgICAgICAgICBsZXQgdmlldyA9IHRoaXMuX29wZW5lZC5WYWx1ZSh1aVZpZXdOYW1lKTtcbiAgICAgICAgICAgIGxldCBnb05hbWVzID0gZ29OYW1lLnNwbGl0KFwiL1wiKVxuICAgICAgICAgICAgbGV0IGdvID0gbnVsbFxuICAgICAgICAgICAgbGV0IGdvVGVtcCA9IHZpZXdbXCJfdmlld01vZGVsXCJdW2dvTmFtZXNbMF1dO1xuICAgICAgICAgICAgaWYgKGdhbWVNZXRob2QuaXNFbXB0eShnb1RlbXApKSB7XG4gICAgICAgICAgICAgICAgZ29UZW1wID0gdmlldy5QYW5lbC5nZXRDaGlsZChnb05hbWVzWzBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgZ29OYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChnb1RlbXA/LlBhbmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGdvVGVtcCA9IGdvVGVtcC5QYW5lbD8uZ2V0Q2hpbGQoZ29OYW1lc1tpXSlcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBnb1RlbXAgPSBnb1RlbXA/LmdldENoaWxkKGdvTmFtZXNbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGdvID0gZ29UZW1wXG4gICAgICAgICAgICBpZiAoIWdhbWVNZXRob2QuaXNFbXB0eShnbykpIHtcbiAgICAgICAgICAgICAgICBnby52aXNpYmxlID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGDnlYzpnaLvvJoke3VpVmlld05hbWV9IOaJvuS4jeWIsOebruagh+iKgueCuTogJHtnb05hbWVzfWApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZ28/Lm5vZGUgPz8gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlUGtnPFQgZXh0ZW5kcyBGZ3VpVmlldz4odWlDbGFzczogRmd1aUNsYXNzPFQ+KSB7XG4gICAgICAgIGlmICghdGhpcy5fYWRkUGtnZWQuQ29udGFpbnNLZXkodWlDbGFzcy5nZXRQa2dOYW1lKCkpIHx8IHRoaXMuX2FkZFBrZ2VkLlZhbHVlKHVpQ2xhc3MuZ2V0UGtnTmFtZSgpKSA9PSAwKSB7XG4gICAgICAgICAgICBmZ3VpLlVJUGFja2FnZS5yZW1vdmVQYWNrYWdlKHVpQ2xhc3MuZ2V0UGtnTmFtZSgpKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFwicmVtb3ZlUGtnIGZhaWxcIilcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhck9wZW5VSSgpIHtcbiAgICAgICAgdGhpcy5fb3BlbmVkLkZvcmVhY2goKHZpZXdLZXk6IHN0cmluZywgdmFsdWU6IEZndWlWaWV3KSA9PiB7XG4gICAgICAgICAgICB2YWx1ZS5oaWRlKCk7XG4gICAgICAgICAgICB0aGlzLlJlbW92ZVBhbmVsKHZhbHVlLlBhbmVsKTtcbiAgICAgICAgICAgIHRoaXMuX2Nsb3NlZC5BZGQodmlld0tleSwgdmFsdWUpO1xuICAgICAgICB9KVxuICAgICAgICB0aGlzLl9vcGVuZWQuQ2xlYXIoKVxuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhckFsbFVJKCkge1xuICAgICAgICB0aGlzLl9vcGVuZWQuRm9yZWFjaCgodmlld0tleTogc3RyaW5nLCB2YWx1ZTogRmd1aVZpZXcpID0+IHtcbiAgICAgICAgICAgIHZhbHVlLmhpZGUoKTtcbiAgICAgICAgICAgIHRoaXMuUmVtb3ZlUGFuZWwodmFsdWUuUGFuZWwpO1xuICAgICAgICB9KVxuICAgICAgICB0aGlzLmNsZWFyQ2FjaGVNYXAoKVxuICAgICAgICAvLyB0aGlzLl9hZGRQa2dlZC5Gb3JlYWNoKChwa2dOYW1lOiBzdHJpbmcsIHZhbHVlOiBudW1iZXIpID0+IHtcbiAgICAgICAgLy8gICAgIGZndWkuVUlQYWNrYWdlLnJlbW92ZVBhY2thZ2UocGtnTmFtZSlcbiAgICAgICAgLy8gfSlcbiAgICAgICAgdGhpcy5fYWRkUGtnZWQuQ2xlYXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXJDYWNoZU1hcCgpIHtcbiAgICAgICAgdGhpcy5fb3BlbmVkLkNsZWFyKClcbiAgICAgICAgdGhpcy5fY2xvc2VkLkNsZWFyKClcbiAgICB9XG5cblxuXG4gICAgT25VcGRhdGUoZWxhcHNlVGltZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29wZW5lZC5Gb3JlYWNoKChrLCB2KSA9PiB7XG4gICAgICAgICAgICB2Lk9uVXBkYXRlKGVsYXBzZVRpbWUpO1xuICAgICAgICB9LCB0aGlzKTtcbiAgICB9XG4gICAgT25MYXRlVXBkYXRlKGVsYXBzZVRpbWU6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLl9vcGVuZWQuRm9yZWFjaCgoaywgdikgPT4ge1xuICAgICAgICAgICAgdi5PbkxhdGVVcGRhdGUoZWxhcHNlVGltZSk7XG4gICAgICAgIH0sIHRoaXMpO1xuICAgIH1cbiAgICBEaXNwb3NlKCk6IHZvaWQge1xuICAgICAgICAvL1RPRE8g5pyJ6ZyA6KaB5YaN6KGl5YWFXG4gICAgfVxuXG4gICAgLyoqIOWinuWKoGZndWkgcGtn6K6h5pWwICovXG4gICAgcHVibGljIEFkZFBrZ0NvdW50KHBrZ05hbWU6IHN0cmluZywgZnJvbT86IHN0cmluZykge1xuICAgICAgICBpZiAodGhpcy5fYWRkUGtnZWQuQ29udGFpbnNLZXkocGtnTmFtZSkpIHtcbiAgICAgICAgICAgIC8v5bey5a2Y5ZyoKytcbiAgICAgICAgICAgIGxldCBwa2dDb3VudCA9IHRoaXMuX2FkZFBrZ2VkLlZhbHVlKHBrZ05hbWUpO1xuICAgICAgICAgICAgcGtnQ291bnQrKztcbiAgICAgICAgICAgIHRoaXMuX2FkZFBrZ2VkLlJlcGxhY2UocGtnTmFtZSwgcGtnQ291bnQpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9hZGRQa2dlZC5BZGQocGtnTmFtZSwgMSlcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWdhbWVNZXRob2QuaXNFbXB0eShHYW1lRGF0YUNlbnRlcj8uc2V2QmFjaz8uc3dpdGNoPy5jbGllbnRMb2cpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgJHtmcm9tfSAke3BrZ05hbWV9IGNvdW50OiAke3RoaXMuX2FkZFBrZ2VkLlZhbHVlKHBrZ05hbWUpfWApXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiog5YeP5bCRZmd1aSBwa2forqHmlbAgKi9cbiAgICBwdWJsaWMgRGVsUGtnQ291bnQocGtnTmFtZTogc3RyaW5nLCBmcm9tPzogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLl9hZGRQa2dlZC5Db250YWluc0tleShwa2dOYW1lKSkge1xuICAgICAgICAgICAgLy/lt7LlrZjlnKgrK1xuICAgICAgICAgICAgbGV0IHBrZ0NvdW50ID0gdGhpcy5fYWRkUGtnZWQuVmFsdWUocGtnTmFtZSk7XG4gICAgICAgICAgICBwa2dDb3VudC0tO1xuICAgICAgICAgICAgaWYgKCFnYW1lTWV0aG9kLmlzRW1wdHkoR2FtZURhdGFDZW50ZXI/LnNldkJhY2s/LnN3aXRjaD8uY2xpZW50TG9nKSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGAke3BrZ05hbWV9IGNvdW50OiAke3BrZ0NvdW50fWAsIGZyb20pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9hZGRQa2dlZC5SZXBsYWNlKHBrZ05hbWUsIHBrZ0NvdW50KTtcbiAgICAgICAgICAgIGlmIChwa2dDb3VudCA8PSAwICYmIHBrZ05hbWUgIT0gXCJDb21tb25cIikge1xuICAgICAgICAgICAgICAgIGlmICghZ2FtZU1ldGhvZC5pc0VtcHR5KEdhbWVEYXRhQ2VudGVyPy5zZXZCYWNrPy5zd2l0Y2g/LmNsaWVudExvZykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYHJlbW92ZVBhY2thZ2U6JHtwa2dOYW1lfWAsIGZyb20pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZndWkuVUlQYWNrYWdlLnJlbW92ZVBhY2thZ2UocGtnTmFtZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgQWRkUGtnQnlQa2dOYW1lKHBrZ05hbWU6IHN0cmluZywgY2I/OiBGdW5jdGlvbikge1xuICAgICAgICBpZiAoZmd1aS5VSVBhY2thZ2UuZ2V0QnlOYW1lKHBrZ05hbWUpID09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIOWKoOi9vXVpcGFja2FnZVxuICAgICAgICAgICAgRmd1aUxvYWRNZ3IubG9hZFBhY2thZ2UocGtnTmFtZSwgcGtnTmFtZSwgKGVycm9yLCBwa2cpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRNbmcuZW1pdChHVUlFdmVudC5TSE9XX01BU0ssIHBrZ05hbWUsIGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBGZ3VpTWdyIExvYWRQYWNrYWdlWyR7cGtnTmFtZX1dIGVycm9yOiAke2Vycm9yfWApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuQWRkUGtnQ291bnQocGtnTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFnYW1lTWV0aG9kLmlzRW1wdHkoR2FtZURhdGFDZW50ZXI/LnNldkJhY2s/LnN3aXRjaD8uY2xpZW50TG9nKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgJHtwa2dOYW1lfSBjb3VudDogJHt0aGlzLl9hZGRQa2dlZC5WYWx1ZShwa2dOYW1lKX1gKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYiAmJiBjYigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLkFkZFBrZ0NvdW50KHBrZ05hbWUpO1xuICAgICAgICAgICAgaWYgKCFnYW1lTWV0aG9kLmlzRW1wdHkoR2FtZURhdGFDZW50ZXI/LnNldkJhY2s/LnN3aXRjaD8uY2xpZW50TG9nKSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGAke3BrZ05hbWV9IGNvdW50OiAke3RoaXMuX2FkZFBrZ2VkLlZhbHVlKHBrZ05hbWUpfWApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYiAmJiBjYigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgUmVtb3ZlUGtnQnlQa2dOYW1lKHBrZ05hbWU6IHN0cmluZykge1xuICAgICAgICAvL2lvc+W5s+WPsOaJjemHiuaUvu+8jOWuieWNk+W5s+WPsOS4jemHiuaUvlxuICAgICAgICBpZiAoR2FtZURhdGFDZW50ZXIucGxhdC5pbnN0YW5jZS5kZXZpY2VPUyAhPSBQbGF0Rm9ybURldlR5cGUuaW9zSDUgJiYgR2FtZURhdGFDZW50ZXIucGxhdC5pbnN0YW5jZS5kZXZpY2VPUyAhPSBQbGF0Rm9ybURldlR5cGUuaW9zICYmIEdhbWVEYXRhQ2VudGVyLnBsYXQuaW5zdGFuY2UuZGV2aWNlT1MgIT0gUGxhdEZvcm1EZXZUeXBlLmxvY2FsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5EZWxQa2dDb3VudChwa2dOYW1lKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIEFkZFBhbmVsKHBhbmVsOiBmZ3VpLkdDb21wb25lbnQsIHpPcmRlcjogVmlld1pPcmRlcikge1xuICAgICAgICBjb25zdCBsYXllck5vZGUgPSB0aGlzLl9sYXllck5vZGVNYXAuZ2V0KHpPcmRlcik7XG4gICAgICAgIGlmIChsYXllck5vZGUpIHtcbiAgICAgICAgICAgIGxheWVyTm9kZS5hZGRDaGlsZChwYW5lbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmZ3VpLkdSb290Lmluc3QuYWRkQ2hpbGQocGFuZWwpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFVJ5YWo5bGP6Ieq6YCC5bqUXG4gICAgICAgIHBhbmVsLm1ha2VGdWxsU2NyZWVuKCk7XG4gICAgfVxuICAgIHByaXZhdGUgUmVtb3ZlUGFuZWwocGFuZWw6IGZndWkuR0NvbXBvbmVudCkge1xuICAgICAgICBmZ3VpLkdSb290Lmluc3QucmVtb3ZlQ2hpbGQocGFuZWwpO1xuICAgIH1cbiAgICBwcml2YXRlIERlc3Ryb3lWaWV3PFQgZXh0ZW5kcyBGZ3VpVmlldz4odWl2aWV3OiBGZ3VpVmlldywgdWlDbGFzczogRmd1aUNsYXNzPFQ+KSB7XG4gICAgICAgIC8vaW9z5bmz5Y+w5omN6YeK5pS+77yM5a6J5Y2T5bmz5Y+w5LiN6YeK5pS+XG4gICAgICAgIGlmIChHYW1lRGF0YUNlbnRlci5wbGF0Lmluc3RhbmNlLmRldmljZU9TICE9IFBsYXRGb3JtRGV2VHlwZS5pb3NINSAmJiBHYW1lRGF0YUNlbnRlci5wbGF0Lmluc3RhbmNlLmRldmljZU9TICE9IFBsYXRGb3JtRGV2VHlwZS5pb3MgJiYgR2FtZURhdGFDZW50ZXIucGxhdC5pbnN0YW5jZS5kZXZpY2VPUyAhPSBQbGF0Rm9ybURldlR5cGUubG9jYWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGFuZWwgPSB1aXZpZXcuUGFuZWw7XG4gICAgICAgIHBhbmVsLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5EZWxQa2dDb3VudCh1aUNsYXNzLmdldFBrZ05hbWUoKSk7XG4gICAgfVxuXG5cbiAgICBwdWJsaWMgQ2xvc2VVSUJ5TGF5ZXIoek9yZGVyOiBWaWV3Wk9yZGVyKSB7XG4gICAgICAgIHRoaXMuX29wZW5lZC5Gb3JlYWNoKCh2aWV3S2V5OiBzdHJpbmcsIHZhbHVlOiBGZ3VpVmlldykgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbHVlLnpPcmRlciA9PSB6T3JkZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2aWV3ID0gdGhpcy5fb3BlbmVkLlZhbHVlKHZpZXdLZXkpO1xuICAgICAgICAgICAgICAgIHRoaXMuX29wZW5lZC5SZW1vdmUodmlld0tleSk7XG4gICAgICAgICAgICAgICAgdmlldy5oaWRlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5SZW1vdmVQYW5lbCh2aWV3LlBhbmVsKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jbG9zZWQuQWRkKHZpZXdLZXksIHZpZXcpO1xuICAgICAgICAgICAgICAgIGlmICh2aWV3LnZpZXdUeXBlID09IFZpZXdUeXBlLkZ1bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3BlbmVkLkZvcmVhY2goKGtleTogc3RyaW5nLCB2YWx1ZTogRmd1aVZpZXcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS52aWV3VHlwZSAhPSBWaWV3VHlwZS5QYXJ0ICYmIHZhbHVlLnpPcmRlciA8PSB2aWV3LnpPcmRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmFkZEZ1bGxIaWRlQ291bnQoLTEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICAvKiog5YWz6Zet5omA5pyJ55qEVUkgIGVsc2VWaWV3IOaOkumZpOaXoOmcgOWFs+mXreeahOeVjOmdoiAqL1xuICAgIHB1YmxpYyBDbG9zZUFsbFVJKGVsc2VWaWV3OiBzdHJpbmdbXSA9IFtdKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29wZW5lZC5Gb3JlYWNoKCh2aWV3S2V5OiBzdHJpbmcsIHZhbHVlOiBGZ3VpVmlldykgPT4ge1xuICAgICAgICAgICAgaWYgKGVsc2VWaWV3LmluZGV4T2Yodmlld0tleSkgPCAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmlldyA9IHRoaXMuX29wZW5lZC5WYWx1ZSh2aWV3S2V5KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9vcGVuZWQuUmVtb3ZlKHZpZXdLZXkpO1xuICAgICAgICAgICAgICAgIHZpZXcuaGlkZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuUmVtb3ZlUGFuZWwodmlldy5QYW5lbCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2xvc2VkLkFkZCh2aWV3S2V5LCB2aWV3KTtcbiAgICAgICAgICAgICAgICBpZiAodmlldy52aWV3VHlwZSA9PSBWaWV3VHlwZS5GdWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29wZW5lZC5Gb3JlYWNoKChrZXk6IHN0cmluZywgdmFsdWU6IEZndWlWaWV3KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUudmlld1R5cGUgIT0gVmlld1R5cGUuUGFydCAmJiB2YWx1ZS56T3JkZXIgPD0gdmlldy56T3JkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5hZGRGdWxsSGlkZUNvdW50KC0xKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxuXG5cbiAgICAvLyNlbmRyZWdpb25cbn0iXX0=