BattleScene.js
71.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
(function() {
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
var __module = nodeEnv ? module : {exports:{}};
var __filename = 'preview-scripts/assets/scripts/scenes/BattleScene.js';
var __require = nodeEnv ? function (request) {
return cc.require(request);
} : function (request) {
return __quick_compile_project__.require(request, __filename);
};
function __define (exports, require, module) {
if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict";
cc._RF.push(module, '42eafpA7wRDZ6zpdAZ7t9KK', 'BattleScene');
// scripts/scenes/BattleScene.ts
"use strict";
// Learn TypeScript:
// - https://docs.cocos.com/creator/manual/en/scripting/typescript.html
// Learn Attribute:
// - https://docs.cocos.com/creator/manual/en/scripting/reference/attributes.html
// Learn life-cycle callbacks:
// - https://docs.cocos.com/creator/manual/en/scripting/life-cycle-callbacks.html
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
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;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
Object.defineProperty(exports, "__esModule", { value: true });
var SaveDataManager_1 = require("../component/SaveDataManager");
var Global_1 = require("../Global");
var BattleConst_1 = require("../kernel/battle/BattleConst");
var BattleManager_1 = require("../kernel/battle/BattleManager");
var PhysicsControl_1 = require("../kernel/physics/PhysicsControl");
var IntroTableMgr_1 = require("../kernel/table/IntroTableMgr");
var TableDefine_1 = require("../kernel/table/TableDefine");
var Ball_1 = require("../prefabs/Ball");
var UIManager_1 = require("../ui/UIManager");
var UIBattle_1 = require("../ui/uiView/UIBattle");
var UITitleData_1 = require("../ui/uiView/UITitleData");
var _a = cc._decorator, ccclass = _a.ccclass, property = _a.property;
var BattleScene = /** @class */ (function (_super) {
__extends(BattleScene, _super);
function BattleScene() {
var _this = _super !== null && _super.apply(this, arguments) || this;
_this.prefabCollection = null;
_this._pointerVec = cc.v2();
_this._ballWorldP = cc.v2();
_this._hitPList = [];
_this._hitBallList = [];
_this._minShootDeg = 1;
return _this;
//#endregion
}
Object.defineProperty(BattleScene.prototype, "mapView", {
get: function () { return this._mapView; },
enumerable: false,
configurable: true
});
//#region LIFE-CYCLE CALLBACKS:
BattleScene.prototype.onLoad = function () {
this._gameRoot = this.node.getChildByName('GameRoot');
BattleManager_1.BattleManager.ins.eventNode.on(BattleConst_1.BattleEvent.ROUND_END, this.onRoundEnd, this);
BattleManager_1.BattleManager.ins.eventNode.on(BattleConst_1.BattleEvent.SKILL_START, this.onSkillStart, this);
BattleManager_1.BattleManager.ins.eventNode.on(BattleConst_1.BattleEvent.SKILL_END, this.onSkillEnd, this);
BattleManager_1.BattleManager.ins.eventNode.on(BattleConst_1.BattleEvent.BORN_POS_CHANGE, this.onBornPosChange, this);
this._minShootDeg = Global_1.tMgr.getConfig(TableDefine_1.TableName.GAME_PLAY, 10).Value;
};
BattleScene.prototype.onEnable = function () {
this._gameRoot.on(cc.Node.EventType.TOUCH_START, this.onTouchStart, this);
UIManager_1.UIManager.ins.widgetLayer.active = false;
this.schedule(this.onLazyUpdate, 1 / 20);
//预加载弹窗
cc.resources.preload([Global_1.WindowName.BATTLE_RESULT, Global_1.WindowName.USER_SKILL_INFO, Global_1.WindowName.BATTLE_RESULT_PRE_ANI], cc.Prefab);
BattleConst_1.getGlobalNode().on(Global_1.GlobalEvent.SHAKE, this.onShake, this);
};
BattleScene.prototype.onDisable = function () {
this._gameRoot.off(cc.Node.EventType.TOUCH_START, this.onTouchStart, this);
this.unschedule(this.onLazyUpdate);
};
BattleScene.prototype.onDestroy = function () {
BattleManager_1.BattleManager.ins.eventNode.targetOff(this);
BattleConst_1.getGlobalNode().targetOff(this);
// BattleManager.ins.eventNode.on(BattleEvent.SKILL_START, this.onSkillStart, this);
};
BattleScene.prototype.start = function () {
this._gameRoot.getComponent(cc.Widget).updateAlignment(); //第二次进场景时 widiget没有更新,手动更新下
// this._diagonal = Math.sqrt(this._gameRoot.width * this._gameRoot.width + this._gameRoot.height * this._gameRoot.height); //对角线长
if (UITitleData_1.UITitleData.id == 0) {
BattleManager_1.BattleManager.ins.startBattle(0, this.onMapLoaded, this, this.prefabCollection);
}
else {
BattleManager_1.BattleManager.ins.startBattle(UITitleData_1.UITitleData.id, this.onMapLoaded, this, this.prefabCollection);
}
var introConfig = IntroTableMgr_1.IntroTableMgr.ins.getTableByLevel(UITitleData_1.UITitleData.id);
if (introConfig) {
//需要弹提示
UIManager_1.UIManager.ins.openWindow(Global_1.WindowName.INTRO, introConfig.Level);
}
else {
//不需要弹提示,且未使用黄金瞄准期间,概率弹出黄金瞄准
if (Date.now() > SaveDataManager_1.SaveDataManager.ins.runtimeData.goldenAimEndTime) {
var rate = Global_1.tMgr.getConfig(TableDefine_1.TableName.GAME_PLAY, 30).Value;
if (slib.MathUtil.getRandom(0, 100) < rate) {
UIManager_1.UIManager.ins.openWindow(Global_1.WindowName.GOLDEN_AIM);
}
}
}
this._gameRoot.getChildByName('tips1').active = false;
this._gameRoot.getChildByName('tips2').active = false;
this._gameRoot.getChildByName('guideAim').active = false;
if (UITitleData_1.UITitleData.id == 1 || UITitleData_1.UITitleData.id == 2) {
//提示
this._gameRoot.getChildByName('tips1').active = true;
this._gameRoot.getChildByName('tips2').active = true;
this._gameRoot.getChildByName('guideAim').active = true;
this._gameRoot.getChildByName('tips1').getComponent(cc.Label).string = Global_1.tMgr.getConfig(TableDefine_1.TableName.GAME_PLAY, 28).Comment;
this._gameRoot.getChildByName('tips2').getComponent(cc.Label).string = Global_1.tMgr.getConfig(TableDefine_1.TableName.GAME_PLAY, 29).Comment;
}
};
BattleScene.prototype.onLazyUpdate = function () {
if (BattleManager_1.BattleManager.ins.curBattle) {
if (BattleManager_1.BattleManager.ins.curBattle.roundRunning) {
this._ballNumNode.getComponentInChildren(cc.Label).string = BattleManager_1.BattleManager.ins.curBattle.marblesCollectCount.toString();
}
else {
var rate = (BattleManager_1.BattleManager.ins.curBattle.doubleShoot ? 2 : 1);
this._ballNumNode.getComponentInChildren(cc.Label).string = (BattleManager_1.BattleManager.ins.curBattle.marblesNum * rate).toString();
}
}
};
// update (dt) {}
//#endregion
//#region public method
//#endregion
//#region private method
BattleScene.prototype.onMapLoaded = function () {
this._mapView = BattleManager_1.BattleManager.ins.curBattle.mapView;
var scale = this._gameRoot.width / this._mapView.width;
this._mapView.setScale(scale, scale); // 按宽度缩放
this._mapView.setPosition(0, -this._gameRoot.height / 2 + this._mapView.height * scale / 2); //将 mapView和gameRoot底端对齐
BattleManager_1.BattleManager.ins.curBattle.scale = scale;
this._gameRoot.addChild(this._mapView);
this._spliterNode = this._gameRoot.getChildByName('spliter');
this._spliterNode.removeFromParent();
this._mapView.addChild(this._spliterNode);
this._pointerNode = this._gameRoot.getChildByName('imgPointer');
this._pointerNode.removeFromParent();
this._mapView.addChild(this._pointerNode);
this._ballNumNode = this._pointerNode.getChildByName('numNode');
if (UITitleData_1.UITitleData.id == 1 || UITitleData_1.UITitleData.id == 2) {
//提示
var tips = this._gameRoot.getChildByName('tips1');
var gridPos = (UITitleData_1.UITitleData.id == 1 ? cc.v2(4, 5) : cc.v2(5, 7));
var pos = BattleManager_1.BattleManager.ins.curBattle.mapData.getPixelPosByGridPos(gridPos);
this.mapView.convertToWorldSpaceAR(pos, pos);
this._gameRoot.convertToNodeSpaceAR(pos, pos);
tips.setPosition(pos);
gridPos = (UITitleData_1.UITitleData.id == 1 ? cc.v2(7, 4) : cc.v2(10, 6));
pos = BattleManager_1.BattleManager.ins.curBattle.mapData.getPixelPosByGridPos(gridPos);
this.mapView.convertToWorldSpaceAR(pos, pos);
this._gameRoot.convertToNodeSpaceAR(pos, pos);
this._gameRoot.getChildByName('guideAim').active = true;
this._gameRoot.getChildByName('guideAim').setPosition(pos);
}
this.onRoundEnd();
};
BattleScene.prototype.testRayLineNew = function (vec) {
this._hitPList.length = 0;
var v = cc.v2();
vec.normalize(v);
// let speed = (tMgr.getConfig(TableName.GAME_PLAY, 3) as GamePlayTable).Value
v.multiplyScalar(200); //速度固定为200,避免高速带来的误差,避免速度太慢带来的性能开销
PhysicsControl_1.PhysicsControl.ins.setPhysicsEnable(true);
this._mapView.testBall.setPosition(BattleManager_1.BattleManager.ins.curBattle.marblesBornPos);
this._mapView.testBall.getComponent(cc.RigidBody).linearVelocity = v;
// let len = (tMgr.getConfig(TableName.GAME_PLAY, 9) as GamePlayTable).Value
// let time = len / speed;
// for (let i = 0; i < 10; ++i) {
// PhysicsControl.ins.update(time);
// }
// PhysicsControl.ins.setPhysicsEnable(false);
var goldenAim = (SaveDataManager_1.SaveDataManager.ins.runtimeData.goldenAimTry || Date.now() <= SaveDataManager_1.SaveDataManager.ins.runtimeData.goldenAimEndTime);
var hitCount = (goldenAim ? 3 : 1);
while (this._hitPList.length < hitCount) {
PhysicsControl_1.PhysicsControl.ins.update(1 / 60);
}
PhysicsControl_1.PhysicsControl.ins.update(2 / 60);
PhysicsControl_1.PhysicsControl.ins.setPhysicsEnable(false);
this._hitPList = this._hitPList.slice(0, hitCount);
var i = 0;
for (i; i < this._hitPList.length; ++i) {
if (i == 0) {
this.drawLine(this._ballWorldP, this._hitPList[i]);
}
else {
this.drawLine(this._hitPList[i - 1], this._hitPList[i]);
}
var ball = void 0;
if (i < this._hitBallList.length) {
ball = this._hitBallList[i];
}
else {
ball = cc.instantiate(BattleManager_1.BattleManager.ins.curBattle.prefabCollection.getChildByName('ball'));
ball.getComponent(Ball_1.default).scaleEnable = false;
ball.getComponent(cc.Collider).enabled = false;
ball.getChildByName('img').getComponent(cc.Sprite).sizeMode = cc.Sprite.SizeMode.CUSTOM;
var colliderSize = ball.getComponent(cc.PhysicsCircleCollider).radius * 2;
ball.getChildByName('img').setContentSize(colliderSize, colliderSize);
ball.getChildByName('img').scale = 1;
// ball.scale = 0.5;
this._hitBallList.push(ball);
this._gameRoot.addChild(ball);
}
ball.active = true;
var pos = this._gameRoot.convertToNodeSpaceAR(this._hitPList[i]);
ball.setPosition(pos);
}
for (i; i < this._hitBallList.length; ++i) {
this._hitBallList[i].active = false;
}
// let t = this._mapView.convertToWorldSpaceAR(this._mapView.testBall.position);
// let tt = cc.v2(t.x, t.y);
// if (this._hitPList.length == 0) {
// this.drawLine(this._ballWorldP, tt);
// }
// else {
// this.drawLine(this._hitPList[this._hitPList.length - 1], tt);
// }
// this._lastCollisionV.normalizeSelf();
// this._lastCollisionV.multiplyScalar(100);
var lastPoint = this._hitPList[this._hitPList.length - 1];
var t = this._mapView.convertToWorldSpaceAR(this._mapView.testBall.position);
var tt = cc.v2(t.x - lastPoint.x, t.y - lastPoint.y); //从终点指向小球的向量
tt.normalizeSelf();
tt.multiplyScalar(Global_1.tMgr.getConfig(TableDefine_1.TableName.GAME_PLAY, 9).Value);
tt.x = lastPoint.x + tt.x;
tt.y = lastPoint.y + tt.y;
this.drawLine(this._hitPList[this._hitPList.length - 1], tt);
};
// private _lastCollisionV: cc.Vec2 = new cc.Vec2();
BattleScene.prototype.onTestBallCollision = function (contact, selfCollider, otherCollider) {
// let manifold = contact.getWorldManifold();
// if (manifold.points.length > 0) {
// this._hitPList.push(cc.v2(manifold.points[0].x, manifold.points[0].y));
// }
this._hitPList.push(selfCollider.node.convertToWorldSpaceAR(cc.Vec2.ZERO));
};
BattleScene.prototype.drawLine = function (worldStart, worldEnd) {
var goldenAim = (SaveDataManager_1.SaveDataManager.ins.runtimeData.goldenAimTry || Date.now() <= SaveDataManager_1.SaveDataManager.ins.runtimeData.goldenAimEndTime);
var g = this._gameRoot.getComponent(cc.Graphics);
g.fillColor.fromHEX(goldenAim ? '#FFFF00' : '#FFFFFF');
var gStart = this._gameRoot.convertToNodeSpaceAR(worldStart);
var gEnd = this._gameRoot.convertToNodeSpaceAR(worldEnd);
var vec = cc.v2();
cc.Vec2.subtract(vec, gEnd, gStart);
var len = vec.mag();
var step = 0;
var lerpVec = cc.v2();
while (true) {
var ratio = step / len;
var end = false;
if (ratio > 1) {
ratio = 1;
end = true;
}
gEnd.lerp(gStart, ratio, lerpVec);
// g.moveTo();
g.circle(lerpVec.x, lerpVec.y, 3);
g.fill();
step += 20;
if (end) {
break;
}
}
};
BattleScene.prototype.changePointer = function (double) {
// let ballNode = this._pointerNode.getChildByName('ball');
// ballNode.active = !double;
this._spliterNode.active = double;
if (double) {
BattleManager_1.BattleManager.ins.shootTouchEnable = false;
this._spliterNode.getComponent(cc.Animation).once('finished', function () { BattleManager_1.BattleManager.ins.shootTouchEnable = true; }, this);
this._spliterNode.getComponent(cc.Animation).play('ani_gun001');
this._spliterNode.setPosition(BattleManager_1.BattleManager.ins.curBattle.marblesBornPos);
}
};
//#endregion
//#region event
BattleScene.prototype.onTouchStart = function (e) {
if (!BattleManager_1.BattleManager.ins.shootTouchEnable) {
return;
}
this.node.getChildByName('UIBattle').getComponent(UIBattle_1.default).setCancelNodeVisible(true);
this._gameRoot.on(cc.Node.EventType.TOUCH_MOVE, this.onTouchMove, this);
this._gameRoot.on(cc.Node.EventType.TOUCH_END, this.onTouchEnd, this);
this._gameRoot.on(cc.Node.EventType.TOUCH_CANCEL, this.onTouchCancel, this);
this._mapView.testBall.active = true;
this.onTouchMove(e);
var chargingNode = this._pointerNode.getChildByName('chargingNode');
chargingNode.active = true;
chargingNode.getComponent(cc.Animation).play('fx_xuli_001');
};
BattleScene.prototype.onTouchMove = function (e) {
var touchP = e.getLocation();
// cc.Vec2.subtract(this._pointerVec, touchP, this._ballWorldP);
var deg = slib.MathUtil.get360DegByVec(touchP.x - this._ballWorldP.x, touchP.y - this._ballWorldP.y);
if (deg < this._minShootDeg || deg > 180 - this._minShootDeg) {
this.node.getChildByName('UIBattle').getComponent(UIBattle_1.default).setCancelNodeHit(true);
return;
}
this.node.getChildByName('UIBattle').getComponent(UIBattle_1.default).setCancelNodeHit(false);
cc.Vec2.subtract(this._pointerVec, touchP, this._ballWorldP);
this._gameRoot.getComponent(cc.Graphics).clear();
this.testRayLineNew(this._pointerVec);
//旋转指针
if (BattleManager_1.BattleManager.ins.curBattle.doubleShoot) {
var deg_1 = slib.MathUtil.get360DegByVec(this._pointerVec.x, this._pointerVec.y);
var nodeA = this._spliterNode.getChildByName('ani_guna');
var nodeB = this._spliterNode.getChildByName('ani_gunb');
nodeA.angle = deg_1 - 90; //指向正上方
nodeB.angle = (90 - deg_1);
var otherPointer = cc.v2(-this._pointerVec.x, this._pointerVec.y);
this.testRayLineNew(otherPointer);
}
};
BattleScene.prototype.onTouchCancel = function () {
var pointer = this._mapView.getChildByName('imgPointer');
pointer.angle = 0;
// let g = this._gameRoot.getComponent(cc.Graphics);
// g.clear();
this._gameRoot.off(cc.Node.EventType.TOUCH_MOVE, this.onTouchMove, this);
this._gameRoot.off(cc.Node.EventType.TOUCH_END, this.onTouchEnd, this);
this._gameRoot.off(cc.Node.EventType.TOUCH_CANCEL, this.onTouchCancel, this);
this.node.getChildByName('UIBattle').getComponent(UIBattle_1.default).setCancelNodeVisible(false);
var chargingNode = this._pointerNode.getChildByName('chargingNode');
chargingNode.getComponent(cc.Animation).stop('fx_xuli_001');
chargingNode.active = false;
this._mapView.testBall.active = false;
this._gameRoot.getComponent(cc.Graphics).clear();
for (var i = 0; i < this._hitBallList.length; ++i) {
this._hitBallList[i].active = false;
}
};
BattleScene.prototype.onTouchEnd = function () {
this.onTouchCancel();
BattleManager_1.BattleManager.ins.curBattle.shoot(this._pointerVec);
this._gameRoot.getChildByName('tips1').active = false;
this._gameRoot.getChildByName('guideAim').active = false;
};
BattleScene.prototype.onSkillStart = function (skillId) {
if (skillId == BattleConst_1.UserSkill.DOUBLE_SHOOT) {
this.changePointer(true);
}
else if (skillId == BattleConst_1.UserSkill.SHIELD) {
this.setShieldEnable(true);
}
};
BattleScene.prototype.onSkillEnd = function (skillId) {
if (skillId == BattleConst_1.UserSkill.SHIELD) {
this.setShieldEnable(false);
}
};
BattleScene.prototype.onBornPosChange = function () {
this._pointerNode.getChildByName('ball').active = true;
this._pointerNode.setPosition(BattleManager_1.BattleManager.ins.curBattle.marblesBornPosNextRound);
};
BattleScene.prototype.onRoundEnd = function () {
this._ballWorldP = this._mapView.convertToWorldSpaceAR(BattleManager_1.BattleManager.ins.curBattle.marblesBornPos);
this._pointerNode.setPosition(BattleManager_1.BattleManager.ins.curBattle.marblesBornPos);
this.changePointer(false);
};
BattleScene.prototype.setShieldEnable = function (value) {
var effectNode = cc.find('GameRoot/borderCollector/effect', this.node);
effectNode.active = value;
if (value) {
var duration = effectNode.getComponent(cc.Animation).play('fx_gl_chzd_001').duration;
this.schedule(function () {
effectNode.getComponent(cc.Animation).play('fx_gl_chzd_002');
}, duration, 1);
}
else {
// this.unscheduleAllCallbacks();
}
};
BattleScene.prototype.onShake = function (value) {
var ani = this.node.getChildByName('Main Camera').getComponent(cc.Animation);
if (value) {
ani.stop('ani_shake');
ani.play('ani_shake');
}
else {
this.node.getChildByName('Main Camera').setPosition(0, 0, 0);
// let state = ani.getAnimationState('ani_shake');
// state.time = 0;
// state.stop();
ani.stop('ani_shake');
}
// ani.play('ani_shake');
};
__decorate([
property(cc.Prefab)
], BattleScene.prototype, "prefabCollection", void 0);
BattleScene = __decorate([
ccclass
], BattleScene);
return BattleScene;
}(cc.Component));
exports.default = BattleScene;
cc._RF.pop();
}
if (nodeEnv) {
__define(__module.exports, __require, __module);
}
else {
__quick_compile_project__.registerModuleFunc(__filename, function () {
__define(__module.exports, __require, __module);
});
}
})();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcc2NyaXB0c1xcc2NlbmVzXFxCYXR0bGVTY2VuZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0JBQW9CO0FBQ3BCLHdFQUF3RTtBQUN4RSxtQkFBbUI7QUFDbkIsa0ZBQWtGO0FBQ2xGLDhCQUE4QjtBQUM5QixrRkFBa0Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVsRixnRUFBK0Q7QUFDL0Qsb0NBQTBEO0FBQzFELDREQUFxRjtBQUNyRixnRUFBK0Q7QUFFL0QsbUVBQWtFO0FBQ2xFLCtEQUE4RDtBQUM5RCwyREFBdUU7QUFDdkUsd0NBQW1DO0FBQ25DLDZDQUE0QztBQUM1QyxrREFBNkM7QUFDN0Msd0RBQXVEO0FBRWpELElBQUEsS0FBd0IsRUFBRSxDQUFDLFVBQVUsRUFBbkMsT0FBTyxhQUFBLEVBQUUsUUFBUSxjQUFrQixDQUFDO0FBRzVDO0lBQXlDLCtCQUFZO0lBQXJEO1FBQUEscUVBZ2VDO1FBNWRHLHNCQUFnQixHQUFjLElBQUksQ0FBQztRQVEzQixpQkFBVyxHQUFZLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUMvQixpQkFBVyxHQUFZLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQU8vQixlQUFTLEdBQWMsRUFBRSxDQUFDO1FBQzFCLGtCQUFZLEdBQWMsRUFBRSxDQUFDO1FBQzdCLGtCQUFZLEdBQVcsQ0FBQyxDQUFDOztRQXdjakMsWUFBWTtJQUVoQixDQUFDO0lBdGRHLHNCQUFJLGdDQUFPO2FBQVgsY0FBeUIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFjaEQsZ0NBQWdDO0lBRWhDLDRCQUFNLEdBQU47UUFDSSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3RELDZCQUFhLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMseUJBQVcsQ0FBQyxTQUFT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O1lBQ2hCLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDekI7UUFFRCx5QkFBeUI7SUFDN0IsQ0FBQztJQXhkRDtRQURDLFFBQVEsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDO3lEQUNlO0lBSmxCLFdBQVc7UUFEL0IsT0FBTztPQUNhLFdBQVcsQ0FnZS9CO0lBQUQsa0JBQUM7Q0FoZUQsQUFnZUMsQ0FoZXdDLEVBQUUsQ0FBQyxTQUFTLEdBZ2VwRDtrQkFoZW9CLFdBQVciLCJmaWxlIjoiIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyBMZWFybiBUeXBlU2NyaXB0OlxyXG4vLyAgLSBodHRwczovL2RvY3MuY29jb3MuY29tL2NyZWF0b3IvbWFudWFsL2VuL3NjcmlwdGluZy90eXBlc2NyaXB0Lmh0bWxcclxuLy8gTGVhcm4gQXR0cmlidXRlOlxyXG4vLyAgLSBodHRwczovL2RvY3MuY29jb3MuY29tL2NyZWF0b3IvbWFudWFsL2VuL3NjcmlwdGluZy9yZWZlcmVuY2UvYXR0cmlidXRlcy5odG1sXHJcbi8vIExlYXJuIGxpZmUtY3ljbGUgY2FsbGJhY2tzOlxyXG4vLyAgLSBodHRwczovL2RvY3MuY29jb3MuY29tL2NyZWF0b3IvbWFudWFsL2VuL3NjcmlwdGluZy9saWZlLWN5Y2xlLWNhbGxiYWNrcy5odG1sXHJcblxyXG5pbXBvcnQgeyBTYXZlRGF0YU1hbmFnZXIgfSBmcm9tIFwiLi4vY29tcG9uZW50L1NhdmVEYXRhTWFuYWdlclwiO1xyXG5pbXBvcnQgeyBHbG9iYWxFdmVudCwgdE1nciwgV2luZG93TmFtZSB9IGZyb20gXCIuLi9HbG9iYWxcIjtcclxuaW1wb3J0IHsgQmF0dGxlRXZlbnQsIGdldEdsb2JhbE5vZGUsIFVzZXJTa2lsbCB9IGZyb20gXCIuLi9rZXJuZWwvYmF0dGxlL0JhdHRsZUNvbnN0XCI7XHJcbmltcG9ydCB7IEJhdHRsZU1hbmFnZXIgfSBmcm9tIFwiLi4va2VybmVsL2JhdHRsZS9CYXR0bGVNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IE1hcFZpZXcgfSBmcm9tIFwiLi4va2VybmVsL2JhdHRsZS9tYXAvTWFwVmlld1wiO1xyXG5pbXBvcnQgeyBQaHlzaWNzQ29udHJvbCB9IGZyb20gXCIuLi9rZXJuZWwvcGh5c2ljcy9QaHlzaWNzQ29udHJvbFwiO1xyXG5pbXBvcnQgeyBJbnRyb1RhYmxlTWdyIH0gZnJvbSBcIi4uL2tlcm5lbC90YWJsZS9JbnRyb1RhYmxlTWdyXCI7XHJcbmltcG9ydCB7IEdhbWVQbGF5VGFibGUsIFRhYmxlTmFtZSB9IGZyb20gXCIuLi9rZXJuZWwvdGFibGUvVGFibGVEZWZpbmVcIjtcclxuaW1wb3J0IEJhbGwgZnJvbSBcIi4uL3ByZWZhYnMvQmFsbFwiO1xyXG5pbXBvcnQgeyBVSU1hbmFnZXIgfSBmcm9tIFwiLi4vdWkvVUlNYW5hZ2VyXCI7XHJcbmltcG9ydCBVSUJhdHRsZSBmcm9tIFwiLi4vdWkvdWlWaWV3L1VJQmF0dGxlXCI7XHJcbmltcG9ydCB7IFVJVGl0bGVEYXRhIH0gZnJvbSBcIi4uL3VpL3VpVmlldy9VSVRpdGxlRGF0YVwiO1xyXG5cclxuY29uc3QgeyBjY2NsYXNzLCBwcm9wZXJ0eSB9ID0gY2MuX2RlY29yYXRvcjtcclxuXHJcbkBjY2NsYXNzXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhdHRsZVNjZW5lIGV4dGVuZHMgY2MuQ29tcG9uZW50IHtcclxuXHJcblxyXG4gICAgQHByb3BlcnR5KGNjLlByZWZhYilcclxuICAgIHByZWZhYkNvbGxlY3Rpb246IGNjLlByZWZhYiA9IG51bGw7XHJcblxyXG4gICAgLy8gcHJpdmF0ZSBfZGlhZ29uYWw6IG51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIF9nYW1lUm9vdDogY2MuTm9kZTtcclxuXHJcbiAgICBwcml2YXRlIF9tYXBWaWV3OiBNYXBWaWV3O1xyXG4gICAgZ2V0IG1hcFZpZXcoKTogTWFwVmlldyB7IHJldHVybiB0aGlzLl9tYXBWaWV3OyB9XHJcblxyXG4gICAgcHJpdmF0ZSBfcG9pbnRlclZlYzogY2MuVmVjMiA9IGNjLnYyKCk7XHJcbiAgICBwcml2YXRlIF9iYWxsV29ybGRQOiBjYy5WZWMyID0gY2MudjIoKTtcclxuICAgIC8vIHByaXZhdGUgX2VuZFA6IGNjLlZlYzIgPSBjYy52MigpO1xyXG4gICAgcHJpdmF0ZSBfcG9pbnRlck5vZGU6IGNjLk5vZGU7XHJcbiAgICAvKirliIboo4Lngq7oioLngrkgKi9cclxuICAgIHByaXZhdGUgX3NwbGl0ZXJOb2RlOiBjYy5Ob2RlO1xyXG4gICAgcHJpdmF0ZSBfYmFsbE51bU5vZGU6IGNjLk5vZGU7XHJcblxyXG4gICAgcHJpdmF0ZSBfaGl0UExpc3Q6IGNjLlZlYzJbXSA9IFtdO1xyXG4gICAgcHJpdmF0ZSBfaGl0QmFsbExpc3Q6IGNjLk5vZGVbXSA9IFtdO1xyXG4gICAgcHJpdmF0ZSBfbWluU2hvb3REZWc6IG51bWJlciA9IDE7XHJcblxyXG4gICAgLy8jcmVnaW9uICBMSUZFLUNZQ0xFIENBTExCQUNLUzpcclxuXHJcbiAgICBvbkxvYWQoKSB7XHJcbiAgICAgICAgdGhpcy5fZ2FtZVJvb3QgPSB0aGlzLm5vZGUuZ2V0Q2hpbGRCeU5hbWUoJ0dhbWVSb290Jyk7XHJcbiAgICAgICAgQmF0dGxlTWFuYWdlci5pbnMuZXZlbnROb2RlLm9uKEJhdHRsZUV2ZW50LlJPVU5EX0VORCwgdGhpcy5vblJvdW5kRW5kLCB0aGlzKTtcclxuICAgICAgICBCYXR0bGVNYW5hZ2VyLmlucy5ldmVudE5vZGUub24oQmF0dGxlRXZlbnQuU0tJTExfU1RBUlQsIHRoaXMub25Ta2lsbFN0YXJ0LCB0aGlzKTtcclxuICAgICAgICBCYXR0bGVNYW5hZ2VyLmlucy5ldmVudE5vZGUub24oQmF0dGxlRXZlbnQuU0tJTExfRU5ELCB0aGlzLm9uU2tpbGxFbmQsIHRoaXMpO1xyXG4gICAgICAgIEJhdHRsZU1hbmFnZXIuaW5zLmV2ZW50Tm9kZS5vbihCYXR0bGVFdmVudC5CT1JOX1BPU19DSEFOR0UsIHRoaXMub25Cb3JuUG9zQ2hhbmdlLCB0aGlzKTtcclxuXHJcbiAgICAgICAgdGhpcy5fbWluU2hvb3REZWcgPSAodE1nci5nZXRDb25maWcoVGFibGVOYW1lLkdBTUVfUExBWSwgMTApIGFzIEdhbWVQbGF5VGFibGUpLlZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBvbkVuYWJsZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9nYW1lUm9vdC5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9TVEFSVCwgdGhpcy5vblRvdWNoU3RhcnQsIHRoaXMpO1xyXG4gICAgICAgIFVJTWFuYWdlci5pbnMud2lkZ2V0TGF5ZXIuYWN0aXZlID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRoaXMuc2NoZWR1bGUodGhpcy5vbkxhenlVcGRhdGUsIDEgLyAyMCk7XHJcblxyXG4gICAgICAgIC8v6aKE5Yqg6L295by556qXXHJcbiAgICAgICAgY2MucmVzb3VyY2VzLnByZWxvYWQoW1dpbmRvd05hbWUuQkFUVExFX1JFU1VMVCwgV2luZG93TmFtZS5VU0VSX1NLSUxMX0lORk8sIFdpbmRvd05hbWUuQkFUVExFX1JFU1VMVF9QUkVfQU5JXSwgY2MuUHJlZmFiKTtcclxuXHJcbiAgICAgICAgZ2V0R2xvYmFsTm9kZSgpLm9uKEdsb2JhbEV2ZW50LlNIQUtFLCB0aGlzLm9uU2hha2UsIHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBvbkRpc2FibGUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZ2FtZVJvb3Qub2ZmKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX1NUQVJULCB0aGlzLm9uVG91Y2hTdGFydCwgdGhpcyk7XHJcbiAgICAgICAgdGhpcy51bnNjaGVkdWxlKHRoaXMub25MYXp5VXBkYXRlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgb25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIEJhdHRsZU1hbmFnZXIuaW5zLmV2ZW50Tm9kZS50YXJnZXRPZmYodGhpcyk7XHJcbiAgICAgICAgZ2V0R2xvYmFsTm9kZSgpLnRhcmdldE9mZih0aGlzKTtcclxuICAgICAgICAvLyBCYXR0bGVNYW5hZ2VyLmlucy5ldmVudE5vZGUub24oQmF0dGxlRXZlbnQuU0tJTExfU1RBUlQsIHRoaXMub25Ta2lsbFN0YXJ0LCB0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGFydCgpIHtcclxuXHJcbiAgICAgICAgdGhpcy5fZ2FtZVJvb3QuZ2V0Q29tcG9uZW50KGNjLldpZGdldCkudXBkYXRlQWxpZ25tZW50KCk7IC8v56ys5LqM5qyh6L+b5Zy65pmv5pe2IHdpZGlnZXTmsqHmnInmm7TmlrDvvIzmiYvliqjmm7TmlrDkuItcclxuICAgICAgICAvLyB0aGlzLl9kaWFnb25hbCA9IE1hdGguc3FydCh0aGlzLl9nYW1lUm9vdC53aWR0aCAqIHRoaXMuX2dhbWVSb290LndpZHRoICsgdGhpcy5fZ2FtZVJvb3QuaGVpZ2h0ICogdGhpcy5fZ2FtZVJvb3QuaGVpZ2h0KTsgLy/lr7nop5Lnur/plb9cclxuXHJcbiAgICAgICAgaWYgKFVJVGl0bGVEYXRhLmlkID09IDApIHtcclxuICAgICAgICAgICAgQmF0dGxlTWFuYWdlci5pbnMuc3RhcnRCYXR0bGUoMCwgdGhpcy5vbk1hcExvYWRlZCwgdGhpcywgdGhpcy5wcmVmYWJDb2xsZWN0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIEJhdHRsZU1hbmFnZXIuaW5zLnN0YXJ0QmF0dGxlKFVJVGl0bGVEYXRhLmlkLCB0aGlzLm9uTWFwTG9hZGVkLCB0aGlzLCB0aGlzLnByZWZhYkNvbGxlY3Rpb24pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGludHJvQ29uZmlnID0gSW50cm9UYWJsZU1nci5pbnMuZ2V0VGFibGVCeUxldmVsKFVJVGl0bGVEYXRhLmlkKTtcclxuICAgICAgICBpZiAoaW50cm9Db25maWcpIHtcclxuICAgICAgICAgICAgLy/pnIDopoHlvLnmj5DnpLpcclxuICAgICAgICAgICAgVUlNYW5hZ2VyLmlucy5vcGVuV2luZG93KFdpbmRvd05hbWUuSU5UUk8sIGludHJvQ29uZmlnLkxldmVsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcblxyXG4gICAgICAgICAgICAvL+S4jemcgOimgeW8ueaPkOekuu+8jOS4lOacquS9v+eUqOm7hOmHkeeehOWHhuacn+mXtO+8jOamgueOh+W8ueWHuum7hOmHkeeehOWHhlxyXG4gICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSA+IFNhdmVEYXRhTWFuYWdlci5pbnMucnVudGltZURhdGEuZ29sZGVuQWltRW5kVGltZSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHJhdGUgPSAodE1nci5nZXRDb25maWcoVGFibGVOYW1lLkdBTUVfUExBWSwgMzApIGFzIEdhbWVQbGF5VGFibGUpLlZhbHVlO1xyXG4gICAgICAgICAgICAgICAgaWYgKHNsaWIuTWF0aFV0aWwuZ2V0UmFuZG9tKDAsIDEwMCkgPCByYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgVUlNYW5hZ2VyLmlucy5vcGVuV2luZG93KFdpbmRvd05hbWUuR09MREVOX0FJTSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2dhbWVSb290LmdldENoaWxkQnlOYW1lKCd0aXBzMScpLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2dhbWVSb290LmdldENoaWxkQnlOYW1lKCd0aXBzMicpLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2dhbWVSb290LmdldENoaWxkQnlOYW1lKCdndWlkZUFpbScpLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIGlmIChVSVRpdGxlRGF0YS5pZCA9PSAxIHx8IFVJVGl0bGVEYXRhLmlkID09IDIpIHtcclxuICAgICAgICAgICAgLy/mj5DnpLpcclxuICAgICAgICAgICAgdGhpcy5fZ2FtZVJvb3QuZ2V0Q2hpbGRCeU5hbWUoJ3RpcHMxJykuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5fZ2FtZVJvb3QuZ2V0Q2hpbGRCeU5hbWUoJ3RpcHMyJykuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5fZ2FtZVJvb3QuZ2V0Q2hpbGRCeU5hbWUoJ2d1aWRlQWltJykuYWN0aXZlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2dhbWVSb290LmdldENoaWxkQnlOYW1lKCd0aXBzMScpLmdldENvbXBvbmVudChjYy5MYWJlbCkuc3RyaW5nID0gKHRNZ3IuZ2V0Q29uZmlnKFRhYmxlTmFtZS5HQU1FX1BMQVksIDI4KSBhcyBHYW1lUGxheVRhYmxlKS5Db21tZW50O1xyXG4gICAgICAgICAgICB0aGlzLl9nYW1lUm9vdC5nZXRDaGlsZEJ5TmFtZSgndGlwczInKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpLnN0cmluZyA9ICh0TWdyLmdldENvbmZpZyhUYWJsZU5hbWUuR0FNRV9QTEFZLCAyOSkgYXMgR2FtZVBsYXlUYWJsZSkuQ29tbWVudDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25MYXp5VXBkYXRlKCkge1xyXG4gICAgICAgIGlmIChCYXR0bGVNYW5hZ2VyLmlucy5jdXJCYXR0bGUpIHtcclxuICAgICAgICAgICAgaWYgKEJhdHRsZU1hbmFnZXIuaW5zLmN1ckJhdHRsZS5yb3VuZFJ1bm5pbmcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2JhbGxOdW1Ob2RlLmdldENvbXBvbmVudEluQ2hpbGRyZW4oY2MuTGFiZWwpLnN0cmluZyA9IEJhdHRsZU1hbmFnZXIuaW5zLmN1ckJhdHRsZS5tYXJibGVzQ29sbGVjdENvdW50LnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcmF0ZSA9IChCYXR0bGVNYW5hZ2VyLmlucy5jdXJCYXR0bGUuZG91YmxlU2hvb3QgPyAyIDogMSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9iYWxsTnVtTm9kZS5nZXRDb21wb25lbnRJbkNoaWxkcmVuKGNjLkxhYmVsKS5zdHJpbmcgPSAoQmF0dGxlTWFuYWdlci5pbnMuY3VyQmF0dGxlLm1hcmJsZXNOdW0gKiByYXRlKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIHVwZGF0ZSAoZHQpIHt9XHJcblxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8jcmVnaW9uIHB1YmxpYyBtZXRob2RcclxuXHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gcHJpdmF0ZSBtZXRob2RcclxuXHJcbiAgICBwcml2YXRlIG9uTWFwTG9hZGVkKCkge1xyXG5cclxuICAgICAgICB0aGlzLl9tYXBWaWV3ID0gQmF0dGxlTWFuYWdlci5pbnMuY3VyQmF0dGxlLm1hcFZpZXc7XHJcblxyXG4gICAgICAgIGxldCBzY2FsZSA9IHRoaXMuX2dhbWVSb290LndpZHRoIC8gdGhpcy5fbWFwVmlldy53aWR0aDtcclxuICAgICAgICB0aGlzLl9tYXBWaWV3LnNldFNjYWxlKHNjYWxlLCBzY2FsZSk7IC8vIOaMieWuveW6pue8qeaUvlxyXG4gICAgICAgIHRoaXMuX21hcFZpZXcuc2V0UG9zaXRpb24oMCwgLSB0aGlzLl9nYW1lUm9vdC5oZWlnaHQgLyAyICsgdGhpcy5fbWFwVmlldy5oZWlnaHQgKiBzY2FsZSAvIDIpOyAvL+WwhiBtYXBWaWV35ZKMZ2FtZVJvb3TlupXnq6/lr7npvZBcclxuICAgICAgICBCYXR0bGVNYW5hZ2VyLmlucy5jdXJCYXR0bGUuc2NhbGUgPSBzY2FsZTtcclxuXHJcbiAgICAgICAgdGhpcy5fZ2FtZVJvb3QuYWRkQ2hpbGQodGhpcy5fbWFwVmlldyk7XHJcblxyXG4gICAgICAgIHRoaXMuX3NwbGl0ZXJOb2RlID0gdGhpcy5fZ2FtZVJvb3QuZ2V0Q2hpbGRCeU5hbWUoJ3NwbGl0ZXInKTtcclxuICAgICAgICB0aGlzLl9zcGxpdGVyTm9kZS5yZW1vdmVGcm9tUGFyZW50KCk7XHJcbiAgICAgICAgdGhpcy5fbWFwVmlldy5hZGRDaGlsZCh0aGlzLl9zcGxpdGVyTm9kZSk7XHJcbiAgICAgICAgdGhpcy5fcG9pbnRlck5vZGUgPSB0aGlzLl9nYW1lUm9vdC5nZXRDaGlsZEJ5TmFtZSgnaW1nUG9pbnRlcicpO1xyXG4gICAgICAgIHRoaXMuX3BvaW50ZXJOb2RlLnJlbW92ZUZyb21QYXJlbnQoKTtcclxuICAgICAgICB0aGlzLl9tYXBWaWV3LmFkZENoaWxkKHRoaXMuX3BvaW50ZXJOb2RlKTtcclxuICAgICAgICB0aGlzLl9iYWxsTnVtTm9kZSA9IHRoaXMuX3BvaW50ZXJOb2RlLmdldENoaWxkQnlOYW1lKCdudW1Ob2RlJyk7XHJcblxyXG4gICAgICAgIGlmIChVSVRpdGxlRGF0YS5pZCA9PSAxIHx8IFVJVGl0bGVEYXRhLmlkID09IDIpIHtcclxuICAgICAgICAgICAgLy/mj5DnpLpcclxuICAgICAgICAgICAgbGV0IHRpcHMgPSB0aGlzLl9nYW1lUm9vdC5nZXRDaGlsZEJ5TmFtZSgndGlwczEnKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBncmlkUG9zID0gKFVJVGl0bGVEYXRhLmlkID09IDEgPyBjYy52Mig0LCA1KSA6IGNjLnYyKDUsIDcpKTtcclxuICAgICAgICAgICAgbGV0IHBvcyA9IEJhdHRsZU1hbmFnZXIuaW5zLmN1ckJhdHRsZS5tYXBEYXRhLmdldFBpeGVsUG9zQnlHcmlkUG9zKGdyaWRQb3MpO1xyXG4gICAgICAgICAgICB0aGlzLm1hcFZpZXcuY29udmVydFRvV29ybGRTcGFjZUFSKHBvcywgcG9zKTtcclxuICAgICAgICAgICAgdGhpcy5fZ2FtZVJvb3QuY29udmVydFRvTm9kZVNwYWNlQVIocG9zLCBwb3MpO1xyXG4gICAgICAgICAgICB0aXBzLnNldFBvc2l0aW9uKHBvcyk7XHJcblxyXG4gICAgICAgICAgICBncmlkUG9zID0gKFVJVGl0bGVEYXRhLmlkID09IDEgPyBjYy52Mig3LCA0KSA6IGNjLnYyKDEwLCA2KSk7XHJcbiAgICAgICAgICAgIHBvcyA9IEJhdHRsZU1hbmFnZXIuaW5zLmN1ckJhdHRsZS5tYXBEYXRhLmdldFBpeGVsUG9zQnlHcmlkUG9zKGdyaWRQb3MpO1xyXG4gICAgICAgICAgICB0aGlzLm1hcFZpZXcuY29udmVydFRvV29ybGRTcGFjZUFSKHBvcywgcG9zKTtcclxuICAgICAgICAgICAgdGhpcy5fZ2FtZVJvb3QuY29udmVydFRvTm9kZVNwYWNlQVIocG9zLCBwb3MpO1xyXG4gICAgICAgICAgICB0aGlzLl9nYW1lUm9vdC5nZXRDaGlsZEJ5TmFtZSgnZ3VpZGVBaW0nKS5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLl9nYW1lUm9vdC5nZXRDaGlsZEJ5TmFtZSgnZ3VpZGVBaW0nKS5zZXRQb3NpdGlvbihwb3MpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5vblJvdW5kRW5kKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB0ZXN0UmF5TGluZU5ldyh2ZWM6IGNjLlZlYzIpIHtcclxuXHJcbiAgICAgICAgdGhpcy5faGl0UExpc3QubGVuZ3RoID0gMDtcclxuXHJcbiAgICAgICAgbGV0IHYgPSBjYy52MigpO1xyXG4gICAgICAgIHZlYy5ub3JtYWxpemUodik7XHJcbiAgICAgICAgLy8gbGV0IHNwZWVkID0gKHRNZ3IuZ2V0Q29uZmlnKFRhYmxlTmFtZS5HQU1FX1BMQVksIDMpIGFzIEdhbWVQbGF5VGFibGUpLlZhbHVlXHJcbiAgICAgICAgdi5tdWx0aXBseVNjYWxhcigyMDApOyAvL+mAn+W6puWbuuWumuS4ujIwMO+8jOmBv+WFjemrmOmAn+W4puadpeeahOivr+W3ru+8jOmBv+WFjemAn+W6puWkquaFouW4puadpeeahOaAp+iDveW8gOmUgFxyXG5cclxuICAgICAgICBQaHlzaWNzQ29udHJvbC5pbnMuc2V0UGh5c2ljc0VuYWJsZSh0cnVlKTtcclxuXHJcbiAgICAgICAgdGhpcy5fbWFwVmlldy50ZXN0QmFsbC5zZXRQb3NpdGlvbihCYXR0bGVNYW5hZ2VyLmlucy5jdXJCYXR0bGUubWFyYmxlc0Jvcm5Qb3MpO1xyXG4gICAgICAgIHRoaXMuX21hcFZpZXcudGVzdEJhbGwuZ2V0Q29tcG9uZW50KGNjLlJpZ2lkQm9keSkubGluZWFyVmVsb2NpdHkgPSB2O1xyXG5cclxuICAgICAgICAvLyBsZXQgbGVuID0gKHRNZ3IuZ2V0Q29uZmlnKFRhYmxlTmFtZS5HQU1FX1BMQVksIDkpIGFzIEdhbWVQbGF5VGFibGUpLlZhbHVlXHJcbiAgICAgICAgLy8gbGV0IHRpbWUgPSBsZW4gLyBzcGVlZDtcclxuXHJcbiAgICAgICAgLy8gZm9yIChsZXQgaSA9IDA7IGkgPCAxMDsgKytpKSB7XHJcbiAgICAgICAgLy8gUGh5c2ljc0NvbnRyb2wuaW5zLnVwZGF0ZSh0aW1lKTtcclxuICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgIC8vIFBoeXNpY3NDb250cm9sLmlucy5zZXRQaHlzaWNzRW5hYmxlKGZhbHNlKTtcclxuXHJcbiAgICAgICAgbGV0IGdvbGRlbkFpbTogYm9vbGVhbiA9IChTYXZlRGF0YU1hbmFnZXIuaW5zLnJ1bnRpbWVEYXRhLmdvbGRlbkFpbVRyeSB8fCBEYXRlLm5vdygpIDw9IFNhdmVEYXRhTWFuYWdlci5pbnMucnVudGltZURhdGEuZ29sZGVuQWltRW5kVGltZSk7XHJcbiAgICAgICAgbGV0IGhpdENvdW50ID0gKGdvbGRlbkFpbSA/IDMgOiAxKTtcclxuXHJcbiAgICAgICAgd2hpbGUgKHRoaXMuX2hpdFBMaXN0Lmxlbmd0aCA8IGhpdENvdW50KSB7XHJcbiAgICAgICAgICAgIFBoeXNpY3NDb250cm9sLmlucy51cGRhdGUoMSAvIDYwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgUGh5c2ljc0NvbnRyb2wuaW5zLnVwZGF0ZSgyIC8gNjApO1xyXG5cclxuICAgICAgICBQaHlzaWNzQ29udHJvbC5pbnMuc2V0UGh5c2ljc0VuYWJsZShmYWxzZSk7XHJcblxyXG4gICAgICAgIHRoaXMuX2hpdFBMaXN0ID0gdGhpcy5faGl0UExpc3Quc2xpY2UoMCwgaGl0Q291bnQpO1xyXG5cclxuICAgICAgICBsZXQgaSA9IDA7XHJcbiAgICAgICAgZm9yIChpOyBpIDwgdGhpcy5faGl0UExpc3QubGVuZ3RoOyArK2kpIHtcclxuICAgICAgICAgICAgaWYgKGkgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kcmF3TGluZSh0aGlzLl9iYWxsV29ybGRQLCB0aGlzLl9oaXRQTGlzdFtpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRyYXdMaW5lKHRoaXMuX2hpdFBMaXN0W2kgLSAxXSwgdGhpcy5faGl0UExpc3RbaV0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgYmFsbDogY2MuTm9kZTtcclxuICAgICAgICAgICAgaWYgKGkgPCB0aGlzLl9oaXRCYWxsTGlzdC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIGJhbGwgPSB0aGlzLl9oaXRCYWxsTGlzdFtpXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGJhbGwgPSBjYy5pbnN0YW50aWF0ZShCYXR0bGVNYW5hZ2VyLmlucy5jdXJCYXR0bGUucHJlZmFiQ29sbGVjdGlvbi5nZXRDaGlsZEJ5TmFtZSgnYmFsbCcpKTtcclxuICAgICAgICAgICAgICAgIGJhbGwuZ2V0Q29tcG9uZW50KEJhbGwpLnNjYWxlRW5hYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBiYWxsLmdldENvbXBvbmVudChjYy5Db2xsaWRlcikuZW5hYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgYmFsbC5nZXRDaGlsZEJ5TmFtZSgnaW1nJykuZ2V0Q29tcG9uZW50KGNjLlNwcml0ZSkuc2l6ZU1vZGUgPSBjYy5TcHJpdGUuU2l6ZU1vZGUuQ1VTVE9NO1xyXG4gICAgICAgICAgICAgICAgbGV0IGNvbGxpZGVyU2l6ZSA9IGJhbGwuZ2V0Q29tcG9uZW50KGNjLlBoeXNpY3NDaXJjbGVDb2xsaWRlcikucmFkaXVzICogMjtcclxuICAgICAgICAgICAgICAgIGJhbGwuZ2V0Q2hpbGRCeU5hbWUoJ2ltZycpLnNldENvbnRlbnRTaXplKGNvbGxpZGVyU2l6ZSwgY29sbGlkZXJTaXplKTtcclxuICAgICAgICAgICAgICAgIGJhbGwuZ2V0Q2hpbGRCeU5hbWUoJ2ltZycpLnNjYWxlID0gMTtcclxuICAgICAgICAgICAgICAgIC8vIGJhbGwuc2NhbGUgPSAwLjU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9oaXRCYWxsTGlzdC5wdXNoKGJhbGwpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZ2FtZVJvb3QuYWRkQ2hpbGQoYmFsbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYmFsbC5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICBsZXQgcG9zID0gdGhpcy5fZ2FtZVJvb3QuY29udmVydFRvTm9kZVNwYWNlQVIodGhpcy5faGl0UExpc3RbaV0pO1xyXG4gICAgICAgICAgICBiYWxsLnNldFBvc2l0aW9uKHBvcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGk7IGkgPCB0aGlzLl9oaXRCYWxsTGlzdC5sZW5ndGg7ICsraSkge1xyXG4gICAgICAgICAgICB0aGlzLl9oaXRCYWxsTGlzdFtpXS5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGxldCB0ID0gdGhpcy5fbWFwVmlldy5jb252ZXJ0VG9Xb3JsZFNwYWNlQVIodGhpcy5fbWFwVmlldy50ZXN0QmFsbC5wb3NpdGlvbik7XHJcbiAgICAgICAgLy8gbGV0IHR0ID0gY2MudjIodC54LCB0LnkpO1xyXG4gICAgICAgIC8vIGlmICh0aGlzLl9oaXRQTGlzdC5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgIC8vICAgICB0aGlzLmRyYXdMaW5lKHRoaXMuX2JhbGxXb3JsZFAsIHR0KTtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gZWxzZSB7XHJcbiAgICAgICAgLy8gdGhpcy5kcmF3TGluZSh0aGlzLl9oaXRQTGlzdFt0aGlzLl9oaXRQTGlzdC5sZW5ndGggLSAxXSwgdHQpO1xyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgLy8gdGhpcy5fbGFzdENvbGxpc2lvblYubm9ybWFsaXplU2VsZigpO1xyXG4gICAgICAgIC8vIHRoaXMuX2xhc3RDb2xsaXNpb25WLm11bHRpcGx5U2NhbGFyKDEwMCk7XHJcblxyXG4gICAgICAgIGxldCBsYXN0UG9pbnQgPSB0aGlzLl9oaXRQTGlzdFt0aGlzLl9oaXRQTGlzdC5sZW5ndGggLSAxXTtcclxuICAgICAgICBsZXQgdCA9IHRoaXMuX21hcFZpZXcuY29udmVydFRvV29ybGRTcGFjZUFSKHRoaXMuX21hcFZpZXcudGVzdEJhbGwucG9zaXRpb24pO1xyXG4gICAgICAgIGxldCB0dCA9IGNjLnYyKHQueCAtIGxhc3RQb2ludC54LCB0LnkgLSBsYXN0UG9pbnQueSk7IC8v5LuO57uI54K55oyH5ZCR5bCP55CD55qE5ZCR6YePXHJcbiAgICAgICAgdHQubm9ybWFsaXplU2VsZigpO1xyXG4gICAgICAgIHR0Lm11bHRpcGx5U2NhbGFyKCh0TWdyLmdldENvbmZpZyhUYWJsZU5hbWUuR0FNRV9QTEFZLCA5KSBhcyBHYW1lUGxheVRhYmxlKS5WYWx1ZSk7XHJcbiAgICAgICAgdHQueCA9IGxhc3RQb2ludC54ICsgdHQueDtcclxuICAgICAgICB0dC55ID0gbGFzdFBvaW50LnkgKyB0dC55O1xyXG5cclxuICAgICAgICB0aGlzLmRyYXdMaW5lKHRoaXMuX2hpdFBMaXN0W3RoaXMuX2hpdFBMaXN0Lmxlbmd0aCAtIDFdLCB0dCk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vIHByaXZhdGUgX2xhc3RDb2xsaXNpb25WOiBjYy5WZWMyID0gbmV3IGNjLlZlYzIoKTtcclxuXHJcbiAgICBvblRlc3RCYWxsQ29sbGlzaW9uKGNvbnRhY3Q6IGNjLlBoeXNpY3NDb250YWN0LCBzZWxmQ29sbGlkZXI6IGNjLkNvbGxpZGVyLCBvdGhlckNvbGxpZGVyOiBjYy5Db2xsaWRlcikge1xyXG5cclxuICAgICAgICAvLyBsZXQgbWFuaWZvbGQgPSBjb250YWN0LmdldFdvcmxkTWFuaWZvbGQoKTtcclxuICAgICAgICAvLyBpZiAobWFuaWZvbGQucG9pbnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAvLyAgICAgdGhpcy5faGl0UExpc3QucHVzaChjYy52MihtYW5pZm9sZC5wb2ludHNbMF0ueCwgbWFuaWZvbGQucG9pbnRzWzBdLnkpKTtcclxuICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgIHRoaXMuX2hpdFBMaXN0LnB1c2goc2VsZkNvbGxpZGVyLm5vZGUuY29udmVydFRvV29ybGRTcGFjZUFSKGNjLlZlYzIuWkVSTykpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZHJhd0xpbmUod29ybGRTdGFydDogY2MuVmVjMiwgd29ybGRFbmQ6IGNjLlZlYzIpIHtcclxuXHJcbiAgICAgICAgbGV0IGdvbGRlbkFpbTogYm9vbGVhbiA9IChTYXZlRGF0YU1hbmFnZXIuaW5zLnJ1bnRpbWVEYXRhLmdvbGRlbkFpbVRyeSB8fCBEYXRlLm5vdygpIDw9IFNhdmVEYXRhTWFuYWdlci5pbnMucnVudGltZURhdGEuZ29sZGVuQWltRW5kVGltZSk7XHJcblxyXG4gICAgICAgIGxldCBnID0gdGhpcy5fZ2FtZVJvb3QuZ2V0Q29tcG9uZW50KGNjLkdyYXBoaWNzKTtcclxuXHJcbiAgICAgICAgZy5maWxsQ29sb3IuZnJvbUhFWChnb2xkZW5BaW0gPyAnI0ZGRkYwMCcgOiAnI0ZGRkZGRicpO1xyXG5cclxuICAgICAgICBsZXQgZ1N0YXJ0ID0gdGhpcy5fZ2FtZVJvb3QuY29udmVydFRvTm9kZVNwYWNlQVIod29ybGRTdGFydCk7XHJcbiAgICAgICAgbGV0IGdFbmQgPSB0aGlzLl9nYW1lUm9vdC5jb252ZXJ0VG9Ob2RlU3BhY2VBUih3b3JsZEVuZCk7XHJcblxyXG4gICAgICAgIGxldCB2ZWMgPSBjYy52MigpO1xyXG4gICAgICAgIGNjLlZlYzIuc3VidHJhY3QodmVjLCBnRW5kLCBnU3RhcnQpO1xyXG4gICAgICAgIGxldCBsZW4gPSB2ZWMubWFnKCk7XHJcbiAgICAgICAgbGV0IHN0ZXAgPSAwO1xyXG4gICAgICAgIGxldCBsZXJwVmVjID0gY2MudjIoKTtcclxuICAgICAgICB3aGlsZSAodHJ1ZSkge1xyXG5cclxuICAgICAgICAgICAgbGV0IHJhdGlvID0gc3RlcCAvIGxlbjtcclxuICAgICAgICAgICAgbGV0IGVuZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAocmF0aW8gPiAxKSB7XHJcbiAgICAgICAgICAgICAgICByYXRpbyA9IDE7XHJcbiAgICAgICAgICAgICAgICBlbmQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGdFbmQubGVycChnU3RhcnQsIHJhdGlvLCBsZXJwVmVjKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGcubW92ZVRvKCk7XHJcbiAgICAgICAgICAgIGcuY2lyY2xlKGxlcnBWZWMueCwgbGVycFZlYy55LCAzKTtcclxuICAgICAgICAgICAgZy5maWxsKCk7XHJcblxyXG4gICAgICAgICAgICBzdGVwICs9IDIwO1xyXG5cclxuICAgICAgICAgICAgaWYgKGVuZCkge1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjaGFuZ2VQb2ludGVyKGRvdWJsZTogYm9vbGVhbik6IHZvaWQge1xyXG5cclxuICAgICAgICAvLyBsZXQgYmFsbE5vZGUgPSB0aGlzLl9wb2ludGVyTm9kZS5nZXRDaGlsZEJ5TmFtZSgnYmFsbCcpO1xyXG5cclxuICAgICAgICAvLyBiYWxsTm9kZS5hY3RpdmUgPSAhZG91YmxlO1xyXG4gICAgICAgIHRoaXMuX3NwbGl0ZXJOb2RlLmFjdGl2ZSA9IGRvdWJsZTtcclxuXHJcbiAgICAgICAgaWYgKGRvdWJsZSkge1xyXG4gICAgICAgICAgICBCYXR0bGVNYW5hZ2VyLmlucy5zaG9vdFRvdWNoRW5hYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuX3NwbGl0ZXJOb2RlLmdldENvbXBvbmVudChjYy5BbmltYXRpb24pLm9uY2UoJ2ZpbmlzaGVkJywgKCkgPT4geyBCYXR0bGVNYW5hZ2VyLmlucy5zaG9vdFRvdWNoRW5hYmxlID0gdHJ1ZSB9LCB0aGlzKTtcclxuICAgICAgICAgICAgdGhpcy5fc3BsaXRlck5vZGUuZ2V0Q29tcG9uZW50KGNjLkFuaW1hdGlvbikucGxheSgnYW5pX2d1bjAwMScpO1xyXG4gICAgICAgICAgICB0aGlzLl9zcGxpdGVyTm9kZS5zZXRQb3NpdGlvbihCYXR0bGVNYW5hZ2VyLmlucy5jdXJCYXR0bGUubWFyYmxlc0Jvcm5Qb3MpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gZXZlbnRcclxuXHJcbiAgICBwcml2YXRlIG9uVG91Y2hTdGFydChlOiBjYy5FdmVudC5FdmVudFRvdWNoKSB7XHJcblxyXG4gICAgICAgIGlmICghQmF0dGxlTWFuYWdlci5pbnMuc2hvb3RUb3VjaEVuYWJsZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm5vZGUuZ2V0Q2hpbGRCeU5hbWUoJ1VJQmF0dGxlJykuZ2V0Q29tcG9uZW50KFVJQmF0dGxlKS5zZXRDYW5jZWxOb2RlVmlzaWJsZSh0cnVlKTtcclxuXHJcbiAgICAgICAgdGhpcy5fZ2FtZVJvb3Qub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfTU9WRSwgdGhpcy5vblRvdWNoTW92ZSwgdGhpcyk7XHJcbiAgICAgICAgdGhpcy5fZ2FtZVJvb3Qub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCB0aGlzLm9uVG91Y2hFbmQsIHRoaXMpO1xyXG4gICAgICAgIHRoaXMuX2dhbWVSb290Lm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0NBTkNFTCwgdGhpcy5vblRvdWNoQ2FuY2VsLCB0aGlzKTtcclxuXHJcbiAgICAgICAgdGhpcy5fbWFwVmlldy50ZXN0QmFsbC5hY3RpdmUgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLm9uVG91Y2hNb3ZlKGUpO1xyXG5cclxuICAgICAgICBsZXQgY2hhcmdpbmdOb2RlID0gdGhpcy5fcG9pbnRlck5vZGUuZ2V0Q2hpbGRCeU5hbWUoJ2NoYXJnaW5nTm9kZScpO1xyXG4gICAgICAgIGNoYXJnaW5nTm9kZS5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgIGNoYXJnaW5nTm9kZS5nZXRDb21wb25lbnQoY2MuQW5pbWF0aW9uKS5wbGF5KCdmeF94dWxpXzAwMScpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25Ub3VjaE1vdmUoZTogY2MuRXZlbnQuRXZlbnRUb3VjaCkge1xyXG5cclxuICAgICAgICBsZXQgdG91Y2hQID0gZS5nZXRMb2NhdGlvbigpO1xyXG5cclxuICAgICAgICAvLyBjYy5WZWMyLnN1YnRyYWN0KHRoaXMuX3BvaW50ZXJWZWMsIHRvdWNoUCwgdGhpcy5fYmFsbFdvcmxkUCk7XHJcblxyXG4gICAgICAgIGxldCBkZWcgPSBzbGliLk1hdGhVdGlsLmdldDM2MERlZ0J5VmVjKHRvdWNoUC54IC0gdGhpcy5fYmFsbFdvcmxkUC54LCB0b3VjaFAueSAtIHRoaXMuX2JhbGxXb3JsZFAueSk7XHJcblxyXG4gICAgICAgIGlmIChkZWcgPCB0aGlzLl9taW5TaG9vdERlZyB8fCBkZWcgPiAxODAgLSB0aGlzLl9taW5TaG9vdERlZykge1xyXG4gICAgICAgICAgICB0aGlzLm5vZGUuZ2V0Q2hpbGRCeU5hbWUoJ1VJQmF0dGxlJykuZ2V0Q29tcG9uZW50KFVJQmF0dGxlKS5zZXRDYW5jZWxOb2RlSGl0KHRydWUpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm5vZGUuZ2V0Q2hpbGRCeU5hbWUoJ1VJQmF0dGxlJykuZ2V0Q29tcG9uZW50KFVJQmF0dGxlKS5zZXRDYW5jZWxOb2RlSGl0KGZhbHNlKTtcclxuXHJcbiAgICAgICAgY2MuVmVjMi5zdWJ0cmFjdCh0aGlzLl9wb2ludGVyVmVjLCB0b3VjaFAsIHRoaXMuX2JhbGxXb3JsZFApO1xyXG5cclxuICAgICAgICB0aGlzLl9nYW1lUm9vdC5nZXRDb21wb25lbnQoY2MuR3JhcGhpY3MpLmNsZWFyKCk7XHJcbiAgICAgICAgdGhpcy50ZXN0UmF5TGluZU5ldyh0aGlzLl9wb2ludGVyVmVjKTtcclxuXHJcbiAgICAgICAgLy/ml4vovazmjIfpkohcclxuICAgICAgICBpZiAoQmF0dGxlTWFuYWdlci5pbnMuY3VyQmF0dGxlLmRvdWJsZVNob290KSB7XHJcbiAgICAgICAgICAgIGxldCBkZWcgPSBzbGliLk1hdGhVdGlsLmdldDM2MERlZ0J5VmVjKHRoaXMuX3BvaW50ZXJWZWMueCwgdGhpcy5fcG9pbnRlclZlYy55KTtcclxuICAgICAgICAgICAgbGV0IG5vZGVBID0gdGhpcy5fc3BsaXRlck5vZGUuZ2V0Q2hpbGRCeU5hbWUoJ2FuaV9ndW5hJyk7XHJcbiAgICAgICAgICAgIGxldCBub2RlQiA9IHRoaXMuX3NwbGl0ZXJOb2RlLmdldENoaWxkQnlOYW1lKCdhbmlfZ3VuYicpO1xyXG5cclxuICAgICAgICAgICAgbm9kZUEuYW5nbGUgPSBkZWcgLSA5MDsgLy/mjIflkJHmraPkuIrmlrlcclxuICAgICAgICAgICAgbm9kZUIuYW5nbGUgPSAoOTAgLSBkZWcpO1xyXG5cclxuICAgICAgICAgICAgbGV0IG90aGVyUG9pbnRlciA9IGNjLnYyKC10aGlzLl9wb2ludGVyVmVjLngsIHRoaXMuX3BvaW50ZXJWZWMueSk7XHJcbiAgICAgICAgICAgIHRoaXMudGVzdFJheUxpbmVOZXcob3RoZXJQb2ludGVyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvblRvdWNoQ2FuY2VsKCkge1xyXG4gICAgICAgIGxldCBwb2ludGVyID0gdGhpcy5fbWFwVmlldy5nZXRDaGlsZEJ5TmFtZSgnaW1nUG9pbnRlcicpO1xyXG4gICAgICAgIHBvaW50ZXIuYW5nbGUgPSAwO1xyXG5cclxuICAgICAgICAvLyBsZXQgZyA9IHRoaXMuX2dhbWVSb290LmdldENvbXBvbmVudChjYy5HcmFwaGljcyk7XHJcbiAgICAgICAgLy8gZy5jbGVhcigpO1xyXG5cclxuICAgICAgICB0aGlzLl9nYW1lUm9vdC5vZmYoY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfTU9WRSwgdGhpcy5vblRvdWNoTW92ZSwgdGhpcyk7XHJcbiAgICAgICAgdGhpcy5fZ2FtZVJvb3Qub2ZmKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgdGhpcy5vblRvdWNoRW5kLCB0aGlzKTtcclxuICAgICAgICB0aGlzLl9nYW1lUm9vdC5vZmYoY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfQ0FOQ0VMLCB0aGlzLm9uVG91Y2hDYW5jZWwsIHRoaXMpO1xyXG5cclxuICAgICAgICB0aGlzLm5vZGUuZ2V0Q2hpbGRCeU5hbWUoJ1VJQmF0dGxlJykuZ2V0Q29tcG9uZW50KFVJQmF0dGxlKS5zZXRDYW5jZWxOb2RlVmlzaWJsZShmYWxzZSk7XHJcblxyXG4gICAgICAgIGxldCBjaGFyZ2luZ05vZGUgPSB0aGlzLl9wb2ludGVyTm9kZS5nZXRDaGlsZEJ5TmFtZSgnY2hhcmdpbmdOb2RlJyk7XHJcbiAgICAgICAgY2hhcmdpbmdOb2RlLmdldENvbXBvbmVudChjYy5BbmltYXRpb24pLnN0b3AoJ2Z4X3h1bGlfMDAxJyk7XHJcbiAgICAgICAgY2hhcmdpbmdOb2RlLmFjdGl2ZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICB0aGlzLl9tYXBWaWV3LnRlc3RCYWxsLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2dhbWVSb290LmdldENvbXBvbmVudChjYy5HcmFwaGljcykuY2xlYXIoKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9oaXRCYWxsTGlzdC5sZW5ndGg7ICsraSkge1xyXG4gICAgICAgICAgICB0aGlzLl9oaXRCYWxsTGlzdFtpXS5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvblRvdWNoRW5kKCkge1xyXG5cclxuICAgICAgICB0aGlzLm9uVG91Y2hDYW5jZWwoKTtcclxuICAgICAgICBCYXR0bGVNYW5hZ2VyLmlucy5jdXJCYXR0bGUuc2hvb3QodGhpcy5fcG9pbnRlclZlYyk7XHJcblxyXG4gICAgICAgIHRoaXMuX2dhbWVSb290LmdldENoaWxkQnlOYW1lKCd0aXBzMScpLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2dhbWVSb290LmdldENoaWxkQnlOYW1lKCdndWlkZUFpbScpLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25Ta2lsbFN0YXJ0KHNraWxsSWQ6IFVzZXJTa2lsbCkge1xyXG4gICAgICAgIGlmIChza2lsbElkID09IFVzZXJTa2lsbC5ET1VCTEVfU0hPT1QpIHtcclxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VQb2ludGVyKHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChza2lsbElkID09IFVzZXJTa2lsbC5TSElFTEQpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRTaGllbGRFbmFibGUodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25Ta2lsbEVuZChza2lsbElkOiBVc2VyU2tpbGwpIHtcclxuICAgICAgICBpZiAoc2tpbGxJZCA9PSBVc2VyU2tpbGwuU0hJRUxEKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U2hpZWxkRW5hYmxlKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkJvcm5Qb3NDaGFuZ2UoKSB7XHJcbiAgICAgICAgdGhpcy5fcG9pbnRlck5vZGUuZ2V0Q2hpbGRCeU5hbWUoJ2JhbGwnKS5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX3BvaW50ZXJOb2RlLnNldFBvc2l0aW9uKEJhdHRsZU1hbmFnZXIuaW5zLmN1ckJhdHRsZS5tYXJibGVzQm9yblBvc05leHRSb3VuZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvblJvdW5kRW5kKCkge1xyXG5cclxuICAgICAgICB0aGlzLl9iYWxsV29ybGRQID0gdGhpcy5fbWFwVmlldy5jb252ZXJ0VG9Xb3JsZFNwYWNlQVIoQmF0dGxlTWFuYWdlci5pbnMuY3VyQmF0dGxlLm1hcmJsZXNCb3JuUG9zKTtcclxuICAgICAgICB0aGlzLl9wb2ludGVyTm9kZS5zZXRQb3NpdGlvbihCYXR0bGVNYW5hZ2VyLmlucy5jdXJCYXR0bGUubWFyYmxlc0Jvcm5Qb3MpO1xyXG4gICAgICAgIHRoaXMuY2hhbmdlUG9pbnRlcihmYWxzZSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0U2hpZWxkRW5hYmxlKHZhbHVlOiBib29sZWFuKSB7XHJcblxyXG4gICAgICAgIGxldCBlZmZlY3ROb2RlID0gY2MuZmluZCgnR2FtZVJvb3QvYm9yZGVyQ29sbGVjdG9yL2VmZmVjdCcsIHRoaXMubm9kZSk7XHJcbiAgICAgICAgZWZmZWN0Tm9kZS5hY3RpdmUgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIGxldCBkdXJhdGlvbiA9IGVmZmVjdE5vZGUuZ2V0Q29tcG9uZW50KGNjLkFuaW1hdGlvbikucGxheSgnZnhfZ2xfY2h6ZF8wMDEnKS5kdXJhdGlvbjtcclxuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBlZmZlY3ROb2RlLmdldENvbXBvbmVudChjYy5BbmltYXRpb24pLnBsYXkoJ2Z4X2dsX2NoemRfMDAyJylcclxuICAgICAgICAgICAgfSwgZHVyYXRpb24sIDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gdGhpcy51bnNjaGVkdWxlQWxsQ2FsbGJhY2tzKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBvblNoYWtlKHZhbHVlOiBib29sZWFuKSB7XHJcblxyXG4gICAgICAgIGxldCBhbmkgPSB0aGlzLm5vZGUuZ2V0Q2hpbGRCeU5hbWUoJ01haW4gQ2FtZXJhJykuZ2V0Q29tcG9uZW50KGNjLkFuaW1hdGlvbik7XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICBhbmkuc3RvcCgnYW5pX3NoYWtlJyk7XHJcbiAgICAgICAgICAgIGFuaS5wbGF5KCdhbmlfc2hha2UnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubm9kZS5nZXRDaGlsZEJ5TmFtZSgnTWFpbiBDYW1lcmEnKS5zZXRQb3NpdGlvbigwLCAwLCAwKTtcclxuICAgICAgICAgICAgLy8gbGV0IHN0YXRlID0gYW5pLmdldEFuaW1hdGlvblN0YXRlKCdhbmlfc2hha2UnKTtcclxuICAgICAgICAgICAgLy8gc3RhdGUudGltZSA9IDA7XHJcbiAgICAgICAgICAgIC8vIHN0YXRlLnN0b3AoKTtcclxuICAgICAgICAgICAgYW5pLnN0b3AoJ2FuaV9zaGFrZScpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gYW5pLnBsYXkoJ2FuaV9zaGFrZScpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxufVxyXG4iXX0=