(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Script/Game.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, '1c26dVSok5E7o2PwD2sGBJa', 'Game'); // Script/Game.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 (b.hasOwnProperty(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 DrawingBoard_1 = require("./DrawingBoard"); var _a = cc._decorator, ccclass = _a.ccclass, property = _a.property; var GameState; (function (GameState) { GameState[GameState["drawing"] = 1] = "drawing"; GameState[GameState["erasing"] = 2] = "erasing"; })(GameState || (GameState = {})); var Game = /** @class */ (function (_super) { __extends(Game, _super); function Game() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.drawNode = null; _this.captureCamera = null; _this.mainCamera = null; _this.db = null; _this.gameState = GameState.drawing; _this.texture = null; _this.prePos = cc.Vec2.ZERO; _this.startPos = cc.Vec2.ZERO; _this.lastColor = cc.Color.BLUE; _this.errColor = cc.Color.RED; _this.lastLineWidth = 1; _this.history = []; _this.touchId = -1; _this.touchScale = false; return _this; } Game.prototype.start = function () { var _this = this; this.initDb(); this.initTexture(); this.initRead(); setTimeout(function () { _this.drawNode.on("touchstart", _this.onTouchStart, _this); _this.drawNode.on("touchmove", _this.onTouchMove, _this); _this.drawNode.on("touchend", _this.onTouchEnd, _this); _this.drawNode.on("touchcancel", _this.onTouchEnd, _this); }, 2000); }; Game.prototype.initDb = function () { //创建一个画板(需传入画板尺寸,将自动初始化) this.db = new DrawingBoard_1.default(this.drawNode.width, this.drawNode.height); //设置画板的绘图颜色(每次绘制前都可以重新设置) this.lastLineWidth = 15; this.db.setLineWidth(this.lastLineWidth); // this.db.setColor(this.lastColor.r, this.lastColor.g, this.lastColor.b, this.lastColor.a); //线条端点以圆角结尾 this.db.setLineCircleEnd(true); }; Game.prototype.initTexture = function () { this.texture = new cc.RenderTexture(); this.texture.initWithSize(this.drawNode.width, this.drawNode.height, cc.RenderTexture.DepthStencilFormat.RB_FMT_S8); var spf = new cc.SpriteFrame(this.texture); this.drawNode.getComponent(cc.Sprite).spriteFrame = spf; }; Game.prototype.initRead = function () { this.targetCamera = this.node.getChildByName("tagCamera").getComponent(cc.Camera); var rander = new cc.RenderTexture(); rander.initWithSize(this.node.width, this.node.height, cc.RenderTexture.DepthStencilFormat.RB_FMT_S8); this.targetCamera.targetTexture = rander; this.targetCamera.render(); console.log("完成"); }; Game.prototype.onTouchStart = function (e) { //将触摸位置作为线条的起点 //画板中使用的坐标系,与图片坐标系一样,原点在左上角,X轴向右为正,Y轴向下为正 //所以Y轴坐标应反过来, 这里用getLocationInView而不是getLocation this.touchId = e.getID(); if (this.touchId == 1) { this.touchScale = true; return; } var pos = e.getLocation(); this.prePos = this.convertToDrawNodePos(pos); this.startPos = this.convertToDrawNodePos(pos); this.db.moveTo(this.prePos.x, this.prePos.y); }; Game.prototype.onTouchMove = function (e) { var touches = e.getTouches(); var touch1 = touches[0]; var delta1 = touch1.getDelta(); var pos = e.getLocation(); var pos1 = this.convertToDrawNodePos(touch1.getLocation()); var dst = this.startPos.sub(pos1).mag(); // this.label.string = touches.length + ""; if (touches.length == 1 && this.touchId < 1 && !this.touchScale && dst > 7) { // alert("不该进来"); this.prePos = this.convertToDrawNodePos(pos); var jg = this.pd(e); this.changeColor(jg); if (this.gameState == GameState.drawing) { //从上一次绘制线条后的终点开始向鼠标当前位置绘制线条 this.db.lineTo(this.prePos.x, this.prePos.y); } else if (this.gameState == GameState.erasing) { // 橡皮擦 this.db.circle(this.prePos.x, this.prePos.y, 10); } //每次画板中的数据有变化后,及时将数据应用到贴图上,在屏幕上显示出来 this.drawToImg(); } else if (touches.length == 2) { var touch1 = touches[0], touch2 = touches[1]; var delta1 = touch1.getDelta(), delta2 = touch2.getDelta(); var touchPoint1 = this.node.parent.convertToNodeSpaceAR(touch1.getLocation()); var touchPoint2 = this.node.parent.convertToNodeSpaceAR(touch2.getLocation()); var distance = touchPoint1.sub(touchPoint2); var delta = delta1.sub(delta2); var scale = 1; if (Math.abs(distance.x) > Math.abs(distance.y)) { scale = (distance.x + delta.x) / distance.x * this.node.scale; } else { scale = (distance.y + delta.y) / distance.y * this.node.scale; } if (scale > 2) scale = 2; this.node.scale = scale <= 0.1 ? 0.1 : scale; } }; Game.prototype.onTouchEnd = function (e) { this.touchId = e.getID(); if (this.touchId == 1) this.touchScale = false; this.addHistory(); }; Game.prototype.pd = function (event) { var cha = 2; var pos = event.getLocation(); var jg = false; for (var i = -cha; i < cha; i++) { var postion = cc.v2(); postion.x = pos.x + i; for (var j = -cha; j < cha; j++) { postion.y = pos.y + j; // console.log("检测点:",postion.x,postion.y); var img = this.getGraphisData(postion); if ((img[0] != 255 && img[1] != 255 && img[2] != 255)) { jg = true; j = 10000; i = 10000; } } } // return jg; }; Game.prototype.convertToDrawNodePos = function (worldPos) { var pos = this.drawNode.convertToNodeSpaceAR(worldPos); pos.x += this.drawNode.width * this.drawNode.anchorX; pos.y += this.drawNode.height * this.drawNode.anchorY; pos.y = this.drawNode.height - pos.y; return pos; }; Game.prototype.addHistory = function () { var copy = this.db.copyData(); var ucopy = new Uint8Array(copy); this.history.push({ data: ucopy }); // cc.log('历史步骤: ', this.history.length); }; Game.prototype.drawToImg = function () { //获取画板中绘制的图案数据 var data = this.db.getData(); //将数据传递给贴图对象 this.texture.initWithData(data, cc.Texture2D.PixelFormat.RGBA8888, this.db.width, this.db.height); }; Game.prototype.changeColor = function (red) { if (!red) this.db.setColor(this.errColor.r, this.errColor.g, this.errColor.b, this.errColor.a); else this.db.setColor(this.lastColor.r, this.lastColor.g, this.lastColor.b, this.lastColor.a); }; Game.prototype.getGraphisData = function (point) { var Uint8 = new Uint8Array(4); Uint8 = this.targetCamera.targetTexture.readPixels(Uint8, point.x, point.y, 1, 1); return Uint8; }; Game.prototype.onBtnDraw = function () { this.db.setLineWidth(this.lastLineWidth); this.db.setColor(this.lastColor.r, this.lastColor.g, this.lastColor.b, this.lastColor.a); this.gameState = GameState.drawing; }; Game.prototype.onBtnErase = function () { this.db.setLineWidth(this.lastLineWidth * 3); // 橡皮擦的颜色不能是(0,0,0,0),因为这样会和DrawingBoard里的默认颜色相同导致绘制跳过 this.db.setColor(255, 255, 255, 0); this.gameState = GameState.erasing; }; Game.prototype.onBtnClear = function () { this.db.reset(); this.drawToImg(); this.history.splice(0, this.history.length); }; Game.prototype.onBtnRevoke = function () { this.history.pop(); if (this.history.length) { var data = this.history[this.history.length - 1].data; this.db.setData(data.buffer); this.texture.initWithData(this.db.getData(), cc.Texture2D.PixelFormat.RGBA8888, this.db.width, this.db.height); } else { this.onBtnClear(); } cc.log('历史记录剩余: ', this.history.length); }; Game.prototype.onBtnSave = function () { var _this = this; if (cc.sys.isBrowser) { var width = this.drawNode.width; var height = this.drawNode.height; this.captureCamera.enabled = true; var texture = new cc.RenderTexture(); texture.initWithSize(width, height, cc.RenderTexture.DepthStencilFormat.RB_FMT_S8); this.captureCamera.targetTexture = texture; var canvas = document.createElement('canvas'); canvas.width = width; canvas.height = height; var ctx = canvas.getContext('2d'); this.captureCamera.render(); var data = texture.readPixels(); // write the render data var rowBytes = width * 4; for (var row = 0; row < height; row++) { var srow = height - 1 - row; var imageData = ctx.createImageData(width, 1); var start = srow * width * 4; for (var i = 0; i < rowBytes; i++) { imageData.data[i] = data[start + i]; } ctx.putImageData(imageData, 0, row); } // var dataUrl = canvas.toDataURL('image/png'); // cc.log('iamge-base64:', dataUrl); var saveLink = document.createElementNS('http://www.w3.org/1999/xhtml', 'a'); saveLink.href = dataUrl; saveLink.download = String(Date.now()) + '.png'; var event = document.createEvent('MouseEvents'); event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); saveLink.dispatchEvent(event); this.scheduleOnce(function (t) { _this.captureCamera.enabled = false; }, 0.1); } else { cc.warn('暂时只支持web端保存图片'); } }; Game.prototype.update = function (dt) { }; __decorate([ property(cc.Node) ], Game.prototype, "drawNode", void 0); __decorate([ property(cc.Camera) ], Game.prototype, "captureCamera", void 0); __decorate([ property(cc.Camera) ], Game.prototype, "mainCamera", void 0); Game = __decorate([ ccclass ], Game); return Game; }(cc.Component)); exports.default = Game; 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,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USxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUM7MENBQ087SUFHekI7UUFEQyxRQUFRLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQzsrQ0FDWTtJQUdoQztRQURDLFFBQVEsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDOzRDQUNTO0lBUlosSUFBSTtRQUR4QixPQUFPO09BQ2EsSUFBSSxDQThReEI7SUFBRCxXQUFDO0NBOVFELEFBOFFDLENBOVFpQyxFQUFFLENBQUMsU0FBUyxHQThRN0M7a0JBOVFvQixJQUFJIiwiZmlsZSI6IiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLy8gTGVhcm4gVHlwZVNjcmlwdDpcbi8vICAtIGh0dHBzOi8vZG9jcy5jb2Nvcy5jb20vY3JlYXRvci9tYW51YWwvZW4vc2NyaXB0aW5nL3R5cGVzY3JpcHQuaHRtbFxuLy8gTGVhcm4gQXR0cmlidXRlOlxuLy8gIC0gaHR0cHM6Ly9kb2NzLmNvY29zLmNvbS9jcmVhdG9yL21hbnVhbC9lbi9zY3JpcHRpbmcvcmVmZXJlbmNlL2F0dHJpYnV0ZXMuaHRtbFxuLy8gTGVhcm4gbGlmZS1jeWNsZSBjYWxsYmFja3M6XG4vLyAgLSBodHRwczovL2RvY3MuY29jb3MuY29tL2NyZWF0b3IvbWFudWFsL2VuL3NjcmlwdGluZy9saWZlLWN5Y2xlLWNhbGxiYWNrcy5odG1sXG5cbmltcG9ydCBEcmF3aW5nQm9hcmQgZnJvbSBcIi4vRHJhd2luZ0JvYXJkXCI7XG5cbmNvbnN0IHsgY2NjbGFzcywgcHJvcGVydHkgfSA9IGNjLl9kZWNvcmF0b3I7XG5cbmVudW0gR2FtZVN0YXRlIHtcbiAgICBkcmF3aW5nID0gMSxcbiAgICBlcmFzaW5nID0gMixcbn1cblxuQGNjY2xhc3NcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdhbWUgZXh0ZW5kcyBjYy5Db21wb25lbnQge1xuICAgIEBwcm9wZXJ0eShjYy5Ob2RlKVxuICAgIGRyYXdOb2RlOiBjYy5Ob2RlID0gbnVsbDtcblxuICAgIEBwcm9wZXJ0eShjYy5DYW1lcmEpXG4gICAgY2FwdHVyZUNhbWVyYTogY2MuQ2FtZXJhID0gbnVsbDtcblxuICAgIEBwcm9wZXJ0eShjYy5DYW1lcmEpXG4gICAgbWFpbkNhbWVyYTogY2MuQ2FtZXJhID0gbnVsbDtcblxuICAgIHByaXZhdGUgdGFyZ2V0Q2FtZXJhOiBjYy5DYW1lcmE7XG4gICAgcHJpdmF0ZSBkYjogRHJhd2luZ0JvYXJkID0gbnVsbDtcbiAgICBwcml2YXRlIGdhbWVTdGF0ZTogR2FtZVN0YXRlID0gR2FtZVN0YXRlLmRyYXdpbmc7XG4gICAgcHJpdmF0ZSB0ZXh0dXJlOiBjYy5SZW5kZXJUZXh0dXJlID0gbnVsbDtcbiAgICBwcml2YXRlIHByZVBvczogY2MuVmVjMiA9IGNjLlZlYzIuWkVSTztcbiAgICBwcml2YXRlIHN0YXJ0UG9zOiBjYy5WZWMyID0gY2MuVmVjMi5aRVJPO1xuICAgIHByaXZhdGUgbGFzdENvbG9yOiBjYy5Db2xvciA9IGNjLkNvbG9yLkJMVUU7XG4gICAgcHJpdmF0ZSBlcnJDb2xvcjogY2MuQ29sb3IgPSBjYy5Db2xvci5SRUQ7XG4gICAgcHJpdmF0ZSBsYXN0TGluZVdpZHRoOiBudW1iZXIgPSAxO1xuICAgIHByaXZhdGUgaGlzdG9yeTogYW55W10gPSBbXTtcbiAgICBwcml2YXRlIHRvdWNoSWQgPSAtMTtcbiAgICBwcml2YXRlIHRvdWNoU2NhbGUgPSBmYWxzZTtcbiAgXG5cbiAgICBzdGFydCgpIHtcbiAgICAgICAgdGhpcy5pbml0RGIoKTtcbiAgICAgICAgdGhpcy5pbml0VGV4dHVyZSgpO1xuICAgICAgICB0aGlzLmluaXRSZWFkKCk7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRyYXdOb2RlLm9uKFwidG91Y2hzdGFydFwiLCB0aGlzLm9uVG91Y2hTdGFydCwgdGhpcyk7XG4gICAgICAgICAgICB0aGlzLmRyYXdOb2RlLm9uKFwidG91Y2htb3ZlXCIsIHRoaXMub25Ub3VjaE1vdmUsIHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5kcmF3Tm9kZS5vbihcInRvdWNoZW5kXCIsIHRoaXMub25Ub3VjaEVuZCwgdGhpcyk7XG4gICAgICAgICAgICB0aGlzLmRyYXdOb2RlLm9uKFwidG91Y2hjYW5jZWxcIiwgdGhpcy5vblRvdWNoRW5kLCB0aGlzKTtcbiAgICAgICAgfSwgMjAwMCk7XG4gICAgfVxuXG4gICAgaW5pdERiKCkge1xuICAgICAgICAvL+WIm+W7uuS4gOS4queUu+advyjpnIDkvKDlhaXnlLvmnb/lsLrlr7jvvIzlsIboh6rliqjliJ3lp4vljJYpXG4gICAgICAgIHRoaXMuZGIgPSBuZXcgRHJhd2luZ0JvYXJkKHRoaXMuZHJhd05vZGUud2lkdGgsIHRoaXMuZHJhd05vZGUuaGVpZ2h0KTtcbiAgICAgICAgLy/orr7nva7nlLvmnb/nmoTnu5jlm77popzoibLvvIjmr4/mrKHnu5jliLbliY3pg73lj6/ku6Xph43mlrDorr7nva7vvIlcbiAgICAgICAgdGhpcy5sYXN0TGluZVdpZHRoID0gMTU7XG4gICAgICAgIHRoaXMuZGIuc2V0TGluZVdpZHRoKHRoaXMubGFzdExpbmVXaWR0aCk7XG4gICAgICAgIC8vIHRoaXMuZGIuc2V0Q29sb3IodGhpcy5sYXN0Q29sb3IuciwgdGhpcy5sYXN0Q29sb3IuZywgdGhpcy5sYXN0Q29sb3IuYiwgdGhpcy5sYXN0Q29sb3IuYSk7XG4gICAgICAgIC8v57q/5p2h56uv54K55Lul5ZyG6KeS57uT5bC+XG4gICAgICAgIHRoaXMuZGIuc2V0TGluZUNpcmNsZUVuZCh0cnVlKTtcbiAgICB9XG5cbiAgICBpbml0VGV4dHVyZSgpIHtcbiAgICAgICAgdGhpcy50ZXh0dXJlID0gbmV3IGNjLlJlbmRlclRleHR1cmUoKTtcbiAgICAgICAgdGhpcy50ZXh0dXJlLmluaXRXaXRoU2l6ZSh0aGlzLmRyYXdOb2RlLndpZHRoLCB0aGlzLmRyYXdOb2RlLmhlaWdodCwgY2MuUmVuZGVyVGV4dHVyZS5EZXB0aFN0ZW5jaWxGb3JtYXQuUkJfRk1UX1M4KTtcbiAgICAgICAgbGV0IHNwZjogY2MuU3ByaXRlRnJhbWUgPSBuZXcgY2MuU3ByaXRlRnJhbWUodGhpcy50ZXh0dXJlKTtcbiAgICAgICAgdGhpcy5kcmF3Tm9kZS5nZXRDb21wb25lbnQoY2MuU3ByaXRlKS5zcHJpdGVGcmFtZSA9IHNwZjtcbiAgICB9XG5cbiAgICBpbml0UmVhZCgpe1xuICAgICAgICB0aGlzLnRhcmdldENhbWVyYSA9IHRoaXMubm9kZS5nZXRDaGlsZEJ5TmFtZShcInRhZ0NhbWVyYVwiKS5nZXRDb21wb25lbnQoY2MuQ2FtZXJhKTtcbiAgICAgICAgdmFyIHJhbmRlciA9IG5ldyBjYy5SZW5kZXJUZXh0dXJlKCk7XG4gICAgICAgIHJhbmRlci5pbml0V2l0aFNpemUodGhpcy5ub2RlLndpZHRoLCB0aGlzLm5vZGUuaGVpZ2h0LCBjYy5SZW5kZXJUZXh0dXJlLkRlcHRoU3RlbmNpbEZvcm1hdC5SQl9GTVRfUzgpO1xuICAgICAgICB0aGlzLnRhcmdldENhbWVyYS50YXJnZXRUZXh0dXJlID0gcmFuZGVyO1xuICAgICAgICB0aGlzLnRhcmdldENhbWVyYS5yZW5kZXIoKTtcbiAgICAgICAgY29uc29sZS5sb2coXCLlrozmiJBcIik7XG4gICAgfVxuXG4gICAgb25Ub3VjaFN0YXJ0KGU6IGNjLkV2ZW50LkV2ZW50VG91Y2gpIHtcbiAgICAgICAgLy/lsIbop6bmkbjkvY3nva7kvZzkuLrnur/mnaHnmoTotbfngrlcbiAgICAgICAgLy/nlLvmnb/kuK3kvb/nlKjnmoTlnZDmoIfns7vvvIzkuI7lm77niYflnZDmoIfns7vkuIDmoLfvvIzljp/ngrnlnKjlt6bkuIrop5LvvIxY6L205ZCR5Y+z5Li65q2j77yMWei9tOWQkeS4i+S4uuato1xuICAgICAgICAvL+aJgOS7pVnovbTlnZDmoIflupTlj43ov4fmnaUsIOi/memHjOeUqGdldExvY2F0aW9uSW5WaWV36ICM5LiN5pivZ2V0TG9jYXRpb25cbiAgIFxuICAgICAgICB0aGlzLnRvdWNoSWQgPSBlLmdldElEKCk7XG4gICAgICAgIGlmKHRoaXMudG91Y2hJZCA9PSAxKXtcbiAgICAgICAgICAgIHRoaXMudG91Y2hTY2FsZSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gXG5cbiAgICAgICAgbGV0IHBvcyA9IGUuZ2V0TG9jYXRpb24oKTtcbiAgICAgICAgdGhpcy5wcmVQb3MgPSB0aGlzLmNvbnZlcnRUb0RyYXdOb2RlUG9zKHBvcyk7XG4gICAgICAgIHRoaXMuc3RhcnRQb3MgPSB0aGlzLmNvbnZlcnRUb0RyYXdOb2RlUG9zKHBvcyk7XG4gICAgICAgIHRoaXMuZGIubW92ZVRvKHRoaXMucHJlUG9zLngsIHRoaXMucHJlUG9zLnkpO1xuICAgICAgICBcbiAgICB9XG5cbiAgICBvblRvdWNoTW92ZShlOiBjYy5FdmVudC5FdmVudFRvdWNoKSB7XG4gICAgICAgIGxldCB0b3VjaGVzID0gZS5nZXRUb3VjaGVzKCk7XG4gICAgICAgIHZhciB0b3VjaDEgPSB0b3VjaGVzWzBdXG4gICAgICAgIHZhciBkZWx0YTEgPSB0b3VjaDEuZ2V0RGVsdGEoKTtcbiAgICAgICAgbGV0IHBvcyA9IGUuZ2V0TG9jYXRpb24oKTtcbiBcbiAgICAgICAgbGV0IHBvczEgPSB0aGlzLmNvbnZlcnRUb0RyYXdOb2RlUG9zKHRvdWNoMS5nZXRMb2NhdGlvbigpKTtcbiAgICAgICAgbGV0IGRzdCA9IHRoaXMuc3RhcnRQb3Muc3ViKHBvczEpLm1hZygpXG4gICAgICAgIC8vIHRoaXMubGFiZWwuc3RyaW5nID0gdG91Y2hlcy5sZW5ndGggKyBcIlwiO1xuICAgICAgICBpZih0b3VjaGVzLmxlbmd0aCA9PSAxICYmIHRoaXMudG91Y2hJZCA8IDEgJiYgIXRoaXMudG91Y2hTY2FsZSAmJiBkc3QgPiA3KXtcbiAgICAgICAgICAgIC8vIGFsZXJ0KFwi5LiN6K+l6L+b5p2lXCIpO1xuICAgICAgICAgICAgdGhpcy5wcmVQb3MgPSB0aGlzLmNvbnZlcnRUb0RyYXdOb2RlUG9zKHBvcyk7XG4gICAgICAgICAgICB2YXIgamcgPSB0aGlzLnBkKGUpO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VDb2xvcihqZylcbiAgICAgICAgICAgIGlmICh0aGlzLmdhbWVTdGF0ZSA9PSBHYW1lU3RhdGUuZHJhd2luZykge1xuICAgICAgICAgICAgICAgIC8v5LuO5LiK5LiA5qyh57uY5Yi257q/5p2h5ZCO55qE57uI54K55byA5aeL5ZCR6byg5qCH5b2T5YmN5L2N572u57uY5Yi257q/5p2hXG4gICAgICAgICAgICAgICAgdGhpcy5kYi5saW5lVG8odGhpcy5wcmVQb3MueCwgdGhpcy5wcmVQb3MueSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZ2FtZVN0YXRlID09IEdhbWVTdGF0ZS5lcmFzaW5nKSB7XG4gICAgICAgICAgICAgICAgLy8g5qmh55qu5pOmXG4gICAgICAgICAgICAgICAgdGhpcy5kYi5jaXJjbGUodGhpcy5wcmVQb3MueCwgdGhpcy5wcmVQb3MueSwgMTApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy/mr4/mrKHnlLvmnb/kuK3nmoTmlbDmja7mnInlj5jljJblkI7vvIzlj4rml7blsIbmlbDmja7lupTnlKjliLDotLTlm77kuIrvvIzlnKjlsY/luZXkuIrmmL7npLrlh7rmnaVcbiAgICAgICAgICAgIHRoaXMuZHJhd1RvSW1nKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZih0b3VjaGVzLmxlbmd0aCA9PSAyKXtcbiAgICAgICAgICAgIHZhciB0b3VjaDEgPSB0b3VjaGVzWzBdLCB0b3VjaDIgPSB0b3VjaGVzWzFdO1xuICAgICAgICAgICAgdmFyIGRlbHRhMSA9IHRvdWNoMS5nZXREZWx0YSgpLCBkZWx0YTIgPSB0b3VjaDIuZ2V0RGVsdGEoKTtcbiAgICAgICAgICAgIHZhciB0b3VjaFBvaW50MSA9IHRoaXMubm9kZS5wYXJlbnQuY29udmVydFRvTm9kZVNwYWNlQVIodG91Y2gxLmdldExvY2F0aW9uKCkpO1xuICAgICAgICAgICAgdmFyIHRvdWNoUG9pbnQyID0gdGhpcy5ub2RlLnBhcmVudC5jb252ZXJ0VG9Ob2RlU3BhY2VBUih0b3VjaDIuZ2V0TG9jYXRpb24oKSk7XG5cbiAgICAgICAgICAgIHZhciBkaXN0YW5jZSA9IHRvdWNoUG9pbnQxLnN1Yih0b3VjaFBvaW50Mik7XG4gICAgICAgICAgICB2YXIgZGVsdGEgPSBkZWx0YTEuc3ViKGRlbHRhMik7XG4gICAgICAgICAgICB2YXIgc2NhbGUgPSAxO1xuXG4gICAgICAgICAgICBpZihNYXRoLmFicyhkaXN0YW5jZS54KSA+IE1hdGguYWJzKGRpc3RhbmNlLnkpKXtcbiAgICAgICAgICAgICAgICBzY2FsZSA9IChkaXN0YW5jZS54ICsgZGVsdGEueCkgLyBkaXN0YW5jZS54ICogdGhpcy5ub2RlLnNjYWxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICBzY2FsZSA9IChkaXN0YW5jZS55ICsgZGVsdGEueSkgLyBkaXN0YW5jZS55ICogdGhpcy5ub2RlLnNjYWxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoc2NhbGUgPiAyICkgc2NhbGUgPSAyO1xuICAgICAgICAgICAgdGhpcy5ub2RlLnNjYWxlID0gc2NhbGUgPD0gMC4xID8gMC4xOiBzY2FsZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uVG91Y2hFbmQoZTogY2MuRXZlbnQuRXZlbnRUb3VjaCkge1xuICAgICAgICB0aGlzLnRvdWNoSWQgPSBlLmdldElEKCk7XG4gICAgICAgIGlmKHRoaXMudG91Y2hJZCA9PSAxKSB0aGlzLnRvdWNoU2NhbGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hZGRIaXN0b3J5KCk7XG4gICAgfVxuXG4gICAgcGQoZXZlbnQpe1xuICAgICAgICBsZXQgY2hhID0gMjtcbiAgICAgICAgdmFyIHBvcyA9IGV2ZW50LmdldExvY2F0aW9uKCk7XG4gICAgICAgIHZhciBqZyA9IGZhbHNlO1xuICAgICAgICBmb3IobGV0IGk9LWNoYTsgaTxjaGE7aSsrKXtcbiAgICAgICAgICAgIGxldCBwb3N0aW9uID0gY2MudjIoKTtcbiAgICAgICAgICAgIHBvc3Rpb24ueCA9IHBvcy54ICsgaTtcbiAgICAgICAgICAgIGZvcihsZXQgaiA9LWNoYTsgajxjaGE7IGorKyl7XG4gICAgICAgICAgICAgICAgcG9zdGlvbi55ID0gcG9zLnkgKyBqO1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwi5qOA5rWL54K5OlwiLHBvc3Rpb24ueCxwb3N0aW9uLnkpO1xuICAgICAgICAgICAgICAgIGxldCBpbWcgPSB0aGlzLmdldEdyYXBoaXNEYXRhKHBvc3Rpb24pO1xuICAgICAgICAgICAgICAgIGlmKChpbWdbMF0gIT0gMjU1ICYmIGltZ1sxXSE9MjU1ICYmIGltZ1syXSE9MjU1KSl7XG4gICAgICAgICAgICAgICAgICAgIGpnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaiA9IDEwMDAwOyBpID0gMTAwMDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICBcbiAgICAgICAgfVxuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gamc7XG5cbiAgICB9XG5cbiAgICBjb252ZXJ0VG9EcmF3Tm9kZVBvcyh3b3JsZFBvczogY2MuVmVjMikge1xuICAgICAgICBsZXQgcG9zID0gdGhpcy5kcmF3Tm9kZS5jb252ZXJ0VG9Ob2RlU3BhY2VBUih3b3JsZFBvcyk7XG4gICAgICAgIHBvcy54ICs9IHRoaXMuZHJhd05vZGUud2lkdGggKiB0aGlzLmRyYXdOb2RlLmFuY2hvclg7XG4gICAgICAgIHBvcy55ICs9IHRoaXMuZHJhd05vZGUuaGVpZ2h0ICogdGhpcy5kcmF3Tm9kZS5hbmNob3JZO1xuICAgICAgICBwb3MueSA9IHRoaXMuZHJhd05vZGUuaGVpZ2h0IC0gcG9zLnk7XG4gICAgICAgIHJldHVybiBwb3M7XG4gICAgfVxuXG4gICAgYWRkSGlzdG9yeSgpIHtcbiAgICAgICAgbGV0IGNvcHkgPSB0aGlzLmRiLmNvcHlEYXRhKCk7XG4gICAgICAgIGxldCB1Y29weSA9IG5ldyBVaW50OEFycmF5KGNvcHkpO1xuICAgICAgICB0aGlzLmhpc3RvcnkucHVzaCh7IGRhdGE6IHVjb3B5IH0pO1xuICAgICAgICAvLyBjYy5sb2coJ+WOhuWPsuatpemqpDogJywgdGhpcy5oaXN0b3J5Lmxlbmd0aCk7XG4gICAgfVxuXG4gICAgZHJhd1RvSW1nKCkge1xuICAgICAgICAvL+iOt+WPlueUu+adv+S4ree7mOWItueahOWbvuahiOaVsOaNrlxuICAgICAgICBsZXQgZGF0YTogVWludDhBcnJheSA9IHRoaXMuZGIuZ2V0RGF0YSgpO1xuICAgICAgICAvL+WwhuaVsOaNruS8oOmAkue7mei0tOWbvuWvueixoVxuICAgICAgICB0aGlzLnRleHR1cmUuaW5pdFdpdGhEYXRhKGRhdGEsIGNjLlRleHR1cmUyRC5QaXhlbEZvcm1hdC5SR0JBODg4OCwgdGhpcy5kYi53aWR0aCwgdGhpcy5kYi5oZWlnaHQpO1xuICAgIH1cblxuICAgIGNoYW5nZUNvbG9yKHJlZCl7XG4gICAgICAgIGlmKCFyZWQpIHRoaXMuZGIuc2V0Q29sb3IodGhpcy5lcnJDb2xvci5yLCB0aGlzLmVyckNvbG9yLmcsIHRoaXMuZXJyQ29sb3IuYiwgdGhpcy5lcnJDb2xvci5hKVxuICAgICAgICBlbHNlIHRoaXMuZGIuc2V0Q29sb3IodGhpcy5sYXN0Q29sb3IuciwgdGhpcy5sYXN0Q29sb3IuZywgdGhpcy5sYXN0Q29sb3IuYiwgdGhpcy5sYXN0Q29sb3IuYSk7XG4gICAgfVxuXG4gICAgZ2V0R3JhcGhpc0RhdGEocG9pbnQpe1xuICAgICAgICBsZXQgVWludDggPSBuZXcgVWludDhBcnJheSg0KTtcbiAgICAgICAgVWludDggPSB0aGlzLnRhcmdldENhbWVyYS50YXJnZXRUZXh0dXJlLnJlYWRQaXhlbHMoVWludDgscG9pbnQueCxwb2ludC55LDEsMSk7XG5cbiAgICAgICAgcmV0dXJuIFVpbnQ4O1xuICAgIH1cblxuXG4gICAgb25CdG5EcmF3KCkge1xuICAgICAgICB0aGlzLmRiLnNldExpbmVXaWR0aCh0aGlzLmxhc3RMaW5lV2lkdGgpO1xuICAgICAgICB0aGlzLmRiLnNldENvbG9yKHRoaXMubGFzdENvbG9yLnIsIHRoaXMubGFzdENvbG9yLmcsIHRoaXMubGFzdENvbG9yLmIsIHRoaXMubGFzdENvbG9yLmEpO1xuICAgICAgICB0aGlzLmdhbWVTdGF0ZSA9IEdhbWVTdGF0ZS5kcmF3aW5nO1xuICAgIH1cblxuICAgIG9uQnRuRXJhc2UoKSB7XG4gICAgICAgIHRoaXMuZGIuc2V0TGluZVdpZHRoKHRoaXMubGFzdExpbmVXaWR0aCAqIDMpO1xuICAgICAgICAvLyDmqaHnmq7mk6bnmoTpopzoibLkuI3og73mmK8oMCwwLDAsMCks5Zug5Li66L+Z5qC35Lya5ZKMRHJhd2luZ0JvYXJk6YeM55qE6buY6K6k6aKc6Imy55u45ZCM5a+86Ie057uY5Yi26Lez6L+HXG4gICAgICAgIHRoaXMuZGIuc2V0Q29sb3IoMjU1LCAyNTUsIDI1NSwgMCk7XG4gICAgICAgIHRoaXMuZ2FtZVN0YXRlID0gR2FtZVN0YXRlLmVyYXNpbmc7XG5cbiAgICB9XG5cbiAgICBvbkJ0bkNsZWFyKCkge1xuICAgICAgICB0aGlzLmRiLnJlc2V0KCk7XG4gICAgICAgIHRoaXMuZHJhd1RvSW1nKCk7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5zcGxpY2UoMCwgdGhpcy5oaXN0b3J5Lmxlbmd0aCk7XG4gICAgfVxuXG4gICAgb25CdG5SZXZva2UoKSB7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5wb3AoKTtcbiAgICAgICAgaWYgKHRoaXMuaGlzdG9yeS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBkYXRhOiBVaW50OEFycmF5ID0gdGhpcy5oaXN0b3J5W3RoaXMuaGlzdG9yeS5sZW5ndGggLSAxXS5kYXRhO1xuICAgICAgICAgICAgdGhpcy5kYi5zZXREYXRhKGRhdGEuYnVmZmVyKTtcbiAgICAgICAgICAgIHRoaXMudGV4dHVyZS5pbml0V2l0aERhdGEodGhpcy5kYi5nZXREYXRhKCksIGNjLlRleHR1cmUyRC5QaXhlbEZvcm1hdC5SR0JBODg4OCwgdGhpcy5kYi53aWR0aCwgdGhpcy5kYi5oZWlnaHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vbkJ0bkNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2MubG9nKCfljoblj7LorrDlvZXliankvZk6ICcsIHRoaXMuaGlzdG9yeS5sZW5ndGgpO1xuICAgIH1cblxuICAgIG9uQnRuU2F2ZSgpIHtcbiAgICAgICAgaWYgKGNjLnN5cy5pc0Jyb3dzZXIpIHtcbiAgICAgICAgICAgIGxldCB3aWR0aCA9IHRoaXMuZHJhd05vZGUud2lkdGg7XG4gICAgICAgICAgICBsZXQgaGVpZ2h0ID0gdGhpcy5kcmF3Tm9kZS5oZWlnaHQ7XG5cbiAgICAgICAgICAgIHRoaXMuY2FwdHVyZUNhbWVyYS5lbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGxldCB0ZXh0dXJlID0gbmV3IGNjLlJlbmRlclRleHR1cmUoKTtcbiAgICAgICAgICAgIHRleHR1cmUuaW5pdFdpdGhTaXplKHdpZHRoLCBoZWlnaHQsIGNjLlJlbmRlclRleHR1cmUuRGVwdGhTdGVuY2lsRm9ybWF0LlJCX0ZNVF9TOCk7XG4gICAgICAgICAgICB0aGlzLmNhcHR1cmVDYW1lcmEudGFyZ2V0VGV4dHVyZSA9IHRleHR1cmU7XG5cbiAgICAgICAgICAgIGxldCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgICAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgICAgICBsZXQgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgICAgICB0aGlzLmNhcHR1cmVDYW1lcmEucmVuZGVyKCk7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHRleHR1cmUucmVhZFBpeGVscygpO1xuICAgICAgICAgICAgLy8gd3JpdGUgdGhlIHJlbmRlciBkYXRhXG4gICAgICAgICAgICBsZXQgcm93Qnl0ZXMgPSB3aWR0aCAqIDQ7XG4gICAgICAgICAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNyb3cgPSBoZWlnaHQgLSAxIC0gcm93O1xuICAgICAgICAgICAgICAgIGxldCBpbWFnZURhdGEgPSBjdHguY3JlYXRlSW1hZ2VEYXRhKHdpZHRoLCAxKTtcbiAgICAgICAgICAgICAgICBsZXQgc3RhcnQgPSBzcm93ICogd2lkdGggKiA0O1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93Qnl0ZXM7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpbWFnZURhdGEuZGF0YVtpXSA9IGRhdGFbc3RhcnQgKyBpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3R4LnB1dEltYWdlRGF0YShpbWFnZURhdGEsIDAsIHJvdyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgbGV0IGRhdGFVcmwgPSBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKTtcbiAgICAgICAgICAgIC8vIGNjLmxvZygnaWFtZ2UtYmFzZTY0OicsIGRhdGFVcmwpO1xuICAgICAgICAgICAgbGV0IHNhdmVMaW5rOiBhbnkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAnYScpO1xuICAgICAgICAgICAgc2F2ZUxpbmsuaHJlZiA9IGRhdGFVcmw7XG4gICAgICAgICAgICBzYXZlTGluay5kb3dubG9hZCA9IFN0cmluZyhEYXRlLm5vdygpKSArICcucG5nJztcbiAgICAgICAgICAgIGxldCBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdNb3VzZUV2ZW50cycpO1xuICAgICAgICAgICAgZXZlbnQuaW5pdE1vdXNlRXZlbnQoJ2NsaWNrJywgdHJ1ZSwgZmFsc2UsIHdpbmRvdywgMCwgMCwgMCwgMCwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDAsIG51bGwpO1xuICAgICAgICAgICAgc2F2ZUxpbmsuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlT25jZSh0ID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhcHR1cmVDYW1lcmEuZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfSwgMC4xKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNjLndhcm4oJ+aaguaXtuWPquaUr+aMgXdlYuerr+S/neWtmOWbvueJhycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlIChkdCkge1xuICAgICAgICBcbiAgICB9XG59XG4iXX0=