From 1685c9aa6ff6e9a4cbf7b1a3e97e14318dd1e208 Mon Sep 17 00:00:00 2001 From: drawcall Date: Wed, 15 Sep 2021 20:40:38 +0800 Subject: [PATCH] feat: Add Stats destruction method --- build/proton.js | 19 +++++++- build/proton.min.js | 4 +- build/proton.min.js.map | 2 +- example/emitter/destroy/testDestroy.html | 58 ++++++++++++++++++------ package.json | 2 +- src/core/Proton.js | 7 +++ src/debug/Stats.js | 10 ++++ 7 files changed, 82 insertions(+), 20 deletions(-) diff --git a/build/proton.js b/build/proton.js index cbd46f5..e96b1c4 100755 --- a/build/proton.js +++ b/build/proton.js @@ -750,6 +750,16 @@ return Math.round(e.p.x) + "," + Math.round(e.p.y); }; + _proto.destroy = function destroy() { + if (this.container && this.container.parentNode) { + var body = this.body || document.body; + body.removeChild(this.container); + } + + this.proton = null; + this.container = null; + }; + return Stats; }(); @@ -1130,8 +1140,15 @@ _this.pool.destroy(); + _this.stats.destroy(); + Util.destroyAll(_this.emitters); Util.destroyAll(_this.renderers, _this.getAllParticles()); + _this.integrator = null; + _this.renderers = null; + _this.emitters = null; + _this.stats = null; + _this.pool = null; }; if (remove) { @@ -5464,4 +5481,4 @@ return Proton; }))); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdG9uLmpzIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMvV2ViR0xVdGlsLmpzIiwiLi4vc3JjL3V0aWxzL0RvbVV0aWwuanMiLCIuLi9zcmMvdXRpbHMvSW1nVXRpbC5qcyIsIi4uL3NyYy91dGlscy9VdGlsLmpzIiwiLi4vc3JjL3V0aWxzL1B1aWQuanMiLCIuLi9zcmMvY29yZS9Qb29sLmpzIiwiLi4vc3JjL2RlYnVnL1N0YXRzLmpzIiwiLi4vc3JjL2V2ZW50cy9FdmVudERpc3BhdGNoZXIuanMiLCIuLi9zcmMvbWF0aC9NYXRoVXRpbC5qcyIsIi4uL3NyYy9tYXRoL0ludGVncmF0aW9uLmpzIiwiLi4vc3JjL2NvcmUvUHJvdG9uLmpzIiwiLi4vc3JjL3V0aWxzL1JnYi5qcyIsIi4uL3NyYy91dGlscy9Qcm9wVXRpbC5qcyIsIi4uL3NyYy9tYXRoL2Vhc2UuanMiLCIuLi9zcmMvbWF0aC9WZWN0b3IyRC5qcyIsIi4uL3NyYy9jb3JlL1BhcnRpY2xlLmpzIiwiLi4vc3JjL3V0aWxzL0NvbG9yVXRpbC5qcyIsIi4uL3NyYy9tYXRoL1BvbGFyMkQuanMiLCIuLi9zcmMvbWF0aC9NYXQzLmpzIiwiLi4vc3JjL21hdGgvU3Bhbi5qcyIsIi4uL3NyYy9tYXRoL0FycmF5U3Bhbi5qcyIsIi4uL3NyYy9tYXRoL1JlY3RhbmdsZS5qcyIsIi4uL3NyYy9pbml0aWFsaXplL1JhdGUuanMiLCIuLi9zcmMvaW5pdGlhbGl6ZS9Jbml0aWFsaXplLmpzIiwiLi4vc3JjL2luaXRpYWxpemUvTGlmZS5qcyIsIi4uL3NyYy96b25lL1pvbmUuanMiLCIuLi9zcmMvem9uZS9Qb2ludFpvbmUuanMiLCIuLi9zcmMvaW5pdGlhbGl6ZS9Qb3NpdGlvbi5qcyIsIi4uL3NyYy9pbml0aWFsaXplL1ZlbG9jaXR5LmpzIiwiLi4vc3JjL2luaXRpYWxpemUvTWFzcy5qcyIsIi4uL3NyYy9pbml0aWFsaXplL1JhZGl1cy5qcyIsIi4uL3NyYy9pbml0aWFsaXplL0JvZHkuanMiLCIuLi9zcmMvYmVoYXZpb3VyL0JlaGF2aW91ci5qcyIsIi4uL3NyYy9iZWhhdmlvdXIvRm9yY2UuanMiLCIuLi9zcmMvYmVoYXZpb3VyL0F0dHJhY3Rpb24uanMiLCIuLi9zcmMvYmVoYXZpb3VyL1JhbmRvbURyaWZ0LmpzIiwiLi4vc3JjL2JlaGF2aW91ci9HcmF2aXR5LmpzIiwiLi4vc3JjL2JlaGF2aW91ci9Db2xsaXNpb24uanMiLCIuLi9zcmMvYmVoYXZpb3VyL0Nyb3NzWm9uZS5qcyIsIi4uL3NyYy9iZWhhdmlvdXIvQWxwaGEuanMiLCIuLi9zcmMvYmVoYXZpb3VyL1NjYWxlLmpzIiwiLi4vc3JjL2JlaGF2aW91ci9Sb3RhdGUuanMiLCIuLi9zcmMvYmVoYXZpb3VyL0NvbG9yLmpzIiwiLi4vc3JjL2JlaGF2aW91ci9DeWNsb25lLmpzIiwiLi4vc3JjL2JlaGF2aW91ci9SZXB1bHNpb24uanMiLCIuLi9zcmMvYmVoYXZpb3VyL0dyYXZpdHlXZWxsLmpzIiwiLi4vc3JjL2luaXRpYWxpemUvSW5pdGlhbGl6ZVV0aWwuanMiLCIuLi9zcmMvZW1pdHRlci9FbWl0dGVyLmpzIiwiLi4vc3JjL2VtaXR0ZXIvQmVoYXZpb3VyRW1pdHRlci5qcyIsIi4uL3NyYy9lbWl0dGVyL0ZvbGxvd0VtaXR0ZXIuanMiLCIuLi9zcmMvdXRpbHMvVHlwZXMuanMiLCIuLi9zcmMvcmVuZGVyL0Jhc2VSZW5kZXJlci5qcyIsIi4uL3NyYy9yZW5kZXIvQ2FudmFzUmVuZGVyZXIuanMiLCIuLi9zcmMvcmVuZGVyL0RvbVJlbmRlcmVyLmpzIiwiLi4vc3JjL3JlbmRlci9FYXNlbFJlbmRlcmVyLmpzIiwiLi4vc3JjL3JlbmRlci9QaXhlbFJlbmRlcmVyLmpzIiwiLi4vc3JjL3JlbmRlci9QaXhpUmVuZGVyZXIuanMiLCIuLi9zcmMvdXRpbHMvTVN0YWNrLmpzIiwiLi4vc3JjL3JlbmRlci9XZWJHTFJlbmRlcmVyLmpzIiwiLi4vc3JjL3JlbmRlci9DdXN0b21SZW5kZXJlci5qcyIsIi4uL3NyYy96b25lL0xpbmVab25lLmpzIiwiLi4vc3JjL3pvbmUvQ2lyY2xlWm9uZS5qcyIsIi4uL3NyYy96b25lL1JlY3Rab25lLmpzIiwiLi4vc3JjL3pvbmUvSW1hZ2Vab25lLmpzIiwiLi4vc3JjL2RlYnVnL0RlYnVnLmpzIiwiLi4vc3JjL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IHtcbiAgLyoqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLldlYkdMVXRpbFxuICAgKiBAbWV0aG9kIGlwb3RcbiAgICpcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uXG4gICAqIEB0b2RvIGFkZCBsZW5ndGggZGVzY3JpcHRpb25cbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGxlbmd0aFxuICAgKlxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaXBvdChsZW5ndGgpIHtcbiAgICByZXR1cm4gKGxlbmd0aCAmIChsZW5ndGggLSAxKSkgPT09IDA7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLldlYkdMVXRpbFxuICAgKiBAbWV0aG9kIG5ocG90XG4gICAqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvblxuICAgKiBAdG9kbyBhZGQgbGVuZ3RoIGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBsZW5ndGhcbiAgICpcbiAgICogQHJldHVybiB7TnVtYmVyfVxuICAgKi9cbiAgbmhwb3QobGVuZ3RoKSB7XG4gICAgLS1sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCAzMjsgaSA8PD0gMSkge1xuICAgICAgbGVuZ3RoID0gbGVuZ3RoIHwgKGxlbmd0aCA+PiBpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGVuZ3RoICsgMTtcbiAgfSxcblxuICAvKipcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uV2ViR0xVdGlsXG4gICAqIEBtZXRob2QgbWFrZVRyYW5zbGF0aW9uXG4gICAqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvblxuICAgKiBAdG9kbyBhZGQgdHgsIHR5IGRlc2NyaXB0aW9uXG4gICAqIEB0b2RvIGFkZCByZXR1cm4gZGVzY3JpcHRpb25cbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHR4IGVpdGhlciAwIG9yIDFcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHR5IGVpdGhlciAwIG9yIDFcbiAgICpcbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cbiAgbWFrZVRyYW5zbGF0aW9uKHR4LCB0eSkge1xuICAgIHJldHVybiBbMSwgMCwgMCwgMCwgMSwgMCwgdHgsIHR5LCAxXTtcbiAgfSxcblxuICAvKipcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uV2ViR0xVdGlsXG4gICAqIEBtZXRob2QgbWFrZVJvdGF0aW9uXG4gICAqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvblxuICAgKiBAdG9kbyBhZGQgcmV0dXJuIGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBhbmdsZUluUmFkaWFuc1xuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuICBtYWtlUm90YXRpb24oYW5nbGVJblJhZGlhbnMpIHtcbiAgICBsZXQgYyA9IE1hdGguY29zKGFuZ2xlSW5SYWRpYW5zKTtcbiAgICBsZXQgcyA9IE1hdGguc2luKGFuZ2xlSW5SYWRpYW5zKTtcblxuICAgIHJldHVybiBbYywgLXMsIDAsIHMsIGMsIDAsIDAsIDAsIDFdO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5XZWJHTFV0aWxcbiAgICogQG1ldGhvZCBtYWtlU2NhbGVcbiAgICpcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uXG4gICAqIEB0b2RvIGFkZCB0eCwgdHkgZGVzY3JpcHRpb25cbiAgICogQHRvZG8gYWRkIHJldHVybiBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gc3ggZWl0aGVyIDAgb3IgMVxuICAgKiBAcGFyYW0ge051bWJlcn0gc3kgZWl0aGVyIDAgb3IgMVxuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuICBtYWtlU2NhbGUoc3gsIHN5KSB7XG4gICAgcmV0dXJuIFtzeCwgMCwgMCwgMCwgc3ksIDAsIDAsIDAsIDFdO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5XZWJHTFV0aWxcbiAgICogQG1ldGhvZCBtYXRyaXhNdWx0aXBseVxuICAgKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb25cbiAgICogQHRvZG8gYWRkIGEsIGIgZGVzY3JpcHRpb25cbiAgICogQHRvZG8gYWRkIHJldHVybiBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gYVxuICAgKiBAcGFyYW0ge09iamVjdH0gYlxuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuICBtYXRyaXhNdWx0aXBseShhLCBiKSB7XG4gICAgbGV0IGEwMCA9IGFbMCAqIDMgKyAwXTtcbiAgICBsZXQgYTAxID0gYVswICogMyArIDFdO1xuICAgIGxldCBhMDIgPSBhWzAgKiAzICsgMl07XG4gICAgbGV0IGExMCA9IGFbMSAqIDMgKyAwXTtcbiAgICBsZXQgYTExID0gYVsxICogMyArIDFdO1xuICAgIGxldCBhMTIgPSBhWzEgKiAzICsgMl07XG4gICAgbGV0IGEyMCA9IGFbMiAqIDMgKyAwXTtcbiAgICBsZXQgYTIxID0gYVsyICogMyArIDFdO1xuICAgIGxldCBhMjIgPSBhWzIgKiAzICsgMl07XG4gICAgbGV0IGIwMCA9IGJbMCAqIDMgKyAwXTtcbiAgICBsZXQgYjAxID0gYlswICogMyArIDFdO1xuICAgIGxldCBiMDIgPSBiWzAgKiAzICsgMl07XG4gICAgbGV0IGIxMCA9IGJbMSAqIDMgKyAwXTtcbiAgICBsZXQgYjExID0gYlsxICogMyArIDFdO1xuICAgIGxldCBiMTIgPSBiWzEgKiAzICsgMl07XG4gICAgbGV0IGIyMCA9IGJbMiAqIDMgKyAwXTtcbiAgICBsZXQgYjIxID0gYlsyICogMyArIDFdO1xuICAgIGxldCBiMjIgPSBiWzIgKiAzICsgMl07XG5cbiAgICByZXR1cm4gW1xuICAgICAgYTAwICogYjAwICsgYTAxICogYjEwICsgYTAyICogYjIwLFxuICAgICAgYTAwICogYjAxICsgYTAxICogYjExICsgYTAyICogYjIxLFxuICAgICAgYTAwICogYjAyICsgYTAxICogYjEyICsgYTAyICogYjIyLFxuICAgICAgYTEwICogYjAwICsgYTExICogYjEwICsgYTEyICogYjIwLFxuICAgICAgYTEwICogYjAxICsgYTExICogYjExICsgYTEyICogYjIxLFxuICAgICAgYTEwICogYjAyICsgYTExICogYjEyICsgYTEyICogYjIyLFxuICAgICAgYTIwICogYjAwICsgYTIxICogYjEwICsgYTIyICogYjIwLFxuICAgICAgYTIwICogYjAxICsgYTIxICogYjExICsgYTIyICogYjIxLFxuICAgICAgYTIwICogYjAyICsgYTIxICogYjEyICsgYTIyICogYjIyXG4gICAgXTtcbiAgfVxufTtcbiIsImV4cG9ydCBkZWZhdWx0IHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgY2FudmFzLiBUaGUgb3BhY2l0eSBpcyBieSBkZWZhdWx0IHNldCB0byAwXG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkRvbVV0aWxcbiAgICogQG1ldGhvZCBjcmVhdGVDYW52YXNcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9ICRpZCB0aGUgY2FudmFzJyBpZFxuICAgKiBAcGFyYW0ge051bWJlcn0gJHdpZHRoIHRoZSBjYW52YXMnIHdpZHRoXG4gICAqIEBwYXJhbSB7TnVtYmVyfSAkaGVpZ2h0IHRoZSBjYW52YXMnIGhlaWdodFxuICAgKiBAcGFyYW0ge1N0cmluZ30gWyRwb3NpdGlvbj1hYnNvbHV0ZV0gdGhlIGNhbnZhcycgcG9zaXRpb24sIGRlZmF1bHQgaXMgJ2Fic29sdXRlJ1xuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuICBjcmVhdGVDYW52YXMoaWQsIHdpZHRoLCBoZWlnaHQsIHBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiKSB7XG4gICAgY29uc3QgZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcblxuICAgIGRvbS5pZCA9IGlkO1xuICAgIGRvbS53aWR0aCA9IHdpZHRoO1xuICAgIGRvbS5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgZG9tLnN0eWxlLm9wYWNpdHkgPSAwO1xuICAgIGRvbS5zdHlsZS5wb3NpdGlvbiA9IHBvc2l0aW9uO1xuICAgIHRoaXMudHJhbnNmb3JtKGRvbSwgLTUwMCwgLTUwMCwgMCwgMCk7XG5cbiAgICByZXR1cm4gZG9tO1xuICB9LFxuXG4gIGNyZWF0ZURpdihpZCwgd2lkdGgsIGhlaWdodCkge1xuICAgIGNvbnN0IGRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cbiAgICBkb20uaWQgPSBpZDtcbiAgICBkb20uc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgdGhpcy5yZXNpemUoZG9tLCB3aWR0aCwgaGVpZ2h0KTtcblxuICAgIHJldHVybiBkb207XG4gIH0sXG5cbiAgcmVzaXplKGRvbSwgd2lkdGgsIGhlaWdodCkge1xuICAgIGRvbS5zdHlsZS53aWR0aCA9IHdpZHRoICsgXCJweFwiO1xuICAgIGRvbS5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyBcInB4XCI7XG4gICAgZG9tLnN0eWxlLm1hcmdpbkxlZnQgPSAtd2lkdGggLyAyICsgXCJweFwiO1xuICAgIGRvbS5zdHlsZS5tYXJnaW5Ub3AgPSAtaGVpZ2h0IC8gMiArIFwicHhcIjtcbiAgfSxcblxuICAvKipcbiAgICogQWRkcyBhIHRyYW5zZm9ybTogdHJhbnNsYXRlKCksIHNjYWxlKCksIHJvdGF0ZSgpIHRvIGEgZ2l2ZW4gZGl2IGRvbSBmb3IgYWxsIGJyb3dzZXJzXG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkRvbVV0aWxcbiAgICogQG1ldGhvZCB0cmFuc2Zvcm1cbiAgICpcbiAgICogQHBhcmFtIHtIVE1MRGl2RWxlbWVudH0gZGl2XG4gICAqIEBwYXJhbSB7TnVtYmVyfSAkeFxuICAgKiBAcGFyYW0ge051bWJlcn0gJHlcbiAgICogQHBhcmFtIHtOdW1iZXJ9ICRzY2FsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gJHJvdGF0ZVxuICAgKi9cbiAgdHJhbnNmb3JtKGRpdiwgeCwgeSwgc2NhbGUsIHJvdGF0ZSkge1xuICAgIGRpdi5zdHlsZS53aWxsQ2hhbmdlID0gXCJ0cmFuc2Zvcm1cIjtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7eH1weCwgJHt5fXB4KSBzY2FsZSgke3NjYWxlfSkgcm90YXRlKCR7cm90YXRlfWRlZylgO1xuICAgIHRoaXMuY3NzMyhkaXYsIFwidHJhbnNmb3JtXCIsIHRyYW5zZm9ybSk7XG4gIH0sXG5cbiAgdHJhbnNmb3JtM2QoZGl2LCB4LCB5LCBzY2FsZSwgcm90YXRlKSB7XG4gICAgZGl2LnN0eWxlLndpbGxDaGFuZ2UgPSBcInRyYW5zZm9ybVwiO1xuICAgIGNvbnN0IHRyYW5zZm9ybSA9IGB0cmFuc2xhdGUzZCgke3h9cHgsICR7eX1weCwgMCkgc2NhbGUoJHtzY2FsZX0pIHJvdGF0ZSgke3JvdGF0ZX1kZWcpYDtcbiAgICB0aGlzLmNzczMoZGl2LCBcImJhY2tmYWNlVmlzaWJpbGl0eVwiLCBcImhpZGRlblwiKTtcbiAgICB0aGlzLmNzczMoZGl2LCBcInRyYW5zZm9ybVwiLCB0cmFuc2Zvcm0pO1xuICB9LFxuXG4gIGNzczMoZGl2LCBrZXksIHZhbCkge1xuICAgIGNvbnN0IGJrZXkgPSBrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBrZXkuc3Vic3RyKDEpO1xuXG4gICAgZGl2LnN0eWxlW2BXZWJraXQke2JrZXl9YF0gPSB2YWw7XG4gICAgZGl2LnN0eWxlW2BNb3oke2JrZXl9YF0gPSB2YWw7XG4gICAgZGl2LnN0eWxlW2BPJHtia2V5fWBdID0gdmFsO1xuICAgIGRpdi5zdHlsZVtgbXMke2JrZXl9YF0gPSB2YWw7XG4gICAgZGl2LnN0eWxlW2Ake2tleX1gXSA9IHZhbDtcbiAgfVxufTtcbiIsImltcG9ydCBXZWJHTFV0aWwgZnJvbSBcIi4vV2ViR0xVdGlsXCI7XG5pbXBvcnQgRG9tVXRpbCBmcm9tIFwiLi9Eb21VdGlsXCI7XG5cbmNvbnN0IGltZ3NDYWNoZSA9IHt9O1xuY29uc3QgY2FudmFzQ2FjaGUgPSB7fTtcbmxldCBjYW52YXNJZCA9IDA7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgLyoqXG4gICAqIFRoaXMgd2lsbCBnZXQgdGhlIGltYWdlIGRhdGEuIEl0IGNvdWxkIGJlIG5lY2Vzc2FyeSB0byBjcmVhdGUgYSBQcm90b24uWm9uZS5cbiAgICpcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uVXRpbFxuICAgKiBAbWV0aG9kIGdldEltYWdlRGF0YVxuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxDYW52YXNFbGVtZW50fSAgIGNvbnRleHQgYW55IGNhbnZhcywgbXVzdCBiZSBhIDJkQ29udGV4dCAnY2FudmFzLmdldENvbnRleHQoJzJkJyknXG4gICAqIEBwYXJhbSB7T2JqZWN0fSAgICAgICAgICAgICAgaW1hZ2UgICBjb3VsZCBiZSBhbnkgZG9tIGltYWdlLCBlLmcuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGlzSXNBbkltZ1RhZycpO1xuICAgKiBAcGFyYW0ge1Byb3Rvbi5SZWN0YW5nbGV9ICAgIHJlY3RcbiAgICovXG4gIGdldEltYWdlRGF0YShjb250ZXh0LCBpbWFnZSwgcmVjdCkge1xuICAgIGNvbnRleHQuZHJhd0ltYWdlKGltYWdlLCByZWN0LngsIHJlY3QueSk7XG4gICAgY29uc3QgaW1hZ2VkYXRhID0gY29udGV4dC5nZXRJbWFnZURhdGEocmVjdC54LCByZWN0LnksIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTtcbiAgICBjb250ZXh0LmNsZWFyUmVjdChyZWN0LngsIHJlY3QueSwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpO1xuXG4gICAgcmV0dXJuIGltYWdlZGF0YTtcbiAgfSxcblxuICAvKipcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uVXRpbFxuICAgKiBAbWV0aG9kIGdldEltZ0Zyb21DYWNoZVxuICAgKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb25cbiAgICogQHRvZG8gZGVzY3JpYmUgZnVuY1xuICAgKlxuICAgKiBAcGFyYW0ge01peGVkfSAgICAgICAgICAgICAgIGltZ1xuICAgKiBAcGFyYW0ge1Byb3Rvbi5QYXJ0aWNsZX0gICAgIHBhcnRpY2xlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gICAgICAgICAgICAgZHJhd0NhbnZhcyAgc2V0IHRvIHRydWUgaWYgYSBjYW52YXMgc2hvdWxkIGJlIHNhdmVkIGludG8gcGFydGljbGUuZGF0YS5jYW52YXNcbiAgICogQHBhcmFtIHtCb29sZWFufSAgICAgICAgICAgICBmdW5jXG4gICAqL1xuICBnZXRJbWdGcm9tQ2FjaGUoaW1nLCBjYWxsYmFjaywgcGFyYW0pIHtcbiAgICBjb25zdCBzcmMgPSB0eXBlb2YgaW1nID09PSBcInN0cmluZ1wiID8gaW1nIDogaW1nLnNyYztcblxuICAgIGlmIChpbWdzQ2FjaGVbc3JjXSkge1xuICAgICAgY2FsbGJhY2soaW1nc0NhY2hlW3NyY10sIHBhcmFtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgICAgIGltYWdlLm9ubG9hZCA9IGUgPT4ge1xuICAgICAgICBpbWdzQ2FjaGVbc3JjXSA9IGUudGFyZ2V0O1xuICAgICAgICBjYWxsYmFjayhpbWdzQ2FjaGVbc3JjXSwgcGFyYW0pO1xuICAgICAgfTtcblxuICAgICAgaW1hZ2Uuc3JjID0gc3JjO1xuICAgIH1cbiAgfSxcblxuICBnZXRDYW52YXNGcm9tQ2FjaGUoaW1nLCBjYWxsYmFjaywgcGFyYW0pIHtcbiAgICBjb25zdCBzcmMgPSBpbWcuc3JjO1xuXG4gICAgaWYgKCFjYW52YXNDYWNoZVtzcmNdKSB7XG4gICAgICBjb25zdCB3aWR0aCA9IFdlYkdMVXRpbC5uaHBvdChpbWcud2lkdGgpO1xuICAgICAgY29uc3QgaGVpZ2h0ID0gV2ViR0xVdGlsLm5ocG90KGltZy5oZWlnaHQpO1xuXG4gICAgICBjb25zdCBjYW52YXMgPSBEb21VdGlsLmNyZWF0ZUNhbnZhcyhgcHJvdG9uX2NhbnZhc19jYWNoZV8keysrY2FudmFzSWR9YCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgIGNvbnRleHQuZHJhd0ltYWdlKGltZywgMCwgMCwgaW1nLndpZHRoLCBpbWcuaGVpZ2h0KTtcblxuICAgICAgY2FudmFzQ2FjaGVbc3JjXSA9IGNhbnZhcztcbiAgICB9XG5cbiAgICBjYWxsYmFjayAmJiBjYWxsYmFjayhjYW52YXNDYWNoZVtzcmNdLCBwYXJhbSk7XG5cbiAgICByZXR1cm4gY2FudmFzQ2FjaGVbc3JjXTtcbiAgfVxufTtcbiIsImltcG9ydCBJbWdVdGlsIGZyb20gXCIuL0ltZ1V0aWxcIjtcblxuZXhwb3J0IGRlZmF1bHQge1xuICAvKipcbiAgICogUmV0dXJucyB0aGUgZGVmYXVsdCBpZiB0aGUgdmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWRcbiAgICpcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uVXRpbFxuICAgKiBAbWV0aG9kIGluaXRWYWx1ZVxuICAgKlxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZSBhIHNwZWNpZmljIHZhbHVlLCBjb3VsZCBiZSBldmVyeXRoaW5nIGJ1dCBudWxsIG9yIHVuZGVmaW5lZFxuICAgKiBAcGFyYW0ge01peGVkfSBkZWZhdWx0cyB0aGUgZGVmYXVsdCBpZiB0aGUgdmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWRcbiAgICovXG4gIGluaXRWYWx1ZSh2YWx1ZSwgZGVmYXVsdHMpIHtcbiAgICB2YWx1ZSA9IHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IGRlZmF1bHRzO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSxcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSB2YWx1ZSBpcyBhIHZhbGlkIGFycmF5XG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlV0aWxcbiAgICogQG1ldGhvZCBpc0FycmF5XG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlIEFueSBhcnJheVxuICAgKlxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICovXG4gIGlzQXJyYXkodmFsdWUpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gXCJbb2JqZWN0IEFycmF5XVwiO1xuICB9LFxuXG4gIC8qKlxuICAgKiBEZXN0cm95ZXMgdGhlIGdpdmVuIGFycmF5XG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlV0aWxcbiAgICogQG1ldGhvZCBlbXB0eUFycmF5XG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IEFueSBhcnJheVxuICAgKi9cbiAgZW1wdHlBcnJheShhcnIpIHtcbiAgICBpZiAoYXJyKSBhcnIubGVuZ3RoID0gMDtcbiAgfSxcblxuICB0b0FycmF5KGFycikge1xuICAgIHJldHVybiB0aGlzLmlzQXJyYXkoYXJyKSA/IGFyciA6IFthcnJdO1xuICB9LFxuXG4gIGdldFJhbmRGcm9tQXJyYXkoYXJyKSB7XG4gICAgaWYgKCFhcnIpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBhcnJbTWF0aC5mbG9vcihhcnIubGVuZ3RoICogTWF0aC5yYW5kb20oKSldO1xuICB9LFxuXG4gIC8qKlxuICAgKiBEZXN0cm95ZXMgdGhlIGdpdmVuIG9iamVjdFxuICAgKlxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5VdGlsXG4gICAqIEBtZXRob2QgZW1wdHlPYmplY3RcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iaiBBbnkgb2JqZWN0XG4gICAqL1xuICBlbXB0eU9iamVjdChvYmosIGlnbm9yZSA9IG51bGwpIHtcbiAgICBmb3IgKGxldCBrZXkgaW4gb2JqKSB7XG4gICAgICBpZiAoaWdub3JlICYmIGlnbm9yZS5pbmRleE9mKGtleSkgPiAtMSkgY29udGludWU7XG4gICAgICBkZWxldGUgb2JqW2tleV07XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBNYWtlcyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIGFuZCBiaW5kcyB0aGUgZ2l2ZW4gYXJyYXlcbiAgICpcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uVXRpbFxuICAgKiBAbWV0aG9kIGNsYXNzQXBwbHlcbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29uc3RydWN0b3IgQSBjbGFzcyB0byBtYWtlIGFuIGluc3RhbmNlIGZyb21cbiAgICogQHBhcmFtIHtBcnJheX0gW2FyZ3NdIEFueSBhcnJheSB0byBiaW5kIGl0IHRvIHRoZSBjb25zdHJ1Y3RvclxuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBpbnN0YW5jZSBvZiBjb25zdHJ1Y3Rvciwgb3B0aW9uYWxseSBiaW5kIHdpdGggYXJnc1xuICAgKi9cbiAgY2xhc3NBcHBseShjb25zdHJ1Y3RvciwgYXJncyA9IG51bGwpIHtcbiAgICBpZiAoIWFyZ3MpIHtcbiAgICAgIHJldHVybiBuZXcgY29uc3RydWN0b3IoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgRmFjdG9yeUZ1bmMgPSBjb25zdHJ1Y3Rvci5iaW5kLmFwcGx5KGNvbnN0cnVjdG9yLCBbbnVsbF0uY29uY2F0KGFyZ3MpKTtcbiAgICAgIHJldHVybiBuZXcgRmFjdG9yeUZ1bmMoKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFRoaXMgd2lsbCBnZXQgdGhlIGltYWdlIGRhdGEuIEl0IGNvdWxkIGJlIG5lY2Vzc2FyeSB0byBjcmVhdGUgYSBQcm90b24uWm9uZS5cbiAgICpcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uVXRpbFxuICAgKiBAbWV0aG9kIGdldEltYWdlRGF0YVxuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxDYW52YXNFbGVtZW50fSAgIGNvbnRleHQgYW55IGNhbnZhcywgbXVzdCBiZSBhIDJkQ29udGV4dCAnY2FudmFzLmdldENvbnRleHQoJzJkJyknXG4gICAqIEBwYXJhbSB7T2JqZWN0fSAgICAgICAgICAgICAgaW1hZ2UgICBjb3VsZCBiZSBhbnkgZG9tIGltYWdlLCBlLmcuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGlzSXNBbkltZ1RhZycpO1xuICAgKiBAcGFyYW0ge1Byb3Rvbi5SZWN0YW5nbGV9ICAgIHJlY3RcbiAgICovXG4gIGdldEltYWdlRGF0YShjb250ZXh0LCBpbWFnZSwgcmVjdCkge1xuICAgIHJldHVybiBJbWdVdGlsLmdldEltYWdlRGF0YShjb250ZXh0LCBpbWFnZSwgcmVjdCk7XG4gIH0sXG5cbiAgZGVzdHJveUFsbChhcnIsIHBhcmFtID0gbnVsbCkge1xuICAgIGxldCBpID0gYXJyLmxlbmd0aDtcblxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGFycltpXS5kZXN0cm95KHBhcmFtKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG5cbiAgICAgIGRlbGV0ZSBhcnJbaV07XG4gICAgfVxuXG4gICAgYXJyLmxlbmd0aCA9IDA7XG4gIH0sXG5cbiAgYXNzaWduKHRhcmdldCwgc291cmNlKSB7XG4gICAgaWYgKHR5cGVvZiBPYmplY3QuYXNzaWduICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGZvciAobGV0IGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHRhcmdldCwgc291cmNlKTtcbiAgICB9XG4gIH1cbn07XG4iLCJjb25zdCBpZHNNYXAgPSB7fTtcblxuY29uc3QgUHVpZCA9IHtcbiAgX2luZGV4OiAwLFxuICBfY2FjaGU6IHt9LFxuXG4gIGlkKHR5cGUpIHtcbiAgICBpZiAoaWRzTWFwW3R5cGVdID09PSB1bmRlZmluZWQgfHwgaWRzTWFwW3R5cGVdID09PSBudWxsKSBpZHNNYXBbdHlwZV0gPSAwO1xuICAgIHJldHVybiBgJHt0eXBlfV8ke2lkc01hcFt0eXBlXSsrfWA7XG4gIH0sXG5cbiAgZ2V0SWQodGFyZ2V0KSB7XG4gICAgbGV0IHVpZCA9IHRoaXMuZ2V0SWRGcm9tQ2FjaGUodGFyZ2V0KTtcbiAgICBpZiAodWlkKSByZXR1cm4gdWlkO1xuXG4gICAgdWlkID0gYFBVSURfJHt0aGlzLl9pbmRleCsrfWA7XG4gICAgdGhpcy5fY2FjaGVbdWlkXSA9IHRhcmdldDtcbiAgICByZXR1cm4gdWlkO1xuICB9LFxuXG4gIGdldElkRnJvbUNhY2hlKHRhcmdldCkge1xuICAgIGxldCBvYmosIGlkO1xuXG4gICAgZm9yIChpZCBpbiB0aGlzLl9jYWNoZSkge1xuICAgICAgb2JqID0gdGhpcy5fY2FjaGVbaWRdO1xuXG4gICAgICBpZiAob2JqID09PSB0YXJnZXQpIHJldHVybiBpZDtcbiAgICAgIGlmICh0aGlzLmlzQm9keShvYmosIHRhcmdldCkgJiYgb2JqLnNyYyA9PT0gdGFyZ2V0LnNyYykgcmV0dXJuIGlkO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9LFxuXG4gIGlzQm9keShvYmosIHRhcmdldCkge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiB0YXJnZXQgPT09IFwib2JqZWN0XCIgJiYgb2JqLmlzSW5uZXIgJiYgdGFyZ2V0LmlzSW5uZXI7XG4gIH0sXG5cbiAgZ2V0VGFyZ2V0KHVpZCkge1xuICAgIHJldHVybiB0aGlzLl9jYWNoZVt1aWRdO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBQdWlkO1xuIiwiLyoqXG4gKiBQb29sIGlzIHRoZSBjYWNoZSBwb29sIG9mIHRoZSBwcm90b24gZW5naW5lLCBpdCBpcyB2ZXJ5IGltcG9ydGFudC5cbiAqXG4gKiBnZXQodGFyZ2V0LCBwYXJhbXMsIHVpZClcbiAqICBDbGFzc1xuICogICAgdWlkID0gUHVpZC5nZXRJZCAtPiBQdWlkIHNhdmUgdGFyZ2V0IGNhY2hlXG4gKiAgICB0YXJnZXQuX19wdWlkID0gdWlkXG4gKlxuICogIGJvZHlcbiAqICAgIHVpZCA9IFB1aWQuZ2V0SWQgLT4gUHVpZCBzYXZlIHRhcmdldCBjYWNoZVxuICpcbiAqXG4gKiBleHBpcmUodGFyZ2V0KVxuICogIGNhY2hlW3RhcmdldC5fX3B1aWRdIHB1c2ggdGFyZ2V0XG4gKlxuICovXG5pbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IFB1aWQgZnJvbSBcIi4uL3V0aWxzL1B1aWRcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUG9vbCB7XG4gIC8qKlxuICAgKiBAbWVtYmVyb2YhIFByb3RvbiNcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBhbGlhcyBQcm90b24uUG9vbFxuICAgKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb25cbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uIG9mIHByb3BlcnRpZXNcbiAgICpcbiAgICogQHByb3BlcnR5IHtOdW1iZXJ9IHRvdGFsXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjYWNoZVxuICAgKi9cbiAgY29uc3RydWN0b3IobnVtKSB7XG4gICAgdGhpcy50b3RhbCA9IDA7XG4gICAgdGhpcy5jYWNoZSA9IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBAbWV0aG9kIGdldFxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5Qb29sXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSB0YXJnZXRcbiAgICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIGp1c3QgYWRkIGlmIGB0YXJnZXRgIGlzIGEgZnVuY3Rpb25cbiAgICpcbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cbiAgZ2V0KHRhcmdldCwgcGFyYW1zLCB1aWQpIHtcbiAgICBsZXQgcDtcbiAgICB1aWQgPSB1aWQgfHwgdGFyZ2V0Ll9fcHVpZCB8fCBQdWlkLmdldElkKHRhcmdldCk7XG5cbiAgICBpZiAodGhpcy5jYWNoZVt1aWRdICYmIHRoaXMuY2FjaGVbdWlkXS5sZW5ndGggPiAwKSB7XG4gICAgICBwID0gdGhpcy5jYWNoZVt1aWRdLnBvcCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwID0gdGhpcy5jcmVhdGVPckNsb25lKHRhcmdldCwgcGFyYW1zKTtcbiAgICB9XG5cbiAgICBwLl9fcHVpZCA9IHRhcmdldC5fX3B1aWQgfHwgdWlkO1xuICAgIHJldHVybiBwO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBAbWV0aG9kIHNldFxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5Qb29sXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXRcbiAgICpcbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cbiAgZXhwaXJlKHRhcmdldCkge1xuICAgIHJldHVybiB0aGlzLmdldENhY2hlKHRhcmdldC5fX3B1aWQpLnB1c2godGFyZ2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGNsYXNzIGluc3RhbmNlXG4gICAqXG4gICAqIEB0b2RvIGFkZCBtb3JlIGRvY3VtZW50YXRpb25cbiAgICpcbiAgICogQG1ldGhvZCBjcmVhdGVcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uUG9vbFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gdGFyZ2V0IGFueSBPYmplY3Qgb3IgRnVuY3Rpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIGp1c3QgYWRkIGlmIGB0YXJnZXRgIGlzIGEgZnVuY3Rpb25cbiAgICpcbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cbiAgY3JlYXRlT3JDbG9uZSh0YXJnZXQsIHBhcmFtcykge1xuICAgIHRoaXMudG90YWwrKztcblxuICAgIGlmICh0aGlzLmNyZWF0ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlKHRhcmdldCwgcGFyYW1zKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB0YXJnZXQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIFV0aWwuY2xhc3NBcHBseSh0YXJnZXQsIHBhcmFtcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0YXJnZXQuY2xvbmUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uIC0gd2hhdCBpcyBpbiB0aGUgY2FjaGU/XG4gICAqXG4gICAqIEBtZXRob2QgZ2V0Q291bnRcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uUG9vbFxuICAgKlxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAqL1xuICBnZXRDb3VudCgpIHtcbiAgICBsZXQgY291bnQgPSAwO1xuICAgIGZvciAobGV0IGlkIGluIHRoaXMuY2FjaGUpIGNvdW50ICs9IHRoaXMuY2FjaGVbaWRdLmxlbmd0aDtcbiAgICByZXR1cm4gY291bnQrKztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95ZXMgYWxsIGl0ZW1zIGZyb20gUG9vbC5jYWNoZVxuICAgKlxuICAgKiBAbWV0aG9kIGRlc3Ryb3lcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uUG9vbFxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICBmb3IgKGxldCBpZCBpbiB0aGlzLmNhY2hlKSB7XG4gICAgICB0aGlzLmNhY2hlW2lkXS5sZW5ndGggPSAwO1xuICAgICAgZGVsZXRlIHRoaXMuY2FjaGVbaWRdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIFBvb2wuY2FjaGVcbiAgICpcbiAgICogQG1ldGhvZCBnZXRDYWNoZVxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5Qb29sXG4gICAqIEBwcml2YXRlXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB1aWQgdGhlIHVuaXF1ZSBpZFxuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuICBnZXRDYWNoZSh1aWQgPSBcImRlZmF1bHRcIikge1xuICAgIGlmICghdGhpcy5jYWNoZVt1aWRdKSB0aGlzLmNhY2hlW3VpZF0gPSBbXTtcbiAgICByZXR1cm4gdGhpcy5jYWNoZVt1aWRdO1xuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBTdGF0cyB7XG4gIGNvbnN0cnVjdG9yKHByb3Rvbikge1xuICAgIHRoaXMucHJvdG9uID0gcHJvdG9uO1xuICAgIHRoaXMuY29udGFpbmVyID0gbnVsbDtcbiAgICB0aGlzLnR5cGUgPSAxO1xuXG4gICAgdGhpcy5lbWl0dGVySW5kZXggPSAwO1xuICAgIHRoaXMucmVuZGVyZXJJbmRleCA9IDA7XG4gIH1cblxuICB1cGRhdGUoc3R5bGUsIGJvZHkpIHtcbiAgICB0aGlzLmFkZChzdHlsZSwgYm9keSk7XG5cbiAgICBjb25zdCBlbWl0dGVyID0gdGhpcy5nZXRFbWl0dGVyKCk7XG4gICAgY29uc3QgcmVuZGVyZXIgPSB0aGlzLmdldFJlbmRlcmVyKCk7XG4gICAgbGV0IHN0ciA9IFwiXCI7XG5cbiAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgY2FzZSAyOlxuICAgICAgICBzdHIgKz0gXCJlbWl0dGVyOlwiICsgdGhpcy5wcm90b24uZW1pdHRlcnMubGVuZ3RoICsgXCI8YnI+XCI7XG4gICAgICAgIGlmIChlbWl0dGVyKSBzdHIgKz0gXCJlbSBzcGVlZDpcIiArIGVtaXR0ZXIuZW1pdFNwZWVkICsgXCI8YnI+XCI7XG4gICAgICAgIGlmIChlbWl0dGVyKSBzdHIgKz0gXCJwb3M6XCIgKyB0aGlzLmdldEVtaXR0ZXJQb3MoZW1pdHRlcik7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIDM6XG4gICAgICAgIGlmIChlbWl0dGVyKSBzdHIgKz0gXCJpbml0aWFsaXplczpcIiArIGVtaXR0ZXIuaW5pdGlhbGl6ZXMubGVuZ3RoICsgXCI8YnI+XCI7XG4gICAgICAgIGlmIChlbWl0dGVyKVxuICAgICAgICAgIHN0ciArPSAnPHNwYW4gc3R5bGU9XCJkaXNwbGF5OmlubGluZS1ibG9jaztcIj4nICsgdGhpcy5jb25jYXRBcnIoZW1pdHRlci5pbml0aWFsaXplcykgKyBcIjwvc3Bhbj48YnI+XCI7XG4gICAgICAgIGlmIChlbWl0dGVyKSBzdHIgKz0gXCJiZWhhdmlvdXJzOlwiICsgZW1pdHRlci5iZWhhdmlvdXJzLmxlbmd0aCArIFwiPGJyPlwiO1xuICAgICAgICBpZiAoZW1pdHRlcikgc3RyICs9ICc8c3BhbiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrO1wiPicgKyB0aGlzLmNvbmNhdEFycihlbWl0dGVyLmJlaGF2aW91cnMpICsgXCI8L3NwYW4+PGJyPlwiO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSA0OlxuICAgICAgICBpZiAocmVuZGVyZXIpIHN0ciArPSByZW5kZXJlci5uYW1lICsgXCI8YnI+XCI7XG4gICAgICAgIGlmIChyZW5kZXJlcikgc3RyICs9IFwiYm9keTpcIiArIHRoaXMuZ2V0Q3JlYXRlZE51bWJlcihyZW5kZXJlcikgKyBcIjxicj5cIjtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHN0ciArPSBcInBhcnRpY2xlczpcIiArIHRoaXMucHJvdG9uLmdldENvdW50KCkgKyBcIjxicj5cIjtcbiAgICAgICAgc3RyICs9IFwicG9vbDpcIiArIHRoaXMucHJvdG9uLnBvb2wuZ2V0Q291bnQoKSArIFwiPGJyPlwiO1xuICAgICAgICBzdHIgKz0gXCJ0b3RhbDpcIiArIHRoaXMucHJvdG9uLnBvb2wudG90YWw7XG4gICAgfVxuXG4gICAgdGhpcy5jb250YWluZXIuaW5uZXJIVE1MID0gc3RyO1xuICB9XG5cbiAgYWRkKHN0eWxlLCBib2R5KSB7XG4gICAgaWYgKCF0aGlzLmNvbnRhaW5lcikge1xuICAgICAgdGhpcy50eXBlID0gMTtcblxuICAgICAgdGhpcy5jb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUuY3NzVGV4dCA9IFtcbiAgICAgICAgXCJwb3NpdGlvbjphYnNvbHV0ZTtib3R0b206MHB4O2xlZnQ6MDtjdXJzb3I6cG9pbnRlcjtcIixcbiAgICAgICAgXCJvcGFjaXR5OjAuOTt6LWluZGV4OjEwMDAwO3BhZGRpbmc6MTBweDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpIZWx2ZXRpY2EsQXJpYWwsc2Fucy1zZXJpZjtcIixcbiAgICAgICAgXCJ3aWR0aDoxMjBweDtoZWlnaHQ6NTBweDtiYWNrZ3JvdW5kLWNvbG9yOiMwMDI7Y29sb3I6IzBmZjtcIlxuICAgICAgXS5qb2luKFwiXCIpO1xuXG4gICAgICB0aGlzLmNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICBcImNsaWNrXCIsXG4gICAgICAgIGUgPT4ge1xuICAgICAgICAgIHRoaXMudHlwZSsrO1xuICAgICAgICAgIGlmICh0aGlzLnR5cGUgPiA0KSB0aGlzLnR5cGUgPSAxO1xuICAgICAgICB9LFxuICAgICAgICBmYWxzZVxuICAgICAgKTtcblxuICAgICAgbGV0IGJnLCBjb2xvcjtcbiAgICAgIHN3aXRjaCAoc3R5bGUpIHtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIGJnID0gXCIjMjAxXCI7XG4gICAgICAgICAgY29sb3IgPSBcIiNmMDhcIjtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgYmcgPSBcIiMwMjBcIjtcbiAgICAgICAgICBjb2xvciA9IFwiIzBmMFwiO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYmcgPSBcIiMwMDJcIjtcbiAgICAgICAgICBjb2xvciA9IFwiIzBmZlwiO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZVtcImJhY2tncm91bmQtY29sb3JcIl0gPSBiZztcbiAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlW1wiY29sb3JcIl0gPSBjb2xvcjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY29udGFpbmVyLnBhcmVudE5vZGUpIHtcbiAgICAgIGJvZHkgPSBib2R5IHx8IHRoaXMuYm9keSB8fCBkb2N1bWVudC5ib2R5O1xuICAgICAgYm9keS5hcHBlbmRDaGlsZCh0aGlzLmNvbnRhaW5lcik7XG4gICAgfVxuICB9XG5cbiAgZ2V0RW1pdHRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5wcm90b24uZW1pdHRlcnNbdGhpcy5lbWl0dGVySW5kZXhdO1xuICB9XG5cbiAgZ2V0UmVuZGVyZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvdG9uLnJlbmRlcmVyc1t0aGlzLnJlbmRlcmVySW5kZXhdO1xuICB9XG5cbiAgY29uY2F0QXJyKGFycikge1xuICAgIGxldCByZXN1bHQgPSBcIlwiO1xuICAgIGlmICghYXJyIHx8ICFhcnIubGVuZ3RoKSByZXR1cm4gcmVzdWx0O1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3VsdCArPSAoYXJyW2ldLm5hbWUgfHwgXCJcIikuc3Vic3RyKDAsIDEpICsgXCIuXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGdldENyZWF0ZWROdW1iZXIocmVuZGVyZXIpIHtcbiAgICByZXR1cm4gcmVuZGVyZXIucG9vbC50b3RhbCB8fCAocmVuZGVyZXIuY3Bvb2wgJiYgcmVuZGVyZXIuY3Bvb2wudG90YWwpIHx8IDA7XG4gIH1cblxuICBnZXRFbWl0dGVyUG9zKGUpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChlLnAueCkgKyBcIixcIiArIE1hdGgucm91bmQoZS5wLnkpO1xuICB9XG59XG4iLCIvKlxuICogRXZlbnREaXNwYXRjaGVyXG4gKiBUaGlzIGNvZGUgcmVmZXJlbmNlIHNpbmNlIGh0dHA6Ly9jcmVhdGVqcy5jb20vLlxuICpcbiAqKi9cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRXZlbnREaXNwYXRjaGVyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fbGlzdGVuZXJzID0gbnVsbDtcbiAgfVxuXG4gIHN0YXRpYyBiaW5kKHRhcmdldCkge1xuICAgIHRhcmdldC5wcm90b3R5cGUuZGlzcGF0Y2hFdmVudCA9IEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUuZGlzcGF0Y2hFdmVudDtcbiAgICB0YXJnZXQucHJvdG90eXBlLmhhc0V2ZW50TGlzdGVuZXIgPSBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlLmhhc0V2ZW50TGlzdGVuZXI7XG4gICAgdGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyID0gRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyO1xuICAgIHRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lcjtcbiAgICB0YXJnZXQucHJvdG90eXBlLnJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzID0gRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZS5yZW1vdmVBbGxFdmVudExpc3RlbmVycztcbiAgfVxuXG4gIGFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICBpZiAoIXRoaXMuX2xpc3RlbmVycykge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzID0ge307XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9saXN0ZW5lcnNbdHlwZV0pIHRoaXMuX2xpc3RlbmVyc1t0eXBlXSA9IFtdO1xuICAgIHRoaXMuX2xpc3RlbmVyc1t0eXBlXS5wdXNoKGxpc3RlbmVyKTtcblxuICAgIHJldHVybiBsaXN0ZW5lcjtcbiAgfVxuXG4gIHJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICBpZiAoIXRoaXMuX2xpc3RlbmVycykgcmV0dXJuO1xuICAgIGlmICghdGhpcy5fbGlzdGVuZXJzW3R5cGVdKSByZXR1cm47XG5cbiAgICBjb25zdCBhcnIgPSB0aGlzLl9saXN0ZW5lcnNbdHlwZV07XG4gICAgY29uc3QgbGVuZ3RoID0gYXJyLmxlbmd0aDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhcnJbaV0gPT09IGxpc3RlbmVyKSB7XG4gICAgICAgIGlmIChsZW5ndGggPT09IDEpIHtcbiAgICAgICAgICBkZWxldGUgdGhpcy5fbGlzdGVuZXJzW3R5cGVdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWxsb3dzIGZvciBmYXN0ZXIgY2hlY2tzLlxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBhcnIuc3BsaWNlKGksIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnModHlwZSkge1xuICAgIGlmICghdHlwZSkgdGhpcy5fbGlzdGVuZXJzID0gbnVsbDtcbiAgICBlbHNlIGlmICh0aGlzLl9saXN0ZW5lcnMpIGRlbGV0ZSB0aGlzLl9saXN0ZW5lcnNbdHlwZV07XG4gIH1cblxuICBkaXNwYXRjaEV2ZW50KHR5cGUsIGFyZ3MpIHtcbiAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG4gICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzO1xuXG4gICAgaWYgKHR5cGUgJiYgbGlzdGVuZXJzKSB7XG4gICAgICBsZXQgYXJyID0gbGlzdGVuZXJzW3R5cGVdO1xuICAgICAgaWYgKCFhcnIpIHJldHVybiByZXN1bHQ7XG5cbiAgICAgIC8vIGFyciA9IGFyci5zbGljZSgpO1xuICAgICAgLy8gdG8gYXZvaWQgaXNzdWVzIHdpdGggaXRlbXMgYmVpbmcgcmVtb3ZlZCBvciBhZGRlZCBkdXJpbmcgdGhlIGRpc3BhdGNoXG5cbiAgICAgIGxldCBoYW5kbGVyO1xuICAgICAgbGV0IGkgPSBhcnIubGVuZ3RoO1xuICAgICAgd2hpbGUgKGktLSkge1xuICAgICAgICBoYW5kbGVyID0gYXJyW2ldO1xuICAgICAgICByZXN1bHQgPSByZXN1bHQgfHwgaGFuZGxlcihhcmdzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gISFyZXN1bHQ7XG4gIH1cblxuICBoYXNFdmVudExpc3RlbmVyKHR5cGUpIHtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnM7XG4gICAgcmV0dXJuICEhKGxpc3RlbmVycyAmJiBsaXN0ZW5lcnNbdHlwZV0pO1xuICB9XG59XG4iLCJjb25zdCBQSSA9IDMuMTQxNTkyNjtcbmNvbnN0IElORklOSVRZID0gSW5maW5pdHk7XG5cbmNvbnN0IE1hdGhVdGlsID0ge1xuICBQSTogUEksXG4gIFBJeDI6IFBJICogMixcbiAgUElfMjogUEkgLyAyLFxuICBQSV8xODA6IFBJIC8gMTgwLFxuICBOMTgwX1BJOiAxODAgLyBQSSxcbiAgSW5maW5pdHk6IC05OTksXG5cbiAgaXNJbmZpbml0eShudW0pIHtcbiAgICByZXR1cm4gbnVtID09PSB0aGlzLkluZmluaXR5IHx8IG51bSA9PT0gSU5GSU5JVFk7XG4gIH0sXG5cbiAgcmFuZG9tQVRvQihhLCBiLCBpc0ludCA9IGZhbHNlKSB7XG4gICAgaWYgKCFpc0ludCkgcmV0dXJuIGEgKyBNYXRoLnJhbmRvbSgpICogKGIgLSBhKTtcbiAgICBlbHNlIHJldHVybiAoKE1hdGgucmFuZG9tKCkgKiAoYiAtIGEpKSA+PiAwKSArIGE7XG4gIH0sXG5cbiAgcmFuZG9tRmxvYXRpbmcoY2VudGVyLCBmLCBpc0ludCkge1xuICAgIHJldHVybiB0aGlzLnJhbmRvbUFUb0IoY2VudGVyIC0gZiwgY2VudGVyICsgZiwgaXNJbnQpO1xuICB9LFxuXG4gIHJhbmRvbUNvbG9yKCkge1xuICAgIHJldHVybiBcIiNcIiArIChcIjAwMDAwXCIgKyAoKE1hdGgucmFuZG9tKCkgKiAweDEwMDAwMDApIDw8IDApLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTYpO1xuICB9LFxuXG4gIHJhbmRvbVpvbmUoZGlzcGxheSkge30sXG5cbiAgZmxvb3IobnVtLCBrID0gNCkge1xuICAgIGNvbnN0IGRpZ2l0cyA9IE1hdGgucG93KDEwLCBrKTtcbiAgICByZXR1cm4gTWF0aC5mbG9vcihudW0gKiBkaWdpdHMpIC8gZGlnaXRzO1xuICB9LFxuXG4gIGRlZ3JlZVRyYW5zZm9ybShhKSB7XG4gICAgcmV0dXJuIChhICogUEkpIC8gMTgwO1xuICB9LFxuXG4gIHRvQ29sb3IxNihudW0pIHtcbiAgICByZXR1cm4gYCMke251bS50b1N0cmluZygxNil9YDtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgTWF0aFV0aWw7XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBJbnRlZ3JhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHR5cGUpIHtcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICB9XG5cbiAgY2FsY3VsYXRlKHBhcnRpY2xlcywgdGltZSwgZGFtcGluZykge1xuICAgIHRoaXMuZXVsZXJJbnRlZ3JhdGUocGFydGljbGVzLCB0aW1lLCBkYW1waW5nKTtcbiAgfVxuXG4gIC8vIEV1bGVyIEludGVncmF0ZVxuICAvLyBodHRwczovL3Jvc2V0dGFjb2RlLm9yZy93aWtpL0V1bGVyX21ldGhvZFxuICBldWxlckludGVncmF0ZShwYXJ0aWNsZSwgdGltZSwgZGFtcGluZykge1xuICAgIGlmICghcGFydGljbGUuc2xlZXApIHtcbiAgICAgIHBhcnRpY2xlLm9sZC5wLmNvcHkocGFydGljbGUucCk7XG4gICAgICBwYXJ0aWNsZS5vbGQudi5jb3B5KHBhcnRpY2xlLnYpO1xuXG4gICAgICBwYXJ0aWNsZS5hLm11bHRpcGx5U2NhbGFyKDEgLyBwYXJ0aWNsZS5tYXNzKTtcbiAgICAgIHBhcnRpY2xlLnYuYWRkKHBhcnRpY2xlLmEubXVsdGlwbHlTY2FsYXIodGltZSkpO1xuICAgICAgcGFydGljbGUucC5hZGQocGFydGljbGUub2xkLnYubXVsdGlwbHlTY2FsYXIodGltZSkpO1xuXG4gICAgICBpZiAoZGFtcGluZykgcGFydGljbGUudi5tdWx0aXBseVNjYWxhcihkYW1waW5nKTtcblxuICAgICAgcGFydGljbGUuYS5jbGVhcigpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IFBvb2wgZnJvbSBcIi4vUG9vbFwiO1xuaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBTdGF0cyBmcm9tIFwiLi4vZGVidWcvU3RhdHNcIjtcbmltcG9ydCBFdmVudERpc3BhdGNoZXIgZnJvbSBcIi4uL2V2ZW50cy9FdmVudERpc3BhdGNoZXJcIjtcbmltcG9ydCBNYXRoVXRpbCBmcm9tIFwiLi4vbWF0aC9NYXRoVXRpbFwiO1xuaW1wb3J0IEludGVncmF0aW9uIGZyb20gXCIuLi9tYXRoL0ludGVncmF0aW9uXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFByb3RvbiB7XG4gIHN0YXRpYyBVU0VfQ0xPQ0sgPSBmYWxzZTtcblxuICAvLyBtZWFzdXJlIDE6MTAwXG4gIHN0YXRpYyBNRUFTVVJFID0gMTAwO1xuICBzdGF0aWMgRVVMRVIgPSBcImV1bGVyXCI7XG4gIHN0YXRpYyBSSzIgPSBcInJ1bmdlLWt1dHRhMlwiO1xuXG4gIC8vIGV2ZW50IG5hbWVcbiAgc3RhdGljIFBBUlRJQ0xFX0NSRUFURUQgPSBcIlBBUlRJQ0xFX0NSRUFURURcIjtcbiAgc3RhdGljIFBBUlRJQ0xFX1VQREFURSA9IFwiUEFSVElDTEVfVVBEQVRFXCI7XG4gIHN0YXRpYyBQQVJUSUNMRV9TTEVFUCA9IFwiUEFSVElDTEVfU0xFRVBcIjtcbiAgc3RhdGljIFBBUlRJQ0xFX0RFQUQgPSBcIlBBUlRJQ0xFX0RFQURcIjtcblxuICBzdGF0aWMgRU1JVFRFUl9BRERFRCA9IFwiRU1JVFRFUl9BRERFRFwiO1xuICBzdGF0aWMgRU1JVFRFUl9SRU1PVkVEID0gXCJFTUlUVEVSX1JFTU9WRURcIjtcblxuICBzdGF0aWMgUFJPVE9OX1VQREFURSA9IFwiUFJPVE9OX1VQREFURVwiO1xuICBzdGF0aWMgUFJPVE9OX1VQREFURV9BRlRFUiA9IFwiUFJPVE9OX1VQREFURV9BRlRFUlwiO1xuICBzdGF0aWMgREVGQVVMVF9JTlRFUlZBTCA9IDAuMDE2NztcblxuICBzdGF0aWMgYW1lbmRDaGFuZ2VUYWJzQnVnID0gdHJ1ZTtcblxuICAvKipcbiAgICogVGhlIGNvbnN0cnVjdG9yIHRvIGFkZCBlbWl0dGVyc1xuICAgKlxuICAgKiBAY29uc3RydWN0b3IgUHJvdG9uXG4gICAqXG4gICAqIEB0b2RvIHByb1BhcnRpY2xlQ291bnQgaXMgbm90IGluIHVzZVxuICAgKiBAdG9kbyBhZGQgbW9yZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBzaW5nbGUgcHJvcGVydGllcyBhbmQgcGFyYW1ldGVyc1xuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gW3Byb1BhcnRpY2xlQ291bnRdIG5vdCBpbiB1c2U/XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbaW50ZWdyYXRpb25UeXBlPVByb3Rvbi5FVUxFUl1cbiAgICpcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IFtpbnRlZ3JhdGlvblR5cGU9UHJvdG9uLkVVTEVSXVxuICAgKiBAcHJvcGVydHkge0FycmF5fSBlbWl0dGVycyAgIEFsbCBhZGRlZCBlbWl0dGVyXG4gICAqIEBwcm9wZXJ0eSB7QXJyYXl9IHJlbmRlcmVycyAgQWxsIGFkZGVkIHJlbmRlcmVyXG4gICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSB0aW1lICAgICAgVGhlIGFjdGl2ZSB0aW1lXG4gICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBvbGR0aW1lICAgVGhlIG9sZCB0aW1lXG4gICAqL1xuICBjb25zdHJ1Y3RvcihpbnRlZ3JhdGlvblR5cGUpIHtcbiAgICB0aGlzLmVtaXR0ZXJzID0gW107XG4gICAgdGhpcy5yZW5kZXJlcnMgPSBbXTtcblxuICAgIHRoaXMudGltZSA9IDA7XG4gICAgdGhpcy5ub3cgPSAwO1xuICAgIHRoaXMudGhlbiA9IDA7XG4gICAgdGhpcy5lbGFwc2VkID0gMDtcblxuICAgIHRoaXMuc3RhdHMgPSBuZXcgU3RhdHModGhpcyk7XG4gICAgdGhpcy5wb29sID0gbmV3IFBvb2woODApO1xuXG4gICAgdGhpcy5pbnRlZ3JhdGlvblR5cGUgPSBVdGlsLmluaXRWYWx1ZShpbnRlZ3JhdGlvblR5cGUsIFByb3Rvbi5FVUxFUik7XG4gICAgdGhpcy5pbnRlZ3JhdG9yID0gbmV3IEludGVncmF0aW9uKHRoaXMuaW50ZWdyYXRpb25UeXBlKTtcblxuICAgIHRoaXMuX2ZwcyA9IFwiYXV0b1wiO1xuICAgIHRoaXMuX2ludGVydmFsID0gUHJvdG9uLkRFRkFVTFRfSU5URVJWQUw7XG4gIH1cblxuICBzZXQgZnBzKGZwcykge1xuICAgIHRoaXMuX2ZwcyA9IGZwcztcbiAgICB0aGlzLl9pbnRlcnZhbCA9IGZwcyA9PT0gXCJhdXRvXCIgPyBQcm90b24uREVGQVVMVF9JTlRFUlZBTCA6IE1hdGhVdGlsLmZsb29yKDEgLyBmcHMsIDcpO1xuICB9XG5cbiAgZ2V0IGZwcygpIHtcbiAgICByZXR1cm4gdGhpcy5fZnBzO1xuICB9XG5cbiAgLyoqXG4gICAqIGFkZCBhIHR5cGUgb2YgUmVuZGVyZXJcbiAgICpcbiAgICogQG1ldGhvZCBhZGRSZW5kZXJlclxuICAgKiBAbWVtYmVyb2YgUHJvdG9uXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1JlbmRlcmVyfSByZW5kZXJcbiAgICovXG4gIGFkZFJlbmRlcmVyKHJlbmRlcikge1xuICAgIHJlbmRlci5pbml0KHRoaXMpO1xuICAgIHRoaXMucmVuZGVyZXJzLnB1c2gocmVuZGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbmFtZSBhZGQgYSB0eXBlIG9mIFJlbmRlcmVyXG4gICAqXG4gICAqIEBtZXRob2QgYWRkUmVuZGVyZXJcbiAgICogQHBhcmFtIHtSZW5kZXJlcn0gcmVuZGVyXG4gICAqL1xuICByZW1vdmVSZW5kZXJlcihyZW5kZXIpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMucmVuZGVyZXJzLmluZGV4T2YocmVuZGVyKTtcbiAgICB0aGlzLnJlbmRlcmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHJlbmRlci5yZW1vdmUodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogYWRkIHRoZSBFbWl0dGVyXG4gICAqXG4gICAqIEBtZXRob2QgYWRkRW1pdHRlclxuICAgKiBAbWVtYmVyb2YgUHJvdG9uXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge0VtaXR0ZXJ9IGVtaXR0ZXJcbiAgICovXG4gIGFkZEVtaXR0ZXIoZW1pdHRlcikge1xuICAgIHRoaXMuZW1pdHRlcnMucHVzaChlbWl0dGVyKTtcbiAgICBlbWl0dGVyLnBhcmVudCA9IHRoaXM7XG5cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoUHJvdG9uLkVNSVRURVJfQURERUQsIGVtaXR0ZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gRW1pdHRlclxuICAgKlxuICAgKiBAbWV0aG9kIHJlbW92ZUVtaXR0ZXJcbiAgICogQG1lbWJlcm9mIFByb3RvblxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uRW1pdHRlcn0gZW1pdHRlclxuICAgKi9cbiAgcmVtb3ZlRW1pdHRlcihlbWl0dGVyKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmVtaXR0ZXJzLmluZGV4T2YoZW1pdHRlcik7XG4gICAgdGhpcy5lbWl0dGVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIGVtaXR0ZXIucGFyZW50ID0gbnVsbDtcblxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChQcm90b24uRU1JVFRFUl9SRU1PVkVELCBlbWl0dGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIGFsbCBhZGRlZCBlbWl0dGVyc1xuICAgKlxuICAgKiBAbWV0aG9kIHVwZGF0ZVxuICAgKiBAbWVtYmVyb2YgUHJvdG9uXG4gICAqIEBpbnN0YW5jZVxuICAgKi9cbiAgdXBkYXRlKCkge1xuICAgIC8vICdhdXRvJyBpcyB0aGUgZGVmYXVsdCBicm93c2VyIHJlZnJlc2ggcmF0ZSwgdGhlIHZhc3QgbWFqb3JpdHkgaXMgNjBmcHNcbiAgICBpZiAodGhpcy5fZnBzID09PSBcImF1dG9cIikge1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFByb3Rvbi5QUk9UT05fVVBEQVRFKTtcblxuICAgICAgaWYgKFByb3Rvbi5VU0VfQ0xPQ0spIHtcbiAgICAgICAgaWYgKCF0aGlzLnRoZW4pIHRoaXMudGhlbiA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICB0aGlzLm5vdyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICB0aGlzLmVsYXBzZWQgPSAodGhpcy5ub3cgLSB0aGlzLnRoZW4pICogMC4wMDE7XG4gICAgICAgIC8vIEZpeCBidWdzIHN1Y2ggYXMgY2hyb21lIGJyb3dzZXIgc3dpdGNoaW5nIHRhYnMgY2F1c2luZyBleGNlc3NpdmUgdGltZSBkaWZmZXJlbmNlXG4gICAgICAgIHRoaXMuYW1lbmRDaGFuZ2VUYWJzQnVnKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuZWxhcHNlZCA+IDApIHRoaXMuZW1pdHRlcnNVcGRhdGUodGhpcy5lbGFwc2VkKTtcbiAgICAgICAgdGhpcy50aGVuID0gdGhpcy5ub3c7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVtaXR0ZXJzVXBkYXRlKFByb3Rvbi5ERUZBVUxUX0lOVEVSVkFMKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFByb3Rvbi5QUk9UT05fVVBEQVRFX0FGVEVSKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgZnBzIGZyYW1lIHJhdGUgaXMgc2V0XG4gICAgZWxzZSB7XG4gICAgICBpZiAoIXRoaXMudGhlbikgdGhpcy50aGVuID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICB0aGlzLm5vdyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgdGhpcy5lbGFwc2VkID0gKHRoaXMubm93IC0gdGhpcy50aGVuKSAqIDAuMDAxO1xuXG4gICAgICBpZiAodGhpcy5lbGFwc2VkID4gdGhpcy5faW50ZXJ2YWwpIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFByb3Rvbi5QUk9UT05fVVBEQVRFKTtcbiAgICAgICAgdGhpcy5lbWl0dGVyc1VwZGF0ZSh0aGlzLl9pbnRlcnZhbCk7XG4gICAgICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE5NzY0MDE4L2NvbnRyb2xsaW5nLWZwcy13aXRoLXJlcXVlc3RhbmltYXRpb25mcmFtZVxuICAgICAgICB0aGlzLnRoZW4gPSB0aGlzLm5vdyAtICh0aGlzLmVsYXBzZWQgJSB0aGlzLl9pbnRlcnZhbCkgKiAxMDAwO1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoUHJvdG9uLlBST1RPTl9VUERBVEVfQUZURVIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGVtaXR0ZXJzVXBkYXRlKGVsYXBzZWQpIHtcbiAgICBsZXQgaSA9IHRoaXMuZW1pdHRlcnMubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pIHRoaXMuZW1pdHRlcnNbaV0udXBkYXRlKGVsYXBzZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBAbWV0aG9kIGFtZW5kQ2hhbmdlVGFic0J1Z1xuICAgKiBAbWVtYmVyb2YgUHJvdG9uXG4gICAqIEBpbnN0YW5jZVxuICAgKi9cbiAgYW1lbmRDaGFuZ2VUYWJzQnVnKCkge1xuICAgIGlmICghUHJvdG9uLmFtZW5kQ2hhbmdlVGFic0J1ZykgcmV0dXJuO1xuICAgIGlmICh0aGlzLmVsYXBzZWQgPiAwLjUpIHtcbiAgICAgIHRoaXMudGhlbiA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgdGhpcy5lbGFwc2VkID0gMDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ291bnRzIGFsbCBwYXJ0aWNsZXMgZnJvbSBhbGwgZW1pdHRlcnNcbiAgICpcbiAgICogQG1ldGhvZCBnZXRDb3VudFxuICAgKiBAbWVtYmVyb2YgUHJvdG9uXG4gICAqIEBpbnN0YW5jZVxuICAgKi9cbiAgZ2V0Q291bnQoKSB7XG4gICAgbGV0IHRvdGFsID0gMDtcbiAgICBsZXQgaSA9IHRoaXMuZW1pdHRlcnMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGktLSkgdG90YWwgKz0gdGhpcy5lbWl0dGVyc1tpXS5wYXJ0aWNsZXMubGVuZ3RoO1xuICAgIHJldHVybiB0b3RhbDtcbiAgfVxuXG4gIGdldEFsbFBhcnRpY2xlcygpIHtcbiAgICBsZXQgcGFydGljbGVzID0gW107XG4gICAgbGV0IGkgPSB0aGlzLmVtaXR0ZXJzLmxlbmd0aDtcblxuICAgIHdoaWxlIChpLS0pIHBhcnRpY2xlcyA9IHBhcnRpY2xlcy5jb25jYXQodGhpcy5lbWl0dGVyc1tpXS5wYXJ0aWNsZXMpO1xuICAgIHJldHVybiBwYXJ0aWNsZXM7XG4gIH1cblxuICBkZXN0cm95QWxsRW1pdHRlcnMoKSB7XG4gICAgVXRpbC5kZXN0cm95QWxsKHRoaXMuZW1pdHRlcnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIGV2ZXJ5dGhpbmcgcmVsYXRlZCB0byB0aGlzIFByb3RvbiBpbnN0YW5jZS4gVGhpcyBpbmNsdWRlcyBhbGwgZW1pdHRlcnMsIGFuZCBhbGwgcHJvcGVydGllc1xuICAgKlxuICAgKiBAbWV0aG9kIGRlc3Ryb3lcbiAgICogQG1lbWJlcm9mIFByb3RvblxuICAgKiBAaW5zdGFuY2VcbiAgICovXG4gIGRlc3Ryb3kocmVtb3ZlID0gZmFsc2UpIHtcbiAgICBjb25zdCBkZXN0cm95T3RoZXIgPSAoKSA9PiB7XG4gICAgICB0aGlzLnRpbWUgPSAwO1xuICAgICAgdGhpcy50aGVuID0gMDtcbiAgICAgIHRoaXMucG9vbC5kZXN0cm95KCk7XG5cbiAgICAgIFV0aWwuZGVzdHJveUFsbCh0aGlzLmVtaXR0ZXJzKTtcbiAgICAgIFV0aWwuZGVzdHJveUFsbCh0aGlzLnJlbmRlcmVycywgdGhpcy5nZXRBbGxQYXJ0aWNsZXMoKSk7XG4gICAgfTtcblxuICAgIGlmIChyZW1vdmUpIHtcbiAgICAgIHNldFRpbWVvdXQoZGVzdHJveU90aGVyLCAyMDApO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXN0cm95T3RoZXIoKTtcbiAgICB9XG4gIH1cbn1cblxuRXZlbnREaXNwYXRjaGVyLmJpbmQoUHJvdG9uKTtcbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFJnYiB7XG4gIGNvbnN0cnVjdG9yKHIgPSAyNTUsIGcgPSAyNTUsIGIgPSAyNTUpIHtcbiAgICB0aGlzLnIgPSByO1xuICAgIHRoaXMuZyA9IGc7XG4gICAgdGhpcy5iID0gYjtcbiAgfVxuXG4gIHJlc2V0KCkge1xuICAgIHRoaXMuciA9IDI1NTtcbiAgICB0aGlzLmcgPSAyNTU7XG4gICAgdGhpcy5iID0gMjU1O1xuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCB7XG4gIGhhc1Byb3AodGFyZ2V0LCBrZXkpIHtcbiAgICBpZiAoIXRhcmdldCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0YXJnZXRba2V5XSAhPT0gdW5kZWZpbmVkO1xuICAgIC8vIHJldHVybiBvYmouaGFzT3duUHJvcGVydHkoa2V5KTtcbiAgfSxcblxuICAvKipcbiAgICogc2V0IHRoZSBwcm90b3R5cGUgaW4gYSBnaXZlbiBwcm90b3R5cGVPYmplY3RcbiAgICpcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uVXRpbFxuICAgKiBAbWV0aG9kIHNldFByb3BcbiAgICpcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uIGZvciBwYXJhbSBgdGFyZ2V0YFxuICAgKiBAdG9kbyB0cmFuc2xhdGUgZGVzcmlwdGlvbiBmcm9tIGNoaW5lc2UgdG8gZW5nbGlzaFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwcm90b3R5cGVPYmplY3QgQW4gb2JqZWN0IG9mIHNpbmdsZSBwcm90b3R5cGVzXG4gICAqXG4gICAqIEByZXR1cm4ge09iamVjdH0gdGFyZ2V0XG4gICAqL1xuICBzZXRQcm9wKHRhcmdldCwgcHJvcHMpIHtcbiAgICBmb3IgKGxldCBwcm9wIGluIHByb3BzKSB7XG4gICAgICBpZiAodGFyZ2V0Lmhhc093blByb3BlcnR5KHByb3ApKSB7XG4gICAgICAgIHRhcmdldFtwcm9wXSA9IFNwYW4uZ2V0U3BhblZhbHVlKHByb3BzW3Byb3BdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9LFxuXG4gIC8qKlxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5VdGlsXG4gICAqIEBtZXRob2Qgc2V0VmVjdG9yVmFsXG4gICAqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvbiBmb3IgcGFyYW0gYHRhcmdldGBcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uIGZvciBwYXJhbSBgY29uZmBcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uIGZvciBmdW5jdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjb25mXG4gICAqL1xuICBzZXRWZWN0b3JWYWwocGFydGljbGUsIGNvbmYgPSBudWxsKSB7XG4gICAgaWYgKCFjb25mKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5oYXNQcm9wKGNvbmYsIFwieFwiKSkgcGFydGljbGUucC54ID0gY29uZltcInhcIl07XG4gICAgaWYgKHRoaXMuaGFzUHJvcChjb25mLCBcInlcIikpIHBhcnRpY2xlLnAueSA9IGNvbmZbXCJ5XCJdO1xuXG4gICAgaWYgKHRoaXMuaGFzUHJvcChjb25mLCBcInZ4XCIpKSBwYXJ0aWNsZS52LnggPSBjb25mW1widnhcIl07XG4gICAgaWYgKHRoaXMuaGFzUHJvcChjb25mLCBcInZ5XCIpKSBwYXJ0aWNsZS52LnkgPSBjb25mW1widnlcIl07XG5cbiAgICBpZiAodGhpcy5oYXNQcm9wKGNvbmYsIFwiYXhcIikpIHBhcnRpY2xlLmEueCA9IGNvbmZbXCJheFwiXTtcbiAgICBpZiAodGhpcy5oYXNQcm9wKGNvbmYsIFwiYXlcIikpIHBhcnRpY2xlLmEueSA9IGNvbmZbXCJheVwiXTtcblxuICAgIGlmICh0aGlzLmhhc1Byb3AoY29uZiwgXCJwXCIpKSBwYXJ0aWNsZS5wLmNvcHkoY29uZltcInBcIl0pO1xuICAgIGlmICh0aGlzLmhhc1Byb3AoY29uZiwgXCJ2XCIpKSBwYXJ0aWNsZS52LmNvcHkoY29uZltcInZcIl0pO1xuICAgIGlmICh0aGlzLmhhc1Byb3AoY29uZiwgXCJhXCIpKSBwYXJ0aWNsZS5hLmNvcHkoY29uZltcImFcIl0pO1xuXG4gICAgaWYgKHRoaXMuaGFzUHJvcChjb25mLCBcInBvc2l0aW9uXCIpKSBwYXJ0aWNsZS5wLmNvcHkoY29uZltcInBvc2l0aW9uXCJdKTtcbiAgICBpZiAodGhpcy5oYXNQcm9wKGNvbmYsIFwidmVsb2NpdHlcIikpIHBhcnRpY2xlLnYuY29weShjb25mW1widmVsb2NpdHlcIl0pO1xuICAgIGlmICh0aGlzLmhhc1Byb3AoY29uZiwgXCJhY2NlbGVyYXRlXCIpKSBwYXJ0aWNsZS5hLmNvcHkoY29uZltcImFjY2VsZXJhdGVcIl0pO1xuICB9XG59O1xuIiwiaW1wb3J0IE1hdGhVdGlsIGZyb20gXCIuL01hdGhVdGlsXCI7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZWFzZUxpbmVhcih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSxcblxuICBlYXNlSW5RdWFkKHZhbHVlKSB7XG4gICAgcmV0dXJuIE1hdGgucG93KHZhbHVlLCAyKTtcbiAgfSxcblxuICBlYXNlT3V0UXVhZCh2YWx1ZSkge1xuICAgIHJldHVybiAtKE1hdGgucG93KHZhbHVlIC0gMSwgMikgLSAxKTtcbiAgfSxcblxuICBlYXNlSW5PdXRRdWFkKHZhbHVlKSB7XG4gICAgaWYgKCh2YWx1ZSAvPSAwLjUpIDwgMSkgcmV0dXJuIDAuNSAqIE1hdGgucG93KHZhbHVlLCAyKTtcblxuICAgIHJldHVybiAtMC41ICogKCh2YWx1ZSAtPSAyKSAqIHZhbHVlIC0gMik7XG4gIH0sXG5cbiAgZWFzZUluQ3ViaWModmFsdWUpIHtcbiAgICByZXR1cm4gTWF0aC5wb3codmFsdWUsIDMpO1xuICB9LFxuXG4gIGVhc2VPdXRDdWJpYyh2YWx1ZSkge1xuICAgIHJldHVybiBNYXRoLnBvdyh2YWx1ZSAtIDEsIDMpICsgMTtcbiAgfSxcblxuICBlYXNlSW5PdXRDdWJpYyh2YWx1ZSkge1xuICAgIGlmICgodmFsdWUgLz0gMC41KSA8IDEpIHJldHVybiAwLjUgKiBNYXRoLnBvdyh2YWx1ZSwgMyk7XG5cbiAgICByZXR1cm4gMC41ICogKE1hdGgucG93KHZhbHVlIC0gMiwgMykgKyAyKTtcbiAgfSxcblxuICBlYXNlSW5RdWFydCh2YWx1ZSkge1xuICAgIHJldHVybiBNYXRoLnBvdyh2YWx1ZSwgNCk7XG4gIH0sXG5cbiAgZWFzZU91dFF1YXJ0KHZhbHVlKSB7XG4gICAgcmV0dXJuIC0oTWF0aC5wb3codmFsdWUgLSAxLCA0KSAtIDEpO1xuICB9LFxuXG4gIGVhc2VJbk91dFF1YXJ0KHZhbHVlKSB7XG4gICAgaWYgKCh2YWx1ZSAvPSAwLjUpIDwgMSkgcmV0dXJuIDAuNSAqIE1hdGgucG93KHZhbHVlLCA0KTtcblxuICAgIHJldHVybiAtMC41ICogKCh2YWx1ZSAtPSAyKSAqIE1hdGgucG93KHZhbHVlLCAzKSAtIDIpO1xuICB9LFxuXG4gIGVhc2VJblNpbmUodmFsdWUpIHtcbiAgICByZXR1cm4gLU1hdGguY29zKHZhbHVlICogTWF0aFV0aWwuUElfMikgKyAxO1xuICB9LFxuXG4gIGVhc2VPdXRTaW5lKHZhbHVlKSB7XG4gICAgcmV0dXJuIE1hdGguc2luKHZhbHVlICogTWF0aFV0aWwuUElfMik7XG4gIH0sXG5cbiAgZWFzZUluT3V0U2luZSh2YWx1ZSkge1xuICAgIHJldHVybiAtMC41ICogKE1hdGguY29zKE1hdGguUEkgKiB2YWx1ZSkgLSAxKTtcbiAgfSxcblxuICBlYXNlSW5FeHBvKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gMCA6IE1hdGgucG93KDIsIDEwICogKHZhbHVlIC0gMSkpO1xuICB9LFxuXG4gIGVhc2VPdXRFeHBvKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAxID8gMSA6IC1NYXRoLnBvdygyLCAtMTAgKiB2YWx1ZSkgKyAxO1xuICB9LFxuXG4gIGVhc2VJbk91dEV4cG8odmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT09IDApIHJldHVybiAwO1xuXG4gICAgaWYgKHZhbHVlID09PSAxKSByZXR1cm4gMTtcblxuICAgIGlmICgodmFsdWUgLz0gMC41KSA8IDEpIHJldHVybiAwLjUgKiBNYXRoLnBvdygyLCAxMCAqICh2YWx1ZSAtIDEpKTtcblxuICAgIHJldHVybiAwLjUgKiAoLU1hdGgucG93KDIsIC0xMCAqIC0tdmFsdWUpICsgMik7XG4gIH0sXG5cbiAgZWFzZUluQ2lyYyh2YWx1ZSkge1xuICAgIHJldHVybiAtKE1hdGguc3FydCgxIC0gdmFsdWUgKiB2YWx1ZSkgLSAxKTtcbiAgfSxcblxuICBlYXNlT3V0Q2lyYyh2YWx1ZSkge1xuICAgIHJldHVybiBNYXRoLnNxcnQoMSAtIE1hdGgucG93KHZhbHVlIC0gMSwgMikpO1xuICB9LFxuXG4gIGVhc2VJbk91dENpcmModmFsdWUpIHtcbiAgICBpZiAoKHZhbHVlIC89IDAuNSkgPCAxKSByZXR1cm4gLTAuNSAqIChNYXRoLnNxcnQoMSAtIHZhbHVlICogdmFsdWUpIC0gMSk7XG4gICAgcmV0dXJuIDAuNSAqIChNYXRoLnNxcnQoMSAtICh2YWx1ZSAtPSAyKSAqIHZhbHVlKSArIDEpO1xuICB9LFxuXG4gIGVhc2VJbkJhY2sodmFsdWUpIHtcbiAgICBsZXQgcyA9IDEuNzAxNTg7XG4gICAgcmV0dXJuIHZhbHVlICogdmFsdWUgKiAoKHMgKyAxKSAqIHZhbHVlIC0gcyk7XG4gIH0sXG5cbiAgZWFzZU91dEJhY2sodmFsdWUpIHtcbiAgICBsZXQgcyA9IDEuNzAxNTg7XG4gICAgcmV0dXJuICh2YWx1ZSA9IHZhbHVlIC0gMSkgKiB2YWx1ZSAqICgocyArIDEpICogdmFsdWUgKyBzKSArIDE7XG4gIH0sXG5cbiAgZWFzZUluT3V0QmFjayh2YWx1ZSkge1xuICAgIGxldCBzID0gMS43MDE1ODtcbiAgICBpZiAoKHZhbHVlIC89IDAuNSkgPCAxKSByZXR1cm4gMC41ICogKHZhbHVlICogdmFsdWUgKiAoKChzICo9IDEuNTI1KSArIDEpICogdmFsdWUgLSBzKSk7XG4gICAgcmV0dXJuIDAuNSAqICgodmFsdWUgLT0gMikgKiB2YWx1ZSAqICgoKHMgKj0gMS41MjUpICsgMSkgKiB2YWx1ZSArIHMpICsgMik7XG4gIH0sXG5cbiAgZ2V0RWFzaW5nKGVhc2UpIHtcbiAgICBpZiAodHlwZW9mIGVhc2UgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGVhc2U7XG4gICAgZWxzZSByZXR1cm4gdGhpc1tlYXNlXSB8fCB0aGlzLmVhc2VMaW5lYXI7XG4gIH1cbn07XG4iLCJpbXBvcnQgTWF0aFV0aWwgZnJvbSBcIi4uL21hdGgvTWF0aFV0aWxcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVjdG9yMkQge1xuICBjb25zdHJ1Y3Rvcih4LCB5KSB7XG4gICAgdGhpcy54ID0geCB8fCAwO1xuICAgIHRoaXMueSA9IHkgfHwgMDtcbiAgfVxuXG4gIHNldCh4LCB5KSB7XG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0WCh4KSB7XG4gICAgdGhpcy54ID0geDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldFkoeSkge1xuICAgIHRoaXMueSA9IHk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBnZXRHcmFkaWVudCgpIHtcbiAgICBpZiAodGhpcy54ICE9PSAwKSByZXR1cm4gTWF0aC5hdGFuMih0aGlzLnksIHRoaXMueCk7XG4gICAgZWxzZSBpZiAodGhpcy55ID4gMCkgcmV0dXJuIE1hdGhVdGlsLlBJXzI7XG4gICAgZWxzZSBpZiAodGhpcy55IDwgMCkgcmV0dXJuIC1NYXRoVXRpbC5QSV8yO1xuICB9XG5cbiAgY29weSh2KSB7XG4gICAgdGhpcy54ID0gdi54O1xuICAgIHRoaXMueSA9IHYueTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkKHYsIHcpIHtcbiAgICBpZiAodyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5hZGRWZWN0b3JzKHYsIHcpO1xuICAgIH1cblxuICAgIHRoaXMueCArPSB2Lng7XG4gICAgdGhpcy55ICs9IHYueTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkWFkoYSwgYikge1xuICAgIHRoaXMueCArPSBhO1xuICAgIHRoaXMueSArPSBiO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRWZWN0b3JzKGEsIGIpIHtcbiAgICB0aGlzLnggPSBhLnggKyBiLng7XG4gICAgdGhpcy55ID0gYS55ICsgYi55O1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzdWIodiwgdykge1xuICAgIGlmICh3ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnN1YlZlY3RvcnModiwgdyk7XG4gICAgfVxuXG4gICAgdGhpcy54IC09IHYueDtcbiAgICB0aGlzLnkgLT0gdi55O1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzdWJWZWN0b3JzKGEsIGIpIHtcbiAgICB0aGlzLnggPSBhLnggLSBiLng7XG4gICAgdGhpcy55ID0gYS55IC0gYi55O1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBkaXZpZGVTY2FsYXIocykge1xuICAgIGlmIChzICE9PSAwKSB7XG4gICAgICB0aGlzLnggLz0gcztcbiAgICAgIHRoaXMueSAvPSBzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldCgwLCAwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG11bHRpcGx5U2NhbGFyKHMpIHtcbiAgICB0aGlzLnggKj0gcztcbiAgICB0aGlzLnkgKj0gcztcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbmVnYXRlKCkge1xuICAgIHJldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKC0xKTtcbiAgfVxuXG4gIGRvdCh2KSB7XG4gICAgcmV0dXJuIHRoaXMueCAqIHYueCArIHRoaXMueSAqIHYueTtcbiAgfVxuXG4gIGxlbmd0aFNxKCkge1xuICAgIHJldHVybiB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnk7XG4gIH1cblxuICBsZW5ndGgoKSB7XG4gICAgcmV0dXJuIE1hdGguc3FydCh0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkpO1xuICB9XG5cbiAgbm9ybWFsaXplKCkge1xuICAgIHJldHVybiB0aGlzLmRpdmlkZVNjYWxhcih0aGlzLmxlbmd0aCgpKTtcbiAgfVxuXG4gIGRpc3RhbmNlVG8odikge1xuICAgIHJldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVRvU3F1YXJlZCh2KSk7XG4gIH1cblxuICByb3RhdGUodGhhKSB7XG4gICAgY29uc3QgeCA9IHRoaXMueDtcbiAgICBjb25zdCB5ID0gdGhpcy55O1xuXG4gICAgdGhpcy54ID0geCAqIE1hdGguY29zKHRoYSkgKyB5ICogTWF0aC5zaW4odGhhKTtcbiAgICB0aGlzLnkgPSAteCAqIE1hdGguc2luKHRoYSkgKyB5ICogTWF0aC5jb3ModGhhKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZGlzdGFuY2VUb1NxdWFyZWQodikge1xuICAgIGNvbnN0IGR4ID0gdGhpcy54IC0gdi54O1xuICAgIGNvbnN0IGR5ID0gdGhpcy55IC0gdi55O1xuXG4gICAgcmV0dXJuIGR4ICogZHggKyBkeSAqIGR5O1xuICB9XG5cbiAgbGVycCh2LCBhbHBoYSkge1xuICAgIHRoaXMueCArPSAodi54IC0gdGhpcy54KSAqIGFscGhhO1xuICAgIHRoaXMueSArPSAodi55IC0gdGhpcy55KSAqIGFscGhhO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBlcXVhbHModikge1xuICAgIHJldHVybiB2LnggPT09IHRoaXMueCAmJiB2LnkgPT09IHRoaXMueTtcbiAgfVxuXG4gIGNsZWFyKCkge1xuICAgIHRoaXMueCA9IDAuMDtcbiAgICB0aGlzLnkgPSAwLjA7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBjbG9uZSgpIHtcbiAgICByZXR1cm4gbmV3IFZlY3RvcjJEKHRoaXMueCwgdGhpcy55KTtcbiAgfVxufVxuIiwiLyoqIEB0eXBlZGVmIHtpbXBvcnQoJy4uL2JlaGF2aW91ci9CZWhhdmlvdXInKX0gQmVoYXZpb3VyICovXG4vKiogQHR5cGVkZWYge2ltcG9ydCgnLi4vbWF0aC9WZWN0b3IyRCcpfSBWZWN0b3IyRCAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoJy4uL3V0aWxzL1JnYicpfSBSZ2IgKi9cbmltcG9ydCBSZ2IgZnJvbSBcIi4uL3V0aWxzL1JnYlwiO1xuaW1wb3J0IFB1aWQgZnJvbSBcIi4uL3V0aWxzL1B1aWRcIjtcbmltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgUHJvcFV0aWwgZnJvbSBcIi4uL3V0aWxzL1Byb3BVdGlsXCI7XG5pbXBvcnQgZWFzZSBmcm9tIFwiLi4vbWF0aC9lYXNlXCI7XG5pbXBvcnQgVmVjdG9yMkQgZnJvbSBcIi4uL21hdGgvVmVjdG9yMkRcIjtcbmltcG9ydCBNYXRoVXRpbCBmcm9tIFwiLi4vbWF0aC9NYXRoVXRpbFwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYXJ0aWNsZSB7XG4gIC8qKiBAdHlwZSBzdHJpbmcgKi9cbiAgaWQgPSBcIlwiO1xuXG4gIC8qKiBAdHlwZSB7e3A6VmVjdG9yMkQsdjpWZWN0b3IyRCxhOlZlY3RvcjJEfX0gKi9cbiAgb2xkID0ge307XG5cbiAgLyoqIEB0eXBlIHtvYmplY3R9ICovXG4gIGRhdGEgPSB7fTtcblxuICAvKiogQHR5cGUge0JlaGF2aW91cltdfSAqL1xuICBiZWhhdmlvdXJzID0gW107XG5cbiAgLyoqIEB0eXBlIHtWZWN0b3IyRH0gKi9cbiAgcCA9IFtdO1xuXG4gIC8qKiBAdHlwZSB7VmVjdG9yMkR9ICovXG4gIHYgPSBbXTtcblxuICAvKiogQHR5cGUge1ZlY3RvcjJEfSAqL1xuICBhID0gW107XG5cbiAgLyoqIEB0eXBlIHtSZ2J9ICovXG4gIHJnYiA9IHt9O1xuXG4gIC8qKlxuICAgKiB0aGUgUGFydGljbGUgY2xhc3NcbiAgICpcbiAgICogQGNsYXNzIFByb3Rvbi5QYXJ0aWNsZVxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtPYmplY3R9IHBPYmogdGhlIHBhcmFtZXRlcnMgb2JqZWN0O1xuICAgKiBmb3IgZXhhbXBsZSB7bGlmZTozLGRlYWQ6ZmFsc2V9XG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb25mKSB7XG4gICAgLyoqXG4gICAgICogVGhlIHBhcnRpY2xlJ3MgaWQ7XG4gICAgICogQHByb3BlcnR5IGlkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLm5hbWUgPSBcIlBhcnRpY2xlXCI7XG4gICAgdGhpcy5pZCA9IFB1aWQuaWQodGhpcy5uYW1lKTtcbiAgICB0aGlzLm9sZCA9IHt9O1xuICAgIHRoaXMuZGF0YSA9IHt9O1xuICAgIHRoaXMuYmVoYXZpb3VycyA9IFtdO1xuXG4gICAgdGhpcy5wID0gbmV3IFZlY3RvcjJEKCk7XG4gICAgdGhpcy52ID0gbmV3IFZlY3RvcjJEKCk7XG4gICAgdGhpcy5hID0gbmV3IFZlY3RvcjJEKCk7XG4gICAgdGhpcy5vbGQucCA9IG5ldyBWZWN0b3IyRCgpO1xuICAgIHRoaXMub2xkLnYgPSBuZXcgVmVjdG9yMkQoKTtcbiAgICB0aGlzLm9sZC5hID0gbmV3IFZlY3RvcjJEKCk7XG5cbiAgICB0aGlzLnJnYiA9IG5ldyBSZ2IoKTtcbiAgICB0aGlzLnJlc2V0KCk7XG4gICAgY29uZiAmJiBQcm9wVXRpbC5zZXRQcm9wKHRoaXMsIGNvbmYpO1xuICB9XG5cbiAgZ2V0RGlyZWN0aW9uKCkge1xuICAgIHJldHVybiBNYXRoLmF0YW4yKHRoaXMudi54LCAtdGhpcy52LnkpICogTWF0aFV0aWwuTjE4MF9QSTtcbiAgfVxuXG4gIHJlc2V0KCkge1xuICAgIHRoaXMubGlmZSA9IEluZmluaXR5O1xuICAgIHRoaXMuYWdlID0gMDtcblxuICAgIHRoaXMuZGVhZCA9IGZhbHNlO1xuICAgIHRoaXMuc2xlZXAgPSBmYWxzZTtcbiAgICB0aGlzLmJvZHkgPSBudWxsO1xuICAgIHRoaXMuc3ByaXRlID0gbnVsbDtcbiAgICB0aGlzLnBhcmVudCA9IG51bGw7XG5cbiAgICB0aGlzLmVuZXJneSA9IDE7IC8vIEVuZXJneSBMb3NzXG4gICAgdGhpcy5tYXNzID0gMTtcbiAgICB0aGlzLnJhZGl1cyA9IDEwO1xuICAgIHRoaXMuYWxwaGEgPSAxO1xuICAgIHRoaXMuc2NhbGUgPSAxO1xuICAgIHRoaXMucm90YXRpb24gPSAwO1xuICAgIHRoaXMuY29sb3IgPSBudWxsO1xuXG4gICAgdGhpcy5wLnNldCgwLCAwKTtcbiAgICB0aGlzLnYuc2V0KDAsIDApO1xuICAgIHRoaXMuYS5zZXQoMCwgMCk7XG4gICAgdGhpcy5vbGQucC5zZXQoMCwgMCk7XG4gICAgdGhpcy5vbGQudi5zZXQoMCwgMCk7XG4gICAgdGhpcy5vbGQuYS5zZXQoMCwgMCk7XG4gICAgdGhpcy5lYXNpbmcgPSBlYXNlLmVhc2VMaW5lYXI7XG5cbiAgICB0aGlzLnJnYi5yZXNldCgpO1xuICAgIFV0aWwuZW1wdHlPYmplY3QodGhpcy5kYXRhKTtcbiAgICB0aGlzLnJlbW92ZUFsbEJlaGF2aW91cnMoKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdXBkYXRlKHRpbWUsIGluZGV4KSB7XG4gICAgaWYgKCF0aGlzLnNsZWVwKSB7XG4gICAgICB0aGlzLmFnZSArPSB0aW1lO1xuICAgICAgdGhpcy5hcHBseUJlaGF2aW91cnModGltZSwgaW5kZXgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmFnZSA8IHRoaXMubGlmZSkge1xuICAgICAgY29uc3Qgc2NhbGUgPSB0aGlzLmVhc2luZyh0aGlzLmFnZSAvIHRoaXMubGlmZSk7XG4gICAgICB0aGlzLmVuZXJneSA9IE1hdGgubWF4KDEgLSBzY2FsZSwgMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIGFwcGx5QmVoYXZpb3Vycyh0aW1lLCBpbmRleCkge1xuICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMuYmVoYXZpb3Vycy5sZW5ndGg7XG4gICAgbGV0IGk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuYmVoYXZpb3Vyc1tpXSAmJiB0aGlzLmJlaGF2aW91cnNbaV0uYXBwbHlCZWhhdmlvdXIodGhpcywgdGltZSwgaW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0JlaGF2aW91cn0gYmVoYXZpb3VyXG4gICAqL1xuICBhZGRCZWhhdmlvdXIoYmVoYXZpb3VyKSB7XG4gICAgdGhpcy5iZWhhdmlvdXJzLnB1c2goYmVoYXZpb3VyKTtcblxuICAgIGlmIChiZWhhdmlvdXIuaGFzT3duUHJvcGVydHkoXCJwYXJlbnRzXCIpKSBiZWhhdmlvdXIucGFyZW50cy5wdXNoKHRoaXMpO1xuICAgIGJlaGF2aW91ci5pbml0aWFsaXplKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7QmVoYXZpb3VyW119IGJlaGF2aW91cnNcbiAgICovXG4gIGFkZEJlaGF2aW91cnMoYmVoYXZpb3Vycykge1xuICAgIGNvbnN0IGxlbmd0aCA9IGJlaGF2aW91cnMubGVuZ3RoO1xuICAgIGxldCBpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmFkZEJlaGF2aW91cihiZWhhdmlvdXJzW2ldKTtcbiAgICB9XG4gIH1cblxuICByZW1vdmVCZWhhdmlvdXIoYmVoYXZpb3VyKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmJlaGF2aW91cnMuaW5kZXhPZihiZWhhdmlvdXIpO1xuXG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIGNvbnN0IGJlaGF2aW91ciA9IHRoaXMuYmVoYXZpb3Vycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgYmVoYXZpb3VyLnBhcmVudHMgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZUFsbEJlaGF2aW91cnMoKSB7XG4gICAgVXRpbC5lbXB0eUFycmF5KHRoaXMuYmVoYXZpb3Vycyk7XG4gIH1cblxuICAvKipcbiAgICogRGVzdG9yeSB0aGlzIHBhcnRpY2xlXG4gICAqIEBtZXRob2QgZGVzdHJveVxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLnJlbW92ZUFsbEJlaGF2aW91cnMoKTtcbiAgICB0aGlzLmVuZXJneSA9IDA7XG4gICAgdGhpcy5kZWFkID0gdHJ1ZTtcbiAgICB0aGlzLnBhcmVudCA9IG51bGw7XG4gIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IHtcbiAgLyoqXG4gICAqIEB0eXBlZGVmICB7T2JqZWN0fSByZ2JPYmplY3RcbiAgICogQHByb3BlcnR5IHtOdW1iZXJ9IHIgcmVkIHZhbHVlXG4gICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBnIGdyZWVuIHZhbHVlXG4gICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBiIGJsdWUgdmFsdWVcbiAgICovXG4gIC8qKlxuICAgKiBjb252ZXJ0cyBhIGhleCB2YWx1ZSB0byBhIHJnYiBvYmplY3RcbiAgICpcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uVXRpbFxuICAgKiBAbWV0aG9kIGhleFRvUmdiXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBoIGFueSBoZXggdmFsdWUsIGUuZy4gIzAwMDAwMCBvciAwMDAwMDAgZm9yIGJsYWNrXG4gICAqXG4gICAqIEByZXR1cm4ge3JnYk9iamVjdH1cbiAgICovXG4gIGhleFRvUmdiKGgpIHtcbiAgICBjb25zdCBoZXgxNiA9IGguY2hhckF0KDApID09PSBcIiNcIiA/IGguc3Vic3RyaW5nKDEsIDcpIDogaDtcbiAgICBjb25zdCByID0gcGFyc2VJbnQoaGV4MTYuc3Vic3RyaW5nKDAsIDIpLCAxNik7XG4gICAgY29uc3QgZyA9IHBhcnNlSW50KGhleDE2LnN1YnN0cmluZygyLCA0KSwgMTYpO1xuICAgIGNvbnN0IGIgPSBwYXJzZUludChoZXgxNi5zdWJzdHJpbmcoNCwgNiksIDE2KTtcblxuICAgIHJldHVybiB7IHIsIGcsIGIgfTtcbiAgfSxcblxuICAvKipcbiAgICogY29udmVydHMgYSByZ2IgdmFsdWUgdG8gYSByZ2Igc3RyaW5nXG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlV0aWxcbiAgICogQG1ldGhvZCByZ2JUb0hleFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdCB8IFByb3Rvbi5oZXhUb1JnYn0gcmdiIGEgcmdiIG9iamVjdCBsaWtlIGluIHtAbGluayBQcm90b24jUHJvdG9uLn1cbiAgICpcbiAgICogQHJldHVybiB7U3RyaW5nfSByZ2IoKVxuICAgKi9cbiAgcmdiVG9IZXgocmJnKSB7XG4gICAgcmV0dXJuIGByZ2IoJHtyYmcucn0sICR7cmJnLmd9LCAke3JiZy5ifSlgO1xuICB9LFxuXG4gIGdldEhleDE2RnJvbVBhcnRpY2xlKHApIHtcbiAgICByZXR1cm4gTnVtYmVyKHAucmdiLnIpICogNjU1MzYgKyBOdW1iZXIocC5yZ2IuZykgKiAyNTYgKyBOdW1iZXIocC5yZ2IuYik7XG4gIH1cbn07XG4iLCJpbXBvcnQgVmVjdG9yMkQgZnJvbSBcIi4vVmVjdG9yMkRcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUG9sYXIyRCB7XG4gIGNvbnN0cnVjdG9yKHIsIHRoYSkge1xuICAgIHRoaXMuciA9IE1hdGguYWJzKHIpIHx8IDA7XG4gICAgdGhpcy50aGEgPSB0aGEgfHwgMDtcbiAgfVxuXG4gIHNldChyLCB0aGEpIHtcbiAgICB0aGlzLnIgPSByO1xuICAgIHRoaXMudGhhID0gdGhhO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0UihyKSB7XG4gICAgdGhpcy5yID0gcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldFRoYSh0aGEpIHtcbiAgICB0aGlzLnRoYSA9IHRoYTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGNvcHkocCkge1xuICAgIHRoaXMuciA9IHAucjtcbiAgICB0aGlzLnRoYSA9IHAudGhhO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdG9WZWN0b3IoKSB7XG4gICAgcmV0dXJuIG5ldyBWZWN0b3IyRCh0aGlzLmdldFgoKSwgdGhpcy5nZXRZKCkpO1xuICB9XG5cbiAgZ2V0WCgpIHtcbiAgICByZXR1cm4gdGhpcy5yICogTWF0aC5zaW4odGhpcy50aGEpO1xuICB9XG5cbiAgZ2V0WSgpIHtcbiAgICByZXR1cm4gLXRoaXMuciAqIE1hdGguY29zKHRoaXMudGhhKTtcbiAgfVxuXG4gIG5vcm1hbGl6ZSgpIHtcbiAgICB0aGlzLnIgPSAxO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZXF1YWxzKHYpIHtcbiAgICByZXR1cm4gdi5yID09PSB0aGlzLnIgJiYgdi50aGEgPT09IHRoaXMudGhhO1xuICB9XG5cbiAgY2xlYXIoKSB7XG4gICAgdGhpcy5yID0gMC4wO1xuICAgIHRoaXMudGhhID0gMC4wO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgY2xvbmUoKSB7XG4gICAgcmV0dXJuIG5ldyBQb2xhcjJEKHRoaXMuciwgdGhpcy50aGEpO1xuICB9XG59XG4iLCJjb25zdCBNYXQzID0ge1xuICBjcmVhdGUobWF0Mykge1xuICAgIGNvbnN0IG1hdCA9IG5ldyBGbG9hdDMyQXJyYXkoOSk7XG4gICAgaWYgKG1hdDMpIHRoaXMuc2V0KG1hdDMsIG1hdCk7XG5cbiAgICByZXR1cm4gbWF0O1xuICB9LFxuXG4gIHNldChtYXQxLCBtYXQyKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA5OyBpKyspIG1hdDJbaV0gPSBtYXQxW2ldO1xuXG4gICAgcmV0dXJuIG1hdDI7XG4gIH0sXG5cbiAgbXVsdGlwbHkobWF0LCBtYXQyLCBtYXQzKSB7XG4gICAgbGV0IGEwMCA9IG1hdFswXSxcbiAgICAgIGEwMSA9IG1hdFsxXSxcbiAgICAgIGEwMiA9IG1hdFsyXSxcbiAgICAgIGExMCA9IG1hdFszXSxcbiAgICAgIGExMSA9IG1hdFs0XSxcbiAgICAgIGEyMCA9IG1hdFs2XSxcbiAgICAgIGEyMSA9IG1hdFs3XSxcbiAgICAgIGIwMCA9IG1hdDJbMF0sXG4gICAgICBiMDEgPSBtYXQyWzFdLFxuICAgICAgYjAyID0gbWF0MlsyXSxcbiAgICAgIGIxMCA9IG1hdDJbM10sXG4gICAgICBiMTEgPSBtYXQyWzRdLFxuICAgICAgYjIwID0gbWF0Mls2XSxcbiAgICAgIGIyMSA9IG1hdDJbN107XG5cbiAgICBtYXQzWzBdID0gYjAwICogYTAwICsgYjAxICogYTEwO1xuICAgIG1hdDNbMV0gPSBiMDAgKiBhMDEgKyBiMDEgKiBhMTE7XG4gICAgbWF0M1syXSA9IGEwMiAqIGIwMjtcbiAgICBtYXQzWzNdID0gYjEwICogYTAwICsgYjExICogYTEwO1xuICAgIG1hdDNbNF0gPSBiMTAgKiBhMDEgKyBiMTEgKiBhMTE7XG4gICAgbWF0M1s2XSA9IGIyMCAqIGEwMCArIGIyMSAqIGExMCArIGEyMDtcbiAgICBtYXQzWzddID0gYjIwICogYTAxICsgYjIxICogYTExICsgYTIxO1xuXG4gICAgcmV0dXJuIG1hdDM7XG4gIH0sXG5cbiAgaW52ZXJzZShtYXQsIG1hdDMpIHtcbiAgICBsZXQgYTAwID0gbWF0WzBdLFxuICAgICAgYTAxID0gbWF0WzFdLFxuICAgICAgYTEwID0gbWF0WzNdLFxuICAgICAgYTExID0gbWF0WzRdLFxuICAgICAgYTIwID0gbWF0WzZdLFxuICAgICAgYTIxID0gbWF0WzddLFxuICAgICAgYjAxID0gYTExLFxuICAgICAgYjExID0gLWExMCxcbiAgICAgIGIyMSA9IGEyMSAqIGExMCAtIGExMSAqIGEyMCxcbiAgICAgIGQgPSBhMDAgKiBiMDEgKyBhMDEgKiBiMTEsXG4gICAgICBpZDtcblxuICAgIGlkID0gMSAvIGQ7XG4gICAgbWF0M1swXSA9IGIwMSAqIGlkO1xuICAgIG1hdDNbMV0gPSAtYTAxICogaWQ7XG4gICAgbWF0M1szXSA9IGIxMSAqIGlkO1xuICAgIG1hdDNbNF0gPSBhMDAgKiBpZDtcbiAgICBtYXQzWzZdID0gYjIxICogaWQ7XG4gICAgbWF0M1s3XSA9ICgtYTIxICogYTAwICsgYTAxICogYTIwKSAqIGlkO1xuXG4gICAgcmV0dXJuIG1hdDM7XG4gIH0sXG5cbiAgbXVsdGlwbHlWZWMyKG0sIHZlYywgbWF0Mykge1xuICAgIGxldCB4ID0gdmVjWzBdLFxuICAgICAgeSA9IHZlY1sxXTtcblxuICAgIG1hdDNbMF0gPSB4ICogbVswXSArIHkgKiBtWzNdICsgbVs2XTtcbiAgICBtYXQzWzFdID0geCAqIG1bMV0gKyB5ICogbVs0XSArIG1bN107XG5cbiAgICByZXR1cm4gbWF0MztcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgTWF0MztcbiIsImltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgTWF0aFV0aWwgZnJvbSBcIi4uL21hdGgvTWF0aFV0aWxcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3BhbiB7XG4gIGNvbnN0cnVjdG9yKGEsIGIsIGNlbnRlcikge1xuICAgIGlmIChVdGlsLmlzQXJyYXkoYSkpIHtcbiAgICAgIHRoaXMuaXNBcnJheSA9IHRydWU7XG4gICAgICB0aGlzLmEgPSBhO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlzQXJyYXkgPSBmYWxzZTtcbiAgICAgIHRoaXMuYSA9IFV0aWwuaW5pdFZhbHVlKGEsIDEpO1xuICAgICAgdGhpcy5iID0gVXRpbC5pbml0VmFsdWUoYiwgdGhpcy5hKTtcbiAgICAgIHRoaXMuY2VudGVyID0gVXRpbC5pbml0VmFsdWUoY2VudGVyLCBmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0VmFsdWUoaXNJbnQgPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLmlzQXJyYXkpIHtcbiAgICAgIHJldHVybiBVdGlsLmdldFJhbmRGcm9tQXJyYXkodGhpcy5hKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCF0aGlzLmNlbnRlcikge1xuICAgICAgICByZXR1cm4gTWF0aFV0aWwucmFuZG9tQVRvQih0aGlzLmEsIHRoaXMuYiwgaXNJbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIE1hdGhVdGlsLnJhbmRvbUZsb2F0aW5nKHRoaXMuYSwgdGhpcy5iLCBpc0ludCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBuZXcgU3BhbiBvYmplY3RcbiAgICpcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uVXRpbFxuICAgKiBAbWV0aG9kIHNldFNwYW5WYWx1ZVxuICAgKlxuICAgKiBAdG9kbyBhLCBiIGFuZCBjIHNob3VsZCBiZSAnTWl4ZWQnIG9yICdOdW1iZXInP1xuICAgKlxuICAgKiBAcGFyYW0ge01peGVkIHwgU3Bhbn0gYVxuICAgKiBAcGFyYW0ge01peGVkfSAgICAgICAgICAgICAgIGJcbiAgICogQHBhcmFtIHtNaXhlZH0gICAgICAgICAgICAgICBjXG4gICAqXG4gICAqIEByZXR1cm4ge1NwYW59XG4gICAqL1xuICBzdGF0aWMgc2V0U3BhblZhbHVlKGEsIGIsIGMpIHtcbiAgICBpZiAoYSBpbnN0YW5jZW9mIFNwYW4pIHtcbiAgICAgIHJldHVybiBhO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBuZXcgU3BhbihhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChjID09PSB1bmRlZmluZWQpIHJldHVybiBuZXcgU3BhbihhLCBiKTtcbiAgICAgICAgZWxzZSByZXR1cm4gbmV3IFNwYW4oYSwgYiwgYyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHZhbHVlIGZyb20gYSBTcGFuLCBpZiB0aGUgcGFyYW0gaXMgbm90IGEgU3BhbiBpdCB3aWxsIHJldHVybiB0aGUgZ2l2ZW4gcGFyYW1ldGVyXG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlV0aWxcbiAgICogQG1ldGhvZCBnZXRWYWx1ZVxuICAgKlxuICAgKiBAcGFyYW0ge01peGVkIHwgU3Bhbn0gcGFuXG4gICAqXG4gICAqIEByZXR1cm4ge01peGVkfSB0aGUgdmFsdWUgb2YgU3BhbiBPUiB0aGUgcGFyYW1ldGVyIGlmIGl0IGlzIG5vdCBhIFNwYW5cbiAgICovXG4gIHN0YXRpYyBnZXRTcGFuVmFsdWUocGFuKSB7XG4gICAgcmV0dXJuIHBhbiBpbnN0YW5jZW9mIFNwYW4gPyBwYW4uZ2V0VmFsdWUoKSA6IHBhbjtcbiAgfVxufVxuIiwiaW1wb3J0IFNwYW4gZnJvbSBcIi4vU3BhblwiO1xuaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBNYXRoVXRpbCBmcm9tIFwiLi9NYXRoVXRpbFwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBcnJheVNwYW4gZXh0ZW5kcyBTcGFuIHtcbiAgY29uc3RydWN0b3IoY29sb3IpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2FyciA9IFV0aWwudG9BcnJheShjb2xvcik7XG4gIH1cblxuICBnZXRWYWx1ZSgpIHtcbiAgICBjb25zdCB2YWwgPSBVdGlsLmdldFJhbmRGcm9tQXJyYXkodGhpcy5fYXJyKTtcbiAgICByZXR1cm4gdmFsID09PSBcInJhbmRvbVwiIHx8IHZhbCA9PT0gXCJSYW5kb21cIiA/IE1hdGhVdGlsLnJhbmRvbUNvbG9yKCkgOiB2YWw7XG4gIH1cblxuICAvKipcbiAgICogTWFrZSBzdXJlIHRoYXQgdGhlIGNvbG9yIGlzIGFuIGluc3RhbmNlIG9mIFByb3Rvbi5BcnJheVNwYW4sIGlmIG5vdCBpdCBtYWtlcyBhIG5ldyBpbnN0YW5jZVxuICAgKlxuICAgKiBAbWV0aG9kIHNldFNwYW5WYWx1ZVxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5Db2xvclxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uUGFydGljbGV9IHBhcnRpY2xlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB0aGUgaW50ZWdyYXRlIHRpbWUgMS9tc1xuICAgKiBAcGFyYW0ge0ludH0gdGhlIHBhcnRpY2xlIGluZGV4XG4gICAqL1xuICBzdGF0aWMgY3JlYXRlQXJyYXlTcGFuKGFycikge1xuICAgIGlmICghYXJyKSByZXR1cm4gbnVsbDtcblxuICAgIGlmIChhcnIgaW5zdGFuY2VvZiBBcnJheVNwYW4pIHJldHVybiBhcnI7XG4gICAgZWxzZSByZXR1cm4gbmV3IEFycmF5U3BhbihhcnIpO1xuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBSZWN0YW5nbGUge1xuICBjb25zdHJ1Y3Rvcih4LCB5LCB3LCBoKSB7XG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuXG4gICAgdGhpcy53aWR0aCA9IHc7XG4gICAgdGhpcy5oZWlnaHQgPSBoO1xuXG4gICAgdGhpcy5ib3R0b20gPSB0aGlzLnkgKyB0aGlzLmhlaWdodDtcbiAgICB0aGlzLnJpZ2h0ID0gdGhpcy54ICsgdGhpcy53aWR0aDtcbiAgfVxuXG4gIGNvbnRhaW5zKHgsIHkpIHtcbiAgICBpZiAoeCA8PSB0aGlzLnJpZ2h0ICYmIHggPj0gdGhpcy54ICYmIHkgPD0gdGhpcy5ib3R0b20gJiYgeSA+PSB0aGlzLnkpIHJldHVybiB0cnVlO1xuICAgIGVsc2UgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iLCJpbXBvcnQgU3BhbiBmcm9tIFwiLi4vbWF0aC9TcGFuXCI7XG5pbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSYXRlIHtcbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgcGFydGljbGVzIHBlciBzZWNvbmQgZW1pc3Npb24gKGEgW3BhcnRpY2xlXS9iIFtzXSk7XG4gICAqIEBuYW1lc3BhY2VcbiAgICogQG1lbWJlcm9mISBQcm90b24jXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAYWxpYXMgUmF0ZVxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5IHwgTnVtYmVyIHwgU3Bhbn0gbnVtcGFuIHRoZSBudW1iZXIgb2YgZWFjaCBlbWlzc2lvbjtcbiAgICogQHBhcmFtIHtBcnJheSB8IE51bWJlciB8IFNwYW59IHRpbWVwYW4gdGhlIHRpbWUgb2YgZWFjaCBlbWlzc2lvbjtcbiAgICogZm9yIGV4YW1wbGU6IG5ldyBSYXRlKG5ldyBTcGFuKDEwLCAyMCksIG5ldyBTcGFuKC4xLCAuMjUpKTtcbiAgICovXG4gIGNvbnN0cnVjdG9yKG51bXBhbiwgdGltZXBhbikge1xuICAgIHRoaXMubnVtUGFuID0gU3Bhbi5zZXRTcGFuVmFsdWUoVXRpbC5pbml0VmFsdWUobnVtcGFuLCAxKSk7XG4gICAgdGhpcy50aW1lUGFuID0gU3Bhbi5zZXRTcGFuVmFsdWUoVXRpbC5pbml0VmFsdWUodGltZXBhbiwgMSkpO1xuXG4gICAgdGhpcy5zdGFydFRpbWUgPSAwO1xuICAgIHRoaXMubmV4dFRpbWUgPSAwO1xuICAgIHRoaXMuaW5pdCgpO1xuICB9XG5cbiAgaW5pdCgpIHtcbiAgICB0aGlzLnN0YXJ0VGltZSA9IDA7XG4gICAgdGhpcy5uZXh0VGltZSA9IHRoaXMudGltZVBhbi5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgZ2V0VmFsdWUodGltZSkge1xuICAgIHRoaXMuc3RhcnRUaW1lICs9IHRpbWU7XG5cbiAgICBpZiAodGhpcy5zdGFydFRpbWUgPj0gdGhpcy5uZXh0VGltZSkge1xuICAgICAgdGhpcy5zdGFydFRpbWUgPSAwO1xuICAgICAgdGhpcy5uZXh0VGltZSA9IHRoaXMudGltZVBhbi5nZXRWYWx1ZSgpO1xuXG4gICAgICBpZiAodGhpcy5udW1QYW4uYiA9PT0gMSkge1xuICAgICAgICBpZiAodGhpcy5udW1QYW4uZ2V0VmFsdWUoZmFsc2UpID4gMC41KSByZXR1cm4gMTtcbiAgICAgICAgZWxzZSByZXR1cm4gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLm51bVBhbi5nZXRWYWx1ZSh0cnVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW5pdGlhbGl6ZSB7XG4gIHJlc2V0KCkge31cblxuICBpbml0KGVtaXR0ZXIsIHBhcnRpY2xlKSB7XG4gICAgaWYgKHBhcnRpY2xlKSB7XG4gICAgICB0aGlzLmluaXRpYWxpemUocGFydGljbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmluaXRpYWxpemUoZW1pdHRlcik7XG4gICAgfVxuICB9XG5cbiAgLy8gc3ViIGNsYXNzIGluaXRcbiAgaW5pdGlhbGl6ZSh0YXJnZXQpIHt9XG59XG4iLCJpbXBvcnQgU3BhbiBmcm9tIFwiLi4vbWF0aC9TcGFuXCI7XG5pbXBvcnQgSW5pdGlhbGl6ZSBmcm9tIFwiLi9Jbml0aWFsaXplXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExpZmUgZXh0ZW5kcyBJbml0aWFsaXplIHtcbiAgY29uc3RydWN0b3IoYSwgYiwgYykge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLmxpZmVQYW4gPSBTcGFuLnNldFNwYW5WYWx1ZShhLCBiLCBjKTtcbiAgICB0aGlzLm5hbWUgPSBcIkxpZmVcIjtcbiAgfVxuXG4gIGluaXRpYWxpemUodGFyZ2V0KSB7XG4gICAgaWYgKHRoaXMubGlmZVBhbi5hID09PSBJbmZpbml0eSkgdGFyZ2V0LmxpZmUgPSBJbmZpbml0eTtcbiAgICBlbHNlIHRhcmdldC5saWZlID0gdGhpcy5saWZlUGFuLmdldFZhbHVlKCk7XG4gIH1cbn1cbiIsImltcG9ydCBWZWN0b3IyRCBmcm9tIFwiLi4vbWF0aC9WZWN0b3IyRFwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBab25lIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy52ZWN0b3IgPSBuZXcgVmVjdG9yMkQoMCwgMCk7XG4gICAgdGhpcy5yYW5kb20gPSAwO1xuICAgIHRoaXMuY3Jvc3NUeXBlID0gXCJkZWFkXCI7XG4gICAgdGhpcy5hbGVydCA9IHRydWU7XG4gIH1cblxuICBnZXRQb3NpdGlvbigpIHt9XG5cbiAgY3Jvc3NpbmcocGFydGljbGUpIHt9XG5cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLnZlY3RvciA9IG51bGw7XG4gIH1cbn1cbiIsImltcG9ydCBab25lIGZyb20gXCIuL1pvbmVcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUG9pbnRab25lIGV4dGVuZHMgWm9uZSB7XG4gIGNvbnN0cnVjdG9yKHgsIHkpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuICB9XG5cbiAgZ2V0UG9zaXRpb24oKSB7XG4gICAgdGhpcy52ZWN0b3IueCA9IHRoaXMueDtcbiAgICB0aGlzLnZlY3Rvci55ID0gdGhpcy55O1xuXG4gICAgcmV0dXJuIHRoaXMudmVjdG9yO1xuICB9XG5cbiAgY3Jvc3NpbmcocGFydGljbGUpIHtcbiAgICBpZiAodGhpcy5hbGVydCkge1xuICAgICAgY29uc29sZS5lcnJvcihcIlNvcnJ5LCBQb2ludFpvbmUgZG9lcyBub3Qgc3VwcG9ydCBjcm9zc2luZyBtZXRob2QhXCIpO1xuICAgICAgdGhpcy5hbGVydCA9IGZhbHNlO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBQb2ludFpvbmUgZnJvbSBcIi4uL3pvbmUvUG9pbnRab25lXCI7XG5pbXBvcnQgSW5pdGlhbGl6ZSBmcm9tIFwiLi9Jbml0aWFsaXplXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBvc2l0aW9uIGV4dGVuZHMgSW5pdGlhbGl6ZSB7XG4gIGNvbnN0cnVjdG9yKHpvbmUpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuem9uZSA9IFV0aWwuaW5pdFZhbHVlKHpvbmUsIG5ldyBQb2ludFpvbmUoKSk7XG4gICAgdGhpcy5uYW1lID0gXCJQb3NpdGlvblwiO1xuICB9XG5cbiAgcmVzZXQoem9uZSkge1xuICAgIHRoaXMuem9uZSA9IFV0aWwuaW5pdFZhbHVlKHpvbmUsIG5ldyBQb2ludFpvbmUoKSk7XG4gIH1cblxuICBpbml0aWFsaXplKHRhcmdldCkge1xuICAgIHRoaXMuem9uZS5nZXRQb3NpdGlvbigpO1xuXG4gICAgdGFyZ2V0LnAueCA9IHRoaXMuem9uZS52ZWN0b3IueDtcbiAgICB0YXJnZXQucC55ID0gdGhpcy56b25lLnZlY3Rvci55O1xuICB9XG59XG4iLCJpbXBvcnQgUHJvdG9uIGZyb20gXCIuLi9jb3JlL1Byb3RvblwiO1xuaW1wb3J0IFNwYW4gZnJvbSBcIi4uL21hdGgvU3BhblwiO1xuaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBJbml0aWFsaXplIGZyb20gXCIuL0luaXRpYWxpemVcIjtcbmltcG9ydCBQb2xhcjJEIGZyb20gXCIuLi9tYXRoL1BvbGFyMkRcIjtcbmltcG9ydCBNYXRoVXRpbCBmcm9tIFwiLi4vbWF0aC9NYXRoVXRpbFwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2l0eSBleHRlbmRzIEluaXRpYWxpemUge1xuICBjb25zdHJ1Y3RvcihycGFuLCB0aGFwYW4sIHR5cGUpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5yUGFuID0gU3Bhbi5zZXRTcGFuVmFsdWUocnBhbik7XG4gICAgdGhpcy50aGFQYW4gPSBTcGFuLnNldFNwYW5WYWx1ZSh0aGFwYW4pO1xuICAgIHRoaXMudHlwZSA9IFV0aWwuaW5pdFZhbHVlKHR5cGUsIFwidmVjdG9yXCIpO1xuXG4gICAgdGhpcy5uYW1lID0gXCJWZWxvY2l0eVwiO1xuICB9XG5cbiAgcmVzZXQocnBhbiwgdGhhcGFuLCB0eXBlKSB7XG4gICAgdGhpcy5yUGFuID0gU3Bhbi5zZXRTcGFuVmFsdWUocnBhbik7XG4gICAgdGhpcy50aGFQYW4gPSBTcGFuLnNldFNwYW5WYWx1ZSh0aGFwYW4pO1xuICAgIHRoaXMudHlwZSA9IFV0aWwuaW5pdFZhbHVlKHR5cGUsIFwidmVjdG9yXCIpO1xuICB9XG5cbiAgbm9ybWFsaXplVmVsb2NpdHkodnIpIHtcbiAgICByZXR1cm4gdnIgKiBQcm90b24uTUVBU1VSRTtcbiAgfVxuXG4gIGluaXRpYWxpemUodGFyZ2V0KSB7XG4gICAgaWYgKHRoaXMudHlwZSA9PT0gXCJwXCIgfHwgdGhpcy50eXBlID09PSBcIlBcIiB8fCB0aGlzLnR5cGUgPT09IFwicG9sYXJcIikge1xuICAgICAgY29uc3QgcG9sYXIyZCA9IG5ldyBQb2xhcjJEKFxuICAgICAgICB0aGlzLm5vcm1hbGl6ZVZlbG9jaXR5KHRoaXMuclBhbi5nZXRWYWx1ZSgpKSxcbiAgICAgICAgdGhpcy50aGFQYW4uZ2V0VmFsdWUoKSAqIE1hdGhVdGlsLlBJXzE4MFxuICAgICAgKTtcblxuICAgICAgdGFyZ2V0LnYueCA9IHBvbGFyMmQuZ2V0WCgpO1xuICAgICAgdGFyZ2V0LnYueSA9IHBvbGFyMmQuZ2V0WSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQudi54ID0gdGhpcy5ub3JtYWxpemVWZWxvY2l0eSh0aGlzLnJQYW4uZ2V0VmFsdWUoKSk7XG4gICAgICB0YXJnZXQudi55ID0gdGhpcy5ub3JtYWxpemVWZWxvY2l0eSh0aGlzLnRoYVBhbi5nZXRWYWx1ZSgpKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBTcGFuIGZyb20gXCIuLi9tYXRoL1NwYW5cIjtcbmltcG9ydCBJbml0aWFsaXplIGZyb20gXCIuL0luaXRpYWxpemVcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWFzcyBleHRlbmRzIEluaXRpYWxpemUge1xuICBjb25zdHJ1Y3RvcihhLCBiLCBjKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLm1hc3NQYW4gPSBTcGFuLnNldFNwYW5WYWx1ZShhLCBiLCBjKTtcbiAgICB0aGlzLm5hbWUgPSBcIk1hc3NcIjtcbiAgfVxuXG4gIGluaXRpYWxpemUodGFyZ2V0KSB7XG4gICAgdGFyZ2V0Lm1hc3MgPSB0aGlzLm1hc3NQYW4uZ2V0VmFsdWUoKTtcbiAgfVxufVxuIiwiaW1wb3J0IFNwYW4gZnJvbSBcIi4uL21hdGgvU3BhblwiO1xuaW1wb3J0IEluaXRpYWxpemUgZnJvbSBcIi4vSW5pdGlhbGl6ZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSYWRpdXMgZXh0ZW5kcyBJbml0aWFsaXplIHtcbiAgY29uc3RydWN0b3IoYSwgYiwgYykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5yYWRpdXMgPSBTcGFuLnNldFNwYW5WYWx1ZShhLCBiLCBjKTtcblxuICAgIHRoaXMubmFtZSA9IFwiUmFkaXVzXCI7XG4gIH1cblxuICByZXNldChhLCBiLCBjKSB7XG4gICAgdGhpcy5yYWRpdXMgPSBTcGFuLnNldFNwYW5WYWx1ZShhLCBiLCBjKTtcbiAgfVxuXG4gIGluaXRpYWxpemUocGFydGljbGUpIHtcbiAgICBwYXJ0aWNsZS5yYWRpdXMgPSB0aGlzLnJhZGl1cy5nZXRWYWx1ZSgpO1xuICAgIHBhcnRpY2xlLmRhdGEub2xkUmFkaXVzID0gcGFydGljbGUucmFkaXVzO1xuICB9XG59XG4iLCJpbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IEFycmF5U3BhbiBmcm9tIFwiLi4vbWF0aC9BcnJheVNwYW5cIjtcbmltcG9ydCBJbml0aWFsaXplIGZyb20gXCIuL0luaXRpYWxpemVcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQm9keSBleHRlbmRzIEluaXRpYWxpemUge1xuICBjb25zdHJ1Y3RvcihpbWFnZSwgdywgaCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLmltYWdlID0gdGhpcy5zZXRTcGFuVmFsdWUoaW1hZ2UpO1xuICAgIHRoaXMudyA9IFV0aWwuaW5pdFZhbHVlKHcsIDIwKTtcbiAgICB0aGlzLmggPSBVdGlsLmluaXRWYWx1ZShoLCB0aGlzLncpO1xuICAgIHRoaXMubmFtZSA9IFwiQm9keVwiO1xuICB9XG5cbiAgaW5pdGlhbGl6ZShwYXJ0aWNsZSkge1xuICAgIGNvbnN0IGltYWdlVGFyZ2V0ID0gdGhpcy5pbWFnZS5nZXRWYWx1ZSgpO1xuXG4gICAgaWYgKHR5cGVvZiBpbWFnZVRhcmdldCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcGFydGljbGUuYm9keSA9IHtcbiAgICAgICAgd2lkdGg6IHRoaXMudyxcbiAgICAgICAgaGVpZ2h0OiB0aGlzLmgsXG4gICAgICAgIHNyYzogaW1hZ2VUYXJnZXQsXG4gICAgICAgIGlzSW5uZXI6IHRydWUsXG4gICAgICAgIGlubmVyOiB0cnVlXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJ0aWNsZS5ib2R5ID0gaW1hZ2VUYXJnZXQ7XG4gICAgfVxuICB9XG5cbiAgc2V0U3BhblZhbHVlKGltYWdlKSB7XG4gICAgcmV0dXJuIGltYWdlIGluc3RhbmNlb2YgQXJyYXlTcGFuID8gaW1hZ2UgOiBuZXcgQXJyYXlTcGFuKGltYWdlKTtcbiAgfVxufVxuIiwiaW1wb3J0IFByb3RvbiBmcm9tIFwiLi4vY29yZS9Qcm90b25cIjtcbmltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgZWFzZSBmcm9tIFwiLi4vbWF0aC9lYXNlXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJlaGF2aW91ciB7XG4gIHN0YXRpYyBpZCA9IDA7XG5cbiAgLyoqXG4gICAqIFRoZSBCZWhhdmlvdXIgY2xhc3MgaXMgdGhlIGJhc2UgZm9yIHRoZSBvdGhlciBCZWhhdmlvdXJcbiAgICpcbiAgICogQG1lbWJlcm9mISAtXG4gICAqIEBpbnRlcmZhY2VcbiAgICogQGFsaWFzIFByb3Rvbi5CZWhhdmlvdXJcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGxpZmUgXHR0aGUgYmVoYXZpb3VycyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBlYXNpbmcgXHRUaGUgYmVoYXZpb3VyJ3MgZGVjYXlpbmcgdHJlbmQsIGZvciBleGFtcGxlIGVhc2UuZWFzZU91dFF1YXJ0XG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSAgaWQgXHRcdFRoZSBiZWhhdmlvdXJzIGlkXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gXHRcdFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZS5lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSAgYWdlPTAgXHRIb3cgbG9uZyB0aGUgcGFydGljbGUgc2hvdWxkIGJlICdhbGlmZSdcbiAgICogQHByb3BlcnR5IHtOdW1iZXJ9ICBlbmVyZ3k9MVxuICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGRlYWQ9ZmFsc2UgVGhlIHBhcnRpY2xlIGlzIGRlYWQgYXQgZmlyc3RcbiAgICogQHByb3BlcnR5IHtBcnJheX0gICBwYXJlbnRzIFx0VGhlIGJlaGF2aW91cidzIHBhcmVudHMgYXJyYXlcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9ICBuYW1lIFx0VGhlIGJlaGF2aW91ciBuYW1lXG4gICAqL1xuICBjb25zdHJ1Y3RvcihsaWZlLCBlYXNpbmcpIHtcbiAgICB0aGlzLmxpZmUgPSBVdGlsLmluaXRWYWx1ZShsaWZlLCBJbmZpbml0eSk7XG4gICAgdGhpcy5lYXNpbmcgPSBlYXNlLmdldEVhc2luZyhlYXNpbmcpO1xuXG4gICAgdGhpcy5hZ2UgPSAwO1xuICAgIHRoaXMuZW5lcmd5ID0gMTtcbiAgICB0aGlzLmRlYWQgPSBmYWxzZTtcbiAgICB0aGlzLnBhcmVudHMgPSBbXTtcblxuICAgIHRoaXMuaWQgPSBgQmVoYXZpb3VyXyR7QmVoYXZpb3VyLmlkKyt9YDtcbiAgICB0aGlzLm5hbWUgPSBcIkJlaGF2aW91clwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoaXMgYmVoYXZpb3VyJ3MgcGFyYW1ldGVyc1xuICAgKlxuICAgKiBAbWV0aG9kIHJlc2V0XG4gICAqIEBtZW1iZXJvZiBQcm90b24uQmVoYXZpb3VyXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldIFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKi9cbiAgcmVzZXQobGlmZSwgZWFzaW5nKSB7XG4gICAgdGhpcy5saWZlID0gVXRpbC5pbml0VmFsdWUobGlmZSwgSW5maW5pdHkpO1xuICAgIHRoaXMuZWFzaW5nID0gZWFzZS5nZXRFYXNpbmcoZWFzaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemUgYSBmb3JjZSBieSAxOjEwMDtcbiAgICpcbiAgICogQG1ldGhvZCBub3JtYWxpemVGb3JjZVxuICAgKiBAbWVtYmVyb2YgUHJvdG9uLkJlaGF2aW91clxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uVmVjdG9yMkR9IGZvcmNlXG4gICAqL1xuICBub3JtYWxpemVGb3JjZShmb3JjZSkge1xuICAgIHJldHVybiBmb3JjZS5tdWx0aXBseVNjYWxhcihQcm90b24uTUVBU1VSRSk7XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplIGEgdmFsdWUgYnkgMToxMDA7XG4gICAqXG4gICAqIEBtZXRob2Qgbm9ybWFsaXplVmFsdWVcbiAgICogQG1lbWJlcm9mIFByb3Rvbi5CZWhhdmlvdXJcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB2YWx1ZVxuICAgKi9cbiAgbm9ybWFsaXplVmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgKiBQcm90b24uTUVBU1VSRTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBiZWhhdmlvdXIncyBwYXJhbWV0ZXJzIGZvciBhbGwgcGFydGljbGVzXG4gICAqXG4gICAqIEBtZXRob2QgaW5pdGlhbGl6ZVxuICAgKiBAbWVtYmVyb2YgUHJvdG9uLkJlaGF2aW91clxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uUGFydGljbGV9IHBhcnRpY2xlXG4gICAqL1xuICBpbml0aWFsaXplKHBhcnRpY2xlKSB7fVxuXG4gIC8qKlxuICAgKiBBcHBseSB0aGlzIGJlaGF2aW91ciBmb3IgYWxsIHBhcnRpY2xlcyBldmVyeSB0aW1lXG4gICAqXG4gICAqIEBtZXRob2QgYXBwbHlCZWhhdmlvdXJcbiAgICogQG1lbWJlcm9mIFByb3Rvbi5CZWhhdmlvdXJcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlBhcnRpY2xlfSBwYXJ0aWNsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gXHRcdFx0dGltZSB0aGUgaW50ZWdyYXRlIHRpbWUgMS9tc1xuICAgKiBAcGFyYW0ge0ludH0gXHRcdFx0aW5kZXggdGhlIHBhcnRpY2xlIGluZGV4XG4gICAqL1xuICBjYWxjdWxhdGUocGFydGljbGUsIHRpbWUsIGluZGV4KSB7XG4gICAgdGhpcy5hZ2UgKz0gdGltZTtcblxuICAgIGlmICh0aGlzLmFnZSA+PSB0aGlzLmxpZmUgfHwgdGhpcy5kZWFkKSB7XG4gICAgICB0aGlzLmVuZXJneSA9IDA7XG4gICAgICB0aGlzLmRlYWQgPSB0cnVlO1xuICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHNjYWxlID0gdGhpcy5lYXNpbmcocGFydGljbGUuYWdlIC8gcGFydGljbGUubGlmZSk7XG4gICAgICB0aGlzLmVuZXJneSA9IE1hdGgubWF4KDEgLSBzY2FsZSwgMCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlc3RvcnkgdGhpcyBiZWhhdmlvdXJcbiAgICpcbiAgICogQG1ldGhvZCBkZXN0cm95XG4gICAqIEBtZW1iZXJvZiBQcm90b24uQmVoYXZpb3VyXG4gICAqIEBpbnN0YW5jZVxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICBsZXQgaSA9IHRoaXMucGFyZW50cy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgdGhpcy5wYXJlbnRzW2ldLnJlbW92ZUJlaGF2aW91cih0aGlzKTtcbiAgICB9XG5cbiAgICB0aGlzLnBhcmVudHMubGVuZ3RoID0gMDtcbiAgfVxufVxuIiwiaW1wb3J0IFZlY3RvcjJEIGZyb20gXCIuLi9tYXRoL1ZlY3RvcjJEXCI7XG5pbXBvcnQgQmVoYXZpb3VyIGZyb20gXCIuL0JlaGF2aW91clwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGb3JjZSBleHRlbmRzIEJlaGF2aW91ciB7XG4gIC8qKlxuICAgKiBAbWVtYmVyb2YhIFByb3RvbiNcbiAgICogQGF1Z21lbnRzIFByb3Rvbi5CZWhhdmlvdXJcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBhbGlhcyBQcm90b24uRm9yY2VcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGZ4XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBmeVxuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldIFx0XHRcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlLmVhc2VMaW5lYXJdIFx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICpcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IG5hbWUgVGhlIEJlaGF2aW91ciBuYW1lXG4gICAqL1xuICBjb25zdHJ1Y3RvcihmeCwgZnksIGxpZmUsIGVhc2luZykge1xuICAgIHN1cGVyKGxpZmUsIGVhc2luZyk7XG5cbiAgICB0aGlzLmZvcmNlID0gdGhpcy5ub3JtYWxpemVGb3JjZShuZXcgVmVjdG9yMkQoZngsIGZ5KSk7XG4gICAgdGhpcy5uYW1lID0gXCJGb3JjZVwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoaXMgYmVoYXZpb3VyJ3MgcGFyYW1ldGVyc1xuICAgKlxuICAgKiBAbWV0aG9kIHJlc2V0XG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkZvcmNlXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gZnhcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGZ5XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gXHRcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2UuZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKi9cbiAgcmVzZXQoZngsIGZ5LCBsaWZlLCBlYXNpbmcpIHtcbiAgICB0aGlzLmZvcmNlID0gdGhpcy5ub3JtYWxpemVGb3JjZShuZXcgVmVjdG9yMkQoZngsIGZ5KSk7XG5cbiAgICBsaWZlICYmIHN1cGVyLnJlc2V0KGxpZmUsIGVhc2luZyk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgdGhpcyBiZWhhdmlvdXIgZm9yIGFsbCBwYXJ0aWNsZXMgZXZlcnkgdGltZVxuICAgKlxuICAgKiBAbWV0aG9kIGFwcGx5QmVoYXZpb3VyXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkZvcmNlXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5QYXJ0aWNsZX0gcGFydGljbGVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHRoZSBpbnRlZ3JhdGUgdGltZSAxL21zXG4gICAqIEBwYXJhbSB7SW50fSB0aGUgcGFydGljbGUgaW5kZXhcbiAgICovXG4gIGFwcGx5QmVoYXZpb3VyKHBhcnRpY2xlLCB0aW1lLCBpbmRleCkge1xuICAgIHRoaXMuY2FsY3VsYXRlKHBhcnRpY2xlLCB0aW1lLCBpbmRleCk7XG4gICAgcGFydGljbGUuYS5hZGQodGhpcy5mb3JjZSk7XG4gIH1cbn1cbiIsImltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgVmVjdG9yMkQgZnJvbSBcIi4uL21hdGgvVmVjdG9yMkRcIjtcbmltcG9ydCBCZWhhdmlvdXIgZnJvbSBcIi4vQmVoYXZpb3VyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEF0dHJhY3Rpb24gZXh0ZW5kcyBCZWhhdmlvdXIge1xuICAvKipcbiAgICogVGhpcyBiZWhhdmlvdXIgbGV0IHRoZSBwYXJ0aWNsZXMgZm9sbG93IG9uZSBzcGVjaWZpYyBQcm90b24uVmVjdG9yMkRcbiAgICpcbiAgICogQG1lbWJlcm9mISBQcm90b24jXG4gICAqIEBhdWdtZW50cyBQcm90b24uQmVoYXZpb3VyXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAYWxpYXMgUHJvdG9uLkF0dHJhY3Rpb25cbiAgICpcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uIGZvciAnZm9yY2UnIGFuZCAncmFkaXVzJ1xuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5WZWN0b3IyRH0gdGFyZ2V0UG9zaXRpb24gdGhlIGF0dHJhY3Rpb24gcG9pbnQgY29vcmRpbmF0ZXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtmb3JjZT0xMDBdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbcmFkaXVzPTEwMDBdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gXHRcdFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZS5lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7UHJvdG9uLlZlY3RvcjJEfSB0YXJnZXRQb3NpdGlvblxuICAgKiBAcHJvcGVydHkge051bWJlcn0gcmFkaXVzXG4gICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBmb3JjZVxuICAgKiBAcHJvcGVydHkge051bWJlcn0gcmFkaXVzU3FcbiAgICogQHByb3BlcnR5IHtQcm90b24uVmVjdG9yMkR9IGF0dHJhY3Rpb25Gb3JjZVxuICAgKiBAcHJvcGVydHkge051bWJlcn0gbGVuZ3RoU3FcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IG5hbWUgVGhlIEJlaGF2aW91ciBuYW1lXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih0YXJnZXRQb3NpdGlvbiwgZm9yY2UsIHJhZGl1cywgbGlmZSwgZWFzaW5nKSB7XG4gICAgc3VwZXIobGlmZSwgZWFzaW5nKTtcblxuICAgIHRoaXMudGFyZ2V0UG9zaXRpb24gPSBVdGlsLmluaXRWYWx1ZSh0YXJnZXRQb3NpdGlvbiwgbmV3IFZlY3RvcjJEKCkpO1xuICAgIHRoaXMucmFkaXVzID0gVXRpbC5pbml0VmFsdWUocmFkaXVzLCAxMDAwKTtcbiAgICB0aGlzLmZvcmNlID0gVXRpbC5pbml0VmFsdWUodGhpcy5ub3JtYWxpemVWYWx1ZShmb3JjZSksIDEwMCk7XG5cbiAgICB0aGlzLnJhZGl1c1NxID0gdGhpcy5yYWRpdXMgKiB0aGlzLnJhZGl1cztcbiAgICB0aGlzLmF0dHJhY3Rpb25Gb3JjZSA9IG5ldyBWZWN0b3IyRCgpO1xuICAgIHRoaXMubGVuZ3RoU3EgPSAwO1xuXG4gICAgdGhpcy5uYW1lID0gXCJBdHRyYWN0aW9uXCI7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhpcyBiZWhhdmlvdXIncyBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIEBtZXRob2QgcmVzZXRcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uQXR0cmFjdGlvblxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uIGZvciAnZm9yY2UnIGFuZCAncmFkaXVzJ1xuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5WZWN0b3IyRH0gdGFyZ2V0UG9zaXRpb24gdGhlIGF0dHJhY3Rpb24gcG9pbnQgY29vcmRpbmF0ZXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtmb3JjZT0xMDBdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbcmFkaXVzPTEwMDBdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gXHRcdFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZS5lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqL1xuICByZXNldCh0YXJnZXRQb3NpdGlvbiwgZm9yY2UsIHJhZGl1cywgbGlmZSwgZWFzaW5nKSB7XG4gICAgdGhpcy50YXJnZXRQb3NpdGlvbiA9IFV0aWwuaW5pdFZhbHVlKHRhcmdldFBvc2l0aW9uLCBuZXcgVmVjdG9yMkQoKSk7XG4gICAgdGhpcy5yYWRpdXMgPSBVdGlsLmluaXRWYWx1ZShyYWRpdXMsIDEwMDApO1xuICAgIHRoaXMuZm9yY2UgPSBVdGlsLmluaXRWYWx1ZSh0aGlzLm5vcm1hbGl6ZVZhbHVlKGZvcmNlKSwgMTAwKTtcblxuICAgIHRoaXMucmFkaXVzU3EgPSB0aGlzLnJhZGl1cyAqIHRoaXMucmFkaXVzO1xuICAgIHRoaXMuYXR0cmFjdGlvbkZvcmNlID0gbmV3IFZlY3RvcjJEKCk7XG4gICAgdGhpcy5sZW5ndGhTcSA9IDA7XG5cbiAgICBsaWZlICYmIHN1cGVyLnJlc2V0KGxpZmUsIGVhc2luZyk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgdGhpcyBiZWhhdmlvdXIgZm9yIGFsbCBwYXJ0aWNsZXMgZXZlcnkgdGltZVxuICAgKlxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5BdHRyYWN0aW9uXG4gICAqIEBtZXRob2QgYXBwbHlCZWhhdmlvdXJcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlBhcnRpY2xlfSBwYXJ0aWNsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gXHRcdFx0dGltZSB0aGUgaW50ZWdyYXRlIHRpbWUgMS9tc1xuICAgKiBAcGFyYW0ge0ludH0gXHRcdFx0aW5kZXggdGhlIHBhcnRpY2xlIGluZGV4XG4gICAqL1xuICBhcHBseUJlaGF2aW91cihwYXJ0aWNsZSwgdGltZSwgaW5kZXgpIHtcbiAgICB0aGlzLmNhbGN1bGF0ZShwYXJ0aWNsZSwgdGltZSwgaW5kZXgpO1xuXG4gICAgdGhpcy5hdHRyYWN0aW9uRm9yY2UuY29weSh0aGlzLnRhcmdldFBvc2l0aW9uKTtcbiAgICB0aGlzLmF0dHJhY3Rpb25Gb3JjZS5zdWIocGFydGljbGUucCk7XG4gICAgdGhpcy5sZW5ndGhTcSA9IHRoaXMuYXR0cmFjdGlvbkZvcmNlLmxlbmd0aFNxKCk7XG5cbiAgICBpZiAodGhpcy5sZW5ndGhTcSA+IDAuMDAwMDQgJiYgdGhpcy5sZW5ndGhTcSA8IHRoaXMucmFkaXVzU3EpIHtcbiAgICAgIHRoaXMuYXR0cmFjdGlvbkZvcmNlLm5vcm1hbGl6ZSgpO1xuICAgICAgdGhpcy5hdHRyYWN0aW9uRm9yY2UubXVsdGlwbHlTY2FsYXIoMSAtIHRoaXMubGVuZ3RoU3EgLyB0aGlzLnJhZGl1c1NxKTtcbiAgICAgIHRoaXMuYXR0cmFjdGlvbkZvcmNlLm11bHRpcGx5U2NhbGFyKHRoaXMuZm9yY2UpO1xuXG4gICAgICBwYXJ0aWNsZS5hLmFkZCh0aGlzLmF0dHJhY3Rpb25Gb3JjZSk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgVmVjdG9yMkQgZnJvbSBcIi4uL21hdGgvVmVjdG9yMkRcIjtcbmltcG9ydCBNYXRoVXRpbCBmcm9tIFwiLi4vbWF0aC9NYXRoVXRpbFwiO1xuaW1wb3J0IEJlaGF2aW91ciBmcm9tIFwiLi9CZWhhdmlvdXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmFuZG9tRHJpZnQgZXh0ZW5kcyBCZWhhdmlvdXIge1xuICAvKipcbiAgICogQG1lbWJlcm9mISBQcm90b24jXG4gICAqIEBhdWdtZW50cyBCZWhhdmlvdXJcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBhbGlhcyBSYW5kb21EcmlmdFxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gZHJpZnRYIFx0XHRcdFx0WCB2YWx1ZSBvZiB0aGUgbmV3IFZlY3RvcjJEXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBkcmlmdFkgIFx0XHRcdFx0WSB2YWx1ZSBvZiB0aGUgbmV3IFZlY3RvcjJEXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBkZWxheSBcdFx0XHRcdEhvdyBtdWNoIGRlbGF5IHRoZSBkcmlmdCBzaG91bGQgaGF2ZVxuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldIFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKlxuICAgKiBAcHJvcGVydHkge051bWJlcn0gdGltZSBUaGUgdGltZSBvZiB0aGUgZHJpZnRcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IG5hbWUgVGhlIEJlaGF2aW91ciBuYW1lXG4gICAqL1xuICBjb25zdHJ1Y3RvcihkcmlmdFgsIGRyaWZ0WSwgZGVsYXksIGxpZmUsIGVhc2luZykge1xuICAgIHN1cGVyKGxpZmUsIGVhc2luZyk7XG5cbiAgICB0aGlzLnJlc2V0KGRyaWZ0WCwgZHJpZnRZLCBkZWxheSk7XG4gICAgdGhpcy50aW1lID0gMDtcbiAgICB0aGlzLm5hbWUgPSBcIlJhbmRvbURyaWZ0XCI7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhpcyBiZWhhdmlvdXIncyBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIEBtZXRob2QgcmVzZXRcbiAgICogQG1lbWJlcm9mIFByb3RvbiNSYW5kb21EcmlmdFxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGRyaWZ0WCBcdFx0XHRcdFggdmFsdWUgb2YgdGhlIG5ldyBWZWN0b3IyRFxuICAgKiBAcGFyYW0ge051bWJlcn0gZHJpZnRZICBcdFx0XHRcdFkgdmFsdWUgb2YgdGhlIG5ldyBWZWN0b3IyRFxuICAgKiBAcGFyYW0ge051bWJlcn0gZGVsYXkgXHRcdFx0XHRIb3cgbXVjaCBkZWxheSB0aGUgZHJpZnQgc2hvdWxkIGhhdmVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XSBcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2VMaW5lYXJdIFx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICovXG4gIHJlc2V0KGRyaWZ0WCwgZHJpZnRZLCBkZWxheSwgbGlmZSwgZWFzaW5nKSB7XG4gICAgdGhpcy5wYW5Gb2NlID0gbmV3IFZlY3RvcjJEKGRyaWZ0WCwgZHJpZnRZKTtcbiAgICB0aGlzLnBhbkZvY2UgPSB0aGlzLm5vcm1hbGl6ZUZvcmNlKHRoaXMucGFuRm9jZSk7XG4gICAgdGhpcy5kZWxheSA9IGRlbGF5O1xuXG4gICAgbGlmZSAmJiBzdXBlci5yZXNldChsaWZlLCBlYXNpbmcpO1xuICB9XG5cbiAgaW5pdGlhbGl6ZShwYXJ0aWNsZSkge1xuICAgIHBhcnRpY2xlLmRhdGEudGltZSA9IDA7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgdGhpcyBiZWhhdmlvdXIgZm9yIGFsbCBwYXJ0aWNsZXMgZXZlcnkgdGltZVxuICAgKlxuICAgKiBAbWV0aG9kIGFwcGx5QmVoYXZpb3VyXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUmFuZG9tRHJpZnRcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UGFydGljbGV9IHBhcnRpY2xlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBcdFx0XHR0aW1lIHRoZSBpbnRlZ3JhdGUgdGltZSAxL21zXG4gICAqIEBwYXJhbSB7SW50fSBcdFx0XHRpbmRleCB0aGUgcGFydGljbGUgaW5kZXhcbiAgICovXG4gIGFwcGx5QmVoYXZpb3VyKHBhcnRpY2xlLCB0aW1lLCBpbmRleCkge1xuICAgIHRoaXMuY2FsY3VsYXRlKHBhcnRpY2xlLCB0aW1lLCBpbmRleCk7XG4gICAgcGFydGljbGUuZGF0YS50aW1lICs9IHRpbWU7XG5cbiAgICBpZiAocGFydGljbGUuZGF0YS50aW1lID49IHRoaXMuZGVsYXkpIHtcbiAgICAgIHBhcnRpY2xlLmEuYWRkWFkoXG4gICAgICAgIE1hdGhVdGlsLnJhbmRvbUFUb0IoLXRoaXMucGFuRm9jZS54LCB0aGlzLnBhbkZvY2UueCksXG4gICAgICAgIE1hdGhVdGlsLnJhbmRvbUFUb0IoLXRoaXMucGFuRm9jZS55LCB0aGlzLnBhbkZvY2UueSlcbiAgICAgICk7XG5cbiAgICAgIHBhcnRpY2xlLmRhdGEudGltZSA9IDA7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgRm9yY2UgZnJvbSBcIi4vRm9yY2VcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR3Jhdml0eSBleHRlbmRzIEZvcmNlIHtcbiAgLyoqXG4gICAqIEBtZW1iZXJvZiEgUHJvdG9uI1xuICAgKiBAYXVnbWVudHMgUHJvdG9uI1Byb3Rvbi5Gb3JjZVxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGFsaWFzIFByb3Rvbi5HcmF2aXR5XG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBnIFx0XHRcdFx0XHRcdFx0R3Jhdml0eVxuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldIFx0XHRcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2UuZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gbmFtZSBUaGUgQmVoYXZpb3VyIG5hbWVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGcsIGxpZmUsIGVhc2luZykge1xuICAgIHN1cGVyKDAsIGcsIGxpZmUsIGVhc2luZyk7XG4gICAgdGhpcy5uYW1lID0gXCJHcmF2aXR5XCI7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhpcyBiZWhhdmlvdXIncyBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIEBtZXRob2QgcmVzZXRcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uR3Jhdml0eVxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGcgXHRcdFx0XHRcdFx0XHRHcmF2aXR5XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gXHRcdFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZS5lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqL1xuICByZXNldChnLCBsaWZlLCBlYXNpbmcpIHtcbiAgICBzdXBlci5yZXNldCgwLCBnLCBsaWZlLCBlYXNpbmcpO1xuICB9XG59XG4iLCJpbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IFZlY3RvcjJEIGZyb20gXCIuLi9tYXRoL1ZlY3RvcjJEXCI7XG5pbXBvcnQgQmVoYXZpb3VyIGZyb20gXCIuL0JlaGF2aW91clwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb2xsaXNpb24gZXh0ZW5kcyBCZWhhdmlvdXIge1xuICAvKipcbiAgICogVGhlIGNhbGxiYWNrIGFmdGVyIGNvbGxpc2lvblxuICAgKlxuICAgKiBAY2FsbGJhY2sgQ2FsbGJhY2tcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uUGFydGljbGV9IHBhcnRpY2xlXG4gICAqIEBwYXJhbSB7UHJvdG9uLlBhcml0Y2xlfSBvdGhlclBhcnRpY2xlXG4gICAqL1xuICAvKipcbiAgICogQG1lbWJlcm9mISBQcm90b24jXG4gICAqIEBhdWdtZW50cyBQcm90b24uQmVoYXZpb3VyXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAYWxpYXMgUHJvdG9uLkNvbGxpc2lvblxuICAgKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb24gdG8gbWFzc1xuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5FbWl0dGVyfSBcdFtlbWl0dGVyPW51bGxdIFx0XHR0aGUgYXR0cmFjdGlvbiBwb2ludCBjb29yZGluYXRlc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFx0XHRbbWFzcz10cnVlXVxuICAgKiBAcGFyYW0ge0NhbGxiYWNrfVx0IFx0W2NhbGxiYWNrPW51bGxdXHRcdHRoZSBjYWxsYmFjayBhZnRlciB0aGUgY29sbGlzaW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gXHRcdFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZS5lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBuYW1lIFRoZSBCZWhhdmlvdXIgbmFtZVxuICAgKi9cbiAgY29uc3RydWN0b3IoZW1pdHRlciwgbWFzcywgY2FsbGJhY2ssIGxpZmUsIGVhc2luZykge1xuICAgIHN1cGVyKGxpZmUsIGVhc2luZyk7XG5cbiAgICB0aGlzLnJlc2V0KGVtaXR0ZXIsIG1hc3MsIGNhbGxiYWNrKTtcbiAgICB0aGlzLm5hbWUgPSBcIkNvbGxpc2lvblwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoaXMgYmVoYXZpb3VyJ3MgcGFyYW1ldGVyc1xuICAgKlxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5Db2xsaXNpb25cbiAgICogQG1ldGhvZCByZXNldFxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uIHRvIG1hc3NcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uRW1pdHRlcn0gXHRbZW1pdHRlcj1udWxsXSBcdFx0dGhlIGF0dHJhY3Rpb24gcG9pbnQgY29vcmRpbmF0ZXNcbiAgICogQHBhcmFtIHtCb29sZWFufSBcdFx0W21hc3M9dHJ1ZV1cbiAgICogQHBhcmFtIHtDYWxsYmFja31cdCBcdFtjYWxsYmFjaz1udWxsXVx0XHR0aGUgY2FsbGJhY2sgYWZ0ZXIgdGhlIGNvbGxpc2lvblxuICAgKiBAcGFyYW0ge051bWJlcn0gXHRcdFx0W2xpZmU9SW5maW5pdHldIFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2UuZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKi9cbiAgcmVzZXQoZW1pdHRlciwgbWFzcywgY2FsbGJhY2ssIGxpZmUsIGVhc2luZykge1xuICAgIHRoaXMuZW1pdHRlciA9IFV0aWwuaW5pdFZhbHVlKGVtaXR0ZXIsIG51bGwpO1xuICAgIHRoaXMubWFzcyA9IFV0aWwuaW5pdFZhbHVlKG1hc3MsIHRydWUpO1xuICAgIHRoaXMuY2FsbGJhY2sgPSBVdGlsLmluaXRWYWx1ZShjYWxsYmFjaywgbnVsbCk7XG5cbiAgICB0aGlzLmNvbGxpc2lvblBvb2wgPSBbXTtcbiAgICB0aGlzLmRlbHRhID0gbmV3IFZlY3RvcjJEKCk7XG5cbiAgICBsaWZlICYmIHN1cGVyLnJlc2V0KGxpZmUsIGVhc2luZyk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgdGhpcyBiZWhhdmlvdXIgZm9yIGFsbCBwYXJ0aWNsZXMgZXZlcnkgdGltZVxuICAgKlxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5Db2xsaXNpb25cbiAgICogQG1ldGhvZCBhcHBseUJlaGF2aW91clxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uUGFydGljbGV9IHBhcnRpY2xlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBcdFx0XHR0aW1lIHRoZSBpbnRlZ3JhdGUgdGltZSAxL21zXG4gICAqIEBwYXJhbSB7SW50fSBcdFx0XHRpbmRleCB0aGUgcGFydGljbGUgaW5kZXhcbiAgICovXG4gIGFwcGx5QmVoYXZpb3VyKHBhcnRpY2xlLCB0aW1lLCBpbmRleCkge1xuICAgIGNvbnN0IG5ld1Bvb2wgPSB0aGlzLmVtaXR0ZXIgPyB0aGlzLmVtaXR0ZXIucGFydGljbGVzLnNsaWNlKGluZGV4KSA6IHRoaXMucG9vbC5zbGljZShpbmRleCk7XG4gICAgY29uc3QgbGVuZ3RoID0gbmV3UG9vbC5sZW5ndGg7XG5cbiAgICBsZXQgb3RoZXJQYXJ0aWNsZTtcbiAgICBsZXQgbGVuZ3RoU3E7XG4gICAgbGV0IG92ZXJsYXA7XG4gICAgbGV0IHRvdGFsTWFzcztcbiAgICBsZXQgYXZlcmFnZU1hc3MxLCBhdmVyYWdlTWFzczI7XG4gICAgbGV0IGk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIG90aGVyUGFydGljbGUgPSBuZXdQb29sW2ldO1xuXG4gICAgICBpZiAob3RoZXJQYXJ0aWNsZSAhPT0gcGFydGljbGUpIHtcbiAgICAgICAgdGhpcy5kZWx0YS5jb3B5KG90aGVyUGFydGljbGUucCk7XG4gICAgICAgIHRoaXMuZGVsdGEuc3ViKHBhcnRpY2xlLnApO1xuXG4gICAgICAgIGxlbmd0aFNxID0gdGhpcy5kZWx0YS5sZW5ndGhTcSgpO1xuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IHBhcnRpY2xlLnJhZGl1cyArIG90aGVyUGFydGljbGUucmFkaXVzO1xuXG4gICAgICAgIGlmIChsZW5ndGhTcSA8PSBkaXN0YW5jZSAqIGRpc3RhbmNlKSB7XG4gICAgICAgICAgb3ZlcmxhcCA9IGRpc3RhbmNlIC0gTWF0aC5zcXJ0KGxlbmd0aFNxKTtcbiAgICAgICAgICBvdmVybGFwICs9IDAuNTtcblxuICAgICAgICAgIHRvdGFsTWFzcyA9IHBhcnRpY2xlLm1hc3MgKyBvdGhlclBhcnRpY2xlLm1hc3M7XG4gICAgICAgICAgYXZlcmFnZU1hc3MxID0gdGhpcy5tYXNzID8gb3RoZXJQYXJ0aWNsZS5tYXNzIC8gdG90YWxNYXNzIDogMC41O1xuICAgICAgICAgIGF2ZXJhZ2VNYXNzMiA9IHRoaXMubWFzcyA/IHBhcnRpY2xlLm1hc3MgLyB0b3RhbE1hc3MgOiAwLjU7XG5cbiAgICAgICAgICBwYXJ0aWNsZS5wLmFkZChcbiAgICAgICAgICAgIHRoaXMuZGVsdGFcbiAgICAgICAgICAgICAgLmNsb25lKClcbiAgICAgICAgICAgICAgLm5vcm1hbGl6ZSgpXG4gICAgICAgICAgICAgIC5tdWx0aXBseVNjYWxhcihvdmVybGFwICogLWF2ZXJhZ2VNYXNzMSlcbiAgICAgICAgICApO1xuICAgICAgICAgIG90aGVyUGFydGljbGUucC5hZGQodGhpcy5kZWx0YS5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcihvdmVybGFwICogYXZlcmFnZU1hc3MyKSk7XG5cbiAgICAgICAgICB0aGlzLmNhbGxiYWNrICYmIHRoaXMuY2FsbGJhY2socGFydGljbGUsIG90aGVyUGFydGljbGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IEJlaGF2aW91ciBmcm9tIFwiLi9CZWhhdmlvdXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ3Jvc3Nab25lIGV4dGVuZHMgQmVoYXZpb3VyIHtcbiAgLyoqXG4gICAqIERlZmluZXMgd2hhdCBoYXBwZW5zIGlmIHRoZSBwYXJ0aWNsZXMgY29tZSB0byB0aGUgZW5kIG9mIHRoZSBzcGVjaWZpZWQgem9uZVxuICAgKlxuICAgKiBAbWVtYmVyb2YhIFByb3RvbiNcbiAgICogQGF1Z21lbnRzIFByb3Rvbi5CZWhhdmlvdXJcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBhbGlhcyBQcm90b24uQ3Jvc3Nab25lXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlpvbmV9IHpvbmUgXHRcdFx0XHRcdFx0Y2FuIGJlIGFueSBQcm90b24uWm9uZSAtIGUuZy4gUHJvdG9uLlJlY3Rab25lKClcbiAgICogQHBhcmFtIHtTdHJpbmd9IFx0XHRbY3Jvc3NUeXBlPWRlYWRdIFx0XHRcdHdoYXQgaGFwcGVucyBpZiB0aGUgcGFydGljbGVzIHBhc3MgdGhlIHpvbmUgLSBhbGxvd2VkIHN0cmluZ3M6IGRlYWQgfCBib3VuZCB8IGNyb3NzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBcdFx0W2xpZmU9SW5maW5pdHldIFx0XHRcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gXHRcdFtlYXNpbmc9ZWFzZS5lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBuYW1lIFRoZSBCZWhhdmlvdXIgbmFtZVxuICAgKi9cbiAgY29uc3RydWN0b3Ioem9uZSwgY3Jvc3NUeXBlLCBsaWZlLCBlYXNpbmcpIHtcbiAgICBzdXBlcihsaWZlLCBlYXNpbmcpO1xuXG4gICAgdGhpcy5yZXNldCh6b25lLCBjcm9zc1R5cGUpO1xuICAgIHRoaXMubmFtZSA9IFwiQ3Jvc3Nab25lXCI7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhpcyBiZWhhdmlvdXIncyBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIEBtZXRob2QgcmVzZXRcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uQ3Jvc3Nab25lXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5ab25lfSB6b25lIFx0XHRcdFx0Y2FuIGJlIGFueSBQcm90b24uWm9uZSAtIGUuZy4gUHJvdG9uLlJlY3Rab25lKClcbiAgICogQHBhcmFtIHtTdHJpbmd9IFx0XHRbY3Jvc3NUeXBlPWRlYWRdIFx0d2hhdCBoYXBwZW5zIGlmIHRoZSBwYXJ0aWNsZXMgcGFzcyB0aGUgem9uZSAtIGFsbG93ZWQgc3RyaW5nczogZGVhZCB8IGJvdW5kIHwgY3Jvc3NcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFx0XHRbbGlmZT1JbmZpbml0eV0gXHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFx0XHRbZWFzaW5nPWVhc2VMaW5lYXJdXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKi9cbiAgcmVzZXQoem9uZSwgY3Jvc3NUeXBlLCBsaWZlLCBlYXNpbmcpIHtcbiAgICB0aGlzLnpvbmUgPSB6b25lO1xuICAgIHRoaXMuem9uZS5jcm9zc1R5cGUgPSBVdGlsLmluaXRWYWx1ZShjcm9zc1R5cGUsIFwiZGVhZFwiKTtcblxuICAgIGxpZmUgJiYgc3VwZXIucmVzZXQobGlmZSwgZWFzaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSB0aGlzIGJlaGF2aW91ciBmb3IgYWxsIHBhcnRpY2xlcyBldmVyeSB0aW1lXG4gICAqXG4gICAqIEBtZXRob2QgYXBwbHlCZWhhdmlvdXJcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uQ3Jvc3Nab25lXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5QYXJ0aWNsZX0gcGFydGljbGVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHRoZSBpbnRlZ3JhdGUgdGltZSAxL21zXG4gICAqIEBwYXJhbSB7SW50fSB0aGUgcGFydGljbGUgaW5kZXhcbiAgICovXG4gIGFwcGx5QmVoYXZpb3VyKHBhcnRpY2xlLCB0aW1lLCBpbmRleCkge1xuICAgIHRoaXMuY2FsY3VsYXRlKHBhcnRpY2xlLCB0aW1lLCBpbmRleCk7XG4gICAgdGhpcy56b25lLmNyb3NzaW5nKHBhcnRpY2xlKTtcbiAgfVxufVxuIiwiaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBTcGFuIGZyb20gXCIuLi9tYXRoL1NwYW5cIjtcbmltcG9ydCBCZWhhdmlvdXIgZnJvbSBcIi4vQmVoYXZpb3VyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFscGhhIGV4dGVuZHMgQmVoYXZpb3VyIHtcbiAgLyoqXG4gICAqIEBtZW1iZXJvZiEgUHJvdG9uI1xuICAgKiBAYXVnbWVudHMgUHJvdG9uLkJlaGF2aW91clxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGFsaWFzIFByb3Rvbi5BbHBoYVxuICAgKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb24gZm9yICdhJyBhbmQgJ2InXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBhXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBiXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gXHRcdFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZS5lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBuYW1lIFRoZSBCZWhhdmlvdXIgbmFtZVxuICAgKi9cbiAgY29uc3RydWN0b3IoYSwgYiwgbGlmZSwgZWFzaW5nKSB7XG4gICAgc3VwZXIobGlmZSwgZWFzaW5nKTtcblxuICAgIHRoaXMucmVzZXQoYSwgYik7XG4gICAgdGhpcy5uYW1lID0gXCJBbHBoYVwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoaXMgYmVoYXZpb3VyJ3MgcGFyYW1ldGVyc1xuICAgKlxuICAgKiBAbWV0aG9kIHJlc2V0XG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkFscGhhXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb24gZm9yICdhJyBhbmQgJ2InXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBhXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBiXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gXHRcdFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZS5lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqL1xuICByZXNldChhLCBiLCBsaWZlLCBlYXNpbmcpIHtcbiAgICB0aGlzLnNhbWUgPSBiID09PSBudWxsIHx8IGIgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBmYWxzZTtcbiAgICB0aGlzLmEgPSBTcGFuLnNldFNwYW5WYWx1ZShVdGlsLmluaXRWYWx1ZShhLCAxKSk7XG4gICAgdGhpcy5iID0gU3Bhbi5zZXRTcGFuVmFsdWUoYik7XG5cbiAgICBsaWZlICYmIHN1cGVyLnJlc2V0KGxpZmUsIGVhc2luZyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgbmV3IGFscGhhIHZhbHVlIG9mIHRoZSBwYXJ0aWNsZVxuICAgKlxuICAgKiBAbWV0aG9kIGluaXRpYWxpemVcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uQWxwaGFcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlBhcnRpY2xlfSBwYXJ0aWNsZSBBIHNpbmdsZSBQcm90b24gZ2VuZXJhdGVkIHBhcnRpY2xlXG4gICAqL1xuICBpbml0aWFsaXplKHBhcnRpY2xlKSB7XG4gICAgcGFydGljbGUuZGF0YS5hbHBoYUEgPSB0aGlzLmEuZ2V0VmFsdWUoKTtcblxuICAgIGlmICh0aGlzLnNhbWUpIHBhcnRpY2xlLmRhdGEuYWxwaGFCID0gcGFydGljbGUuZGF0YS5hbHBoYUE7XG4gICAgZWxzZSBwYXJ0aWNsZS5kYXRhLmFscGhhQiA9IHRoaXMuYi5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYXBwbHlCZWhhdmlvdXJcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uQWxwaGFcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlBhcnRpY2xlfSBwYXJ0aWNsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gXHRcdFx0dGltZSB0aGUgaW50ZWdyYXRlIHRpbWUgMS9tc1xuICAgKiBAcGFyYW0ge0ludH0gXHRcdFx0aW5kZXggdGhlIHBhcnRpY2xlIGluZGV4XG4gICAqL1xuICBhcHBseUJlaGF2aW91cihwYXJ0aWNsZSwgdGltZSwgaW5kZXgpIHtcbiAgICB0aGlzLmNhbGN1bGF0ZShwYXJ0aWNsZSwgdGltZSwgaW5kZXgpO1xuXG4gICAgcGFydGljbGUuYWxwaGEgPSBwYXJ0aWNsZS5kYXRhLmFscGhhQiArIChwYXJ0aWNsZS5kYXRhLmFscGhhQSAtIHBhcnRpY2xlLmRhdGEuYWxwaGFCKSAqIHRoaXMuZW5lcmd5O1xuXG4gICAgaWYgKHBhcnRpY2xlLmFscGhhIDwgMC4wMDEpIHBhcnRpY2xlLmFscGhhID0gMDtcbiAgfVxufVxuIiwiaW1wb3J0IFNwYW4gZnJvbSBcIi4uL21hdGgvU3BhblwiO1xuaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBCZWhhdmlvdXIgZnJvbSBcIi4vQmVoYXZpb3VyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNjYWxlIGV4dGVuZHMgQmVoYXZpb3VyIHtcbiAgLyoqXG4gICAqIEBtZW1iZXJvZiEgUHJvdG9uI1xuICAgKiBAYXVnbWVudHMgUHJvdG9uLkJlaGF2aW91clxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGFsaWFzIFByb3Rvbi5TY2FsZVxuICAgKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb24gZm9yICdhJyBhbmQgJ2InXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBhXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBiXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gXHRcdFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZS5lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBuYW1lIFRoZSBCZWhhdmlvdXIgbmFtZVxuICAgKi9cbiAgY29uc3RydWN0b3IoYSwgYiwgbGlmZSwgZWFzaW5nKSB7XG4gICAgc3VwZXIobGlmZSwgZWFzaW5nKTtcblxuICAgIHRoaXMucmVzZXQoYSwgYik7XG4gICAgdGhpcy5uYW1lID0gXCJTY2FsZVwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoaXMgYmVoYXZpb3VyJ3MgcGFyYW1ldGVyc1xuICAgKlxuICAgKiBAbWV0aG9kIHJlc2V0XG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlNjYWxlXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gYVxuICAgKiBAcGFyYW0ge1N0cmluZ30gYlxuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldIFx0XHRcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2UuZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKi9cbiAgcmVzZXQoYSwgYiwgbGlmZSwgZWFzaW5nKSB7XG4gICAgdGhpcy5zYW1lID0gYiA9PT0gbnVsbCB8fCBiID09PSB1bmRlZmluZWQgPyB0cnVlIDogZmFsc2U7XG4gICAgdGhpcy5hID0gU3Bhbi5zZXRTcGFuVmFsdWUoVXRpbC5pbml0VmFsdWUoYSwgMSkpO1xuICAgIHRoaXMuYiA9IFNwYW4uc2V0U3BhblZhbHVlKGIpO1xuXG4gICAgbGlmZSAmJiBzdXBlci5yZXNldChsaWZlLCBlYXNpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGJlaGF2aW91cidzIHBhcmFtZXRlcnMgZm9yIGFsbCBwYXJ0aWNsZXNcbiAgICpcbiAgICogQG1ldGhvZCBpbml0aWFsaXplXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlNjYWxlXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5QYXJ0aWNsZX0gcGFydGljbGVcbiAgICovXG4gIGluaXRpYWxpemUocGFydGljbGUpIHtcbiAgICBwYXJ0aWNsZS5kYXRhLnNjYWxlQSA9IHRoaXMuYS5nZXRWYWx1ZSgpO1xuICAgIHBhcnRpY2xlLmRhdGEub2xkUmFkaXVzID0gcGFydGljbGUucmFkaXVzO1xuICAgIHBhcnRpY2xlLmRhdGEuc2NhbGVCID0gdGhpcy5zYW1lID8gcGFydGljbGUuZGF0YS5zY2FsZUEgOiB0aGlzLmIuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSB0aGlzIGJlaGF2aW91ciBmb3IgYWxsIHBhcnRpY2xlcyBldmVyeSB0aW1lXG4gICAqXG4gICAqIEBtZXRob2QgYXBwbHlCZWhhdmlvdXJcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uU2NhbGVcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlBhcnRpY2xlfSBwYXJ0aWNsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gXHRcdFx0dGltZSB0aGUgaW50ZWdyYXRlIHRpbWUgMS9tc1xuICAgKiBAcGFyYW0ge0ludH0gXHRcdFx0aW5kZXggdGhlIHBhcnRpY2xlIGluZGV4XG4gICAqL1xuICBhcHBseUJlaGF2aW91cihwYXJ0aWNsZSwgdGltZSwgaW5kZXgpIHtcbiAgICB0aGlzLmNhbGN1bGF0ZShwYXJ0aWNsZSwgdGltZSwgaW5kZXgpO1xuICAgIHBhcnRpY2xlLnNjYWxlID0gcGFydGljbGUuZGF0YS5zY2FsZUIgKyAocGFydGljbGUuZGF0YS5zY2FsZUEgLSBwYXJ0aWNsZS5kYXRhLnNjYWxlQikgKiB0aGlzLmVuZXJneTtcblxuICAgIGlmIChwYXJ0aWNsZS5zY2FsZSA8IDAuMDAwMSkgcGFydGljbGUuc2NhbGUgPSAwO1xuICAgIHBhcnRpY2xlLnJhZGl1cyA9IHBhcnRpY2xlLmRhdGEub2xkUmFkaXVzICogcGFydGljbGUuc2NhbGU7XG4gIH1cbn1cbiIsImltcG9ydCBTcGFuIGZyb20gXCIuLi9tYXRoL1NwYW5cIjtcbmltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgQmVoYXZpb3VyIGZyb20gXCIuL0JlaGF2aW91clwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSb3RhdGUgZXh0ZW5kcyBCZWhhdmlvdXIge1xuICAvKipcbiAgICogQG1lbWJlcm9mISBQcm90b24jXG4gICAqIEBhdWdtZW50cyBQcm90b24uQmVoYXZpb3VyXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAYWxpYXMgUHJvdG9uLlJvdGF0ZVxuICAgKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb24gZm9yICdhJywgJ2InIGFuZCAnc3R5bGUnXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbaW5mbHVlbmNlPVZlbG9jaXR5XSBUaGUgcm90YXRpb24ncyBpbmZsdWVuY2VcbiAgICogQHBhcmFtIHtTdHJpbmd9IGJcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtzdHlsZT10b11cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XSBcdFx0XHRcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlLmVhc2VMaW5lYXJdIFx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICpcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IG5hbWUgVGhlIEJlaGF2aW91ciBuYW1lXG4gICAqL1xuICBjb25zdHJ1Y3RvcihpbmZsdWVuY2UsIGIsIHN0eWxlLCBsaWZlLCBlYXNpbmcpIHtcbiAgICBzdXBlcihsaWZlLCBlYXNpbmcpO1xuXG4gICAgdGhpcy5yZXNldChpbmZsdWVuY2UsIGIsIHN0eWxlKTtcbiAgICB0aGlzLm5hbWUgPSBcIlJvdGF0ZVwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoaXMgYmVoYXZpb3VyJ3MgcGFyYW1ldGVyc1xuICAgKlxuICAgKiBAbWV0aG9kIHJlc2V0XG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlJvdGF0ZVxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uIGZvciAnYScsICdiJyBhbmQgJ3N0eWxlJ1xuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gYVxuICAgKiBAcGFyYW0ge1N0cmluZ30gYlxuICAgKiBAcGFyYW0ge1N0cmluZ30gW3N0eWxlPXRvXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldIFx0XHRcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2UuZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKi9cbiAgcmVzZXQoYSwgYiwgc3R5bGUsIGxpZmUsIGVhc2luZykge1xuICAgIHRoaXMuc2FtZSA9IGIgPT09IG51bGwgfHwgYiA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IGZhbHNlO1xuXG4gICAgdGhpcy5hID0gU3Bhbi5zZXRTcGFuVmFsdWUoVXRpbC5pbml0VmFsdWUoYSwgXCJWZWxvY2l0eVwiKSk7XG4gICAgdGhpcy5iID0gU3Bhbi5zZXRTcGFuVmFsdWUoVXRpbC5pbml0VmFsdWUoYiwgMCkpO1xuICAgIHRoaXMuc3R5bGUgPSBVdGlsLmluaXRWYWx1ZShzdHlsZSwgXCJ0b1wiKTtcblxuICAgIGxpZmUgJiYgc3VwZXIucmVzZXQobGlmZSwgZWFzaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBiZWhhdmlvdXIncyBwYXJhbWV0ZXJzIGZvciBhbGwgcGFydGljbGVzXG4gICAqXG4gICAqIEBtZXRob2QgaW5pdGlhbGl6ZVxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5Sb3RhdGVcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlBhcnRpY2xlfSBwYXJ0aWNsZVxuICAgKi9cbiAgaW5pdGlhbGl6ZShwYXJ0aWNsZSkge1xuICAgIHBhcnRpY2xlLnJvdGF0aW9uID0gdGhpcy5hLmdldFZhbHVlKCk7XG4gICAgcGFydGljbGUuZGF0YS5yb3RhdGlvbkEgPSB0aGlzLmEuZ2V0VmFsdWUoKTtcblxuICAgIGlmICghdGhpcy5zYW1lKSBwYXJ0aWNsZS5kYXRhLnJvdGF0aW9uQiA9IHRoaXMuYi5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IHRoaXMgYmVoYXZpb3VyIGZvciBhbGwgcGFydGljbGVzIGV2ZXJ5IHRpbWVcbiAgICpcbiAgICogQG1ldGhvZCBhcHBseUJlaGF2aW91clxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5Sb3RhdGVcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlBhcnRpY2xlfSBwYXJ0aWNsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gXHRcdFx0dGltZSB0aGUgaW50ZWdyYXRlIHRpbWUgMS9tc1xuICAgKiBAcGFyYW0ge0ludH0gXHRcdFx0aW5kZXggdGhlIHBhcnRpY2xlIGluZGV4XG4gICAqL1xuICBhcHBseUJlaGF2aW91cihwYXJ0aWNsZSwgdGltZSwgaW5kZXgpIHtcbiAgICB0aGlzLmNhbGN1bGF0ZShwYXJ0aWNsZSwgdGltZSwgaW5kZXgpO1xuXG4gICAgaWYgKCF0aGlzLnNhbWUpIHtcbiAgICAgIGlmICh0aGlzLnN0eWxlID09PSBcInRvXCIgfHwgdGhpcy5zdHlsZSA9PT0gXCJUT1wiIHx8IHRoaXMuc3R5bGUgPT09IFwiX1wiKSB7XG4gICAgICAgIHBhcnRpY2xlLnJvdGF0aW9uICs9XG4gICAgICAgICAgcGFydGljbGUuZGF0YS5yb3RhdGlvbkIgKyAocGFydGljbGUuZGF0YS5yb3RhdGlvbkEgLSBwYXJ0aWNsZS5kYXRhLnJvdGF0aW9uQikgKiB0aGlzLmVuZXJneTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnRpY2xlLnJvdGF0aW9uICs9IHBhcnRpY2xlLmRhdGEucm90YXRpb25CO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5hLmEgPT09IFwiVlwiIHx8IHRoaXMuYS5hID09PSBcIlZlbG9jaXR5XCIgfHwgdGhpcy5hLmEgPT09IFwidlwiKSB7XG4gICAgICAvLyBiZXRhLi4uXG4gICAgICBwYXJ0aWNsZS5yb3RhdGlvbiA9IHBhcnRpY2xlLmdldERpcmVjdGlvbigpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IENvbG9yVXRpbCBmcm9tIFwiLi4vdXRpbHMvQ29sb3JVdGlsXCI7XG5pbXBvcnQgQXJyYXlTcGFuIGZyb20gXCIuLi9tYXRoL0FycmF5U3BhblwiO1xuaW1wb3J0IEJlaGF2aW91ciBmcm9tIFwiLi9CZWhhdmlvdXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29sb3IgZXh0ZW5kcyBCZWhhdmlvdXIge1xuICAvKipcbiAgICogQG1lbWJlcm9mISBQcm90b24jXG4gICAqIEBhdWdtZW50cyBQcm90b24uQmVoYXZpb3VyXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAYWxpYXMgUHJvdG9uLkNvbG9yXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLkFycmF5U3BhbiB8IFN0cmluZ30gYSB0aGUgc3RyaW5nIHNob3VsZCBiZSBhIGhleCBlLmcuICMwMDAwMDAgZm9yIGJsYWNrXG4gICAqIEBwYXJhbSB7UHJvdG9uLkFycmF5U3BhbiB8IFN0cmluZ30gYiB0aGUgc3RyaW5nIHNob3VsZCBiZSBhIGhleCBlLmcuICMwMDAwMDAgZm9yIGJsYWNrXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gXHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gbmFtZSBUaGUgQmVoYXZpb3VyIG5hbWVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGEsIGIsIGxpZmUsIGVhc2luZykge1xuICAgIHN1cGVyKGxpZmUsIGVhc2luZyk7XG5cbiAgICB0aGlzLnJlc2V0KGEsIGIpO1xuICAgIHRoaXMubmFtZSA9IFwiQ29sb3JcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGlzIGJlaGF2aW91cidzIHBhcmFtZXRlcnNcbiAgICpcbiAgICogQG1ldGhvZCByZXNldFxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5Db2xvclxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uQXJyYXlTcGFuIHwgU3RyaW5nfSBhIHRoZSBzdHJpbmcgc2hvdWxkIGJlIGEgaGV4IGUuZy4gIzAwMDAwMCBmb3IgYmxhY2tcbiAgICogQHBhcmFtIHtQcm90b24uQXJyYXlTcGFuIHwgU3RyaW5nfSBiIHRoZSBzdHJpbmcgc2hvdWxkIGJlIGEgaGV4IGUuZy4gIzAwMDAwMCBmb3IgYmxhY2tcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XSBcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqL1xuICByZXNldChhLCBiLCBsaWZlLCBlYXNpbmcpIHtcbiAgICB0aGlzLmEgPSBBcnJheVNwYW4uY3JlYXRlQXJyYXlTcGFuKGEpO1xuICAgIHRoaXMuYiA9IEFycmF5U3Bhbi5jcmVhdGVBcnJheVNwYW4oYik7XG4gICAgbGlmZSAmJiBzdXBlci5yZXNldChsaWZlLCBlYXNpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGJlaGF2aW91cidzIHBhcmFtZXRlcnMgZm9yIGFsbCBwYXJ0aWNsZXNcbiAgICpcbiAgICogQG1ldGhvZCBpbml0aWFsaXplXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkNvbG9yXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5QYXJ0aWNsZX0gcGFydGljbGVcbiAgICovXG4gIGluaXRpYWxpemUocGFydGljbGUpIHtcbiAgICBwYXJ0aWNsZS5jb2xvciA9IHRoaXMuYS5nZXRWYWx1ZSgpO1xuICAgIHBhcnRpY2xlLmRhdGEuY29sb3JBID0gQ29sb3JVdGlsLmhleFRvUmdiKHBhcnRpY2xlLmNvbG9yKTtcblxuICAgIGlmICh0aGlzLmIpIHBhcnRpY2xlLmRhdGEuY29sb3JCID0gQ29sb3JVdGlsLmhleFRvUmdiKHRoaXMuYi5nZXRWYWx1ZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSB0aGlzIGJlaGF2aW91ciBmb3IgYWxsIHBhcnRpY2xlcyBldmVyeSB0aW1lXG4gICAqXG4gICAqIEBtZXRob2QgYXBwbHlCZWhhdmlvdXJcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uQ29sb3JcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlBhcnRpY2xlfSBwYXJ0aWNsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gdGhlIGludGVncmF0ZSB0aW1lIDEvbXNcbiAgICogQHBhcmFtIHtJbnR9IHRoZSBwYXJ0aWNsZSBpbmRleFxuICAgKi9cbiAgYXBwbHlCZWhhdmlvdXIocGFydGljbGUsIHRpbWUsIGluZGV4KSB7XG4gICAgaWYgKHRoaXMuYikge1xuICAgICAgdGhpcy5jYWxjdWxhdGUocGFydGljbGUsIHRpbWUsIGluZGV4KTtcblxuICAgICAgcGFydGljbGUucmdiLnIgPSBwYXJ0aWNsZS5kYXRhLmNvbG9yQi5yICsgKHBhcnRpY2xlLmRhdGEuY29sb3JBLnIgLSBwYXJ0aWNsZS5kYXRhLmNvbG9yQi5yKSAqIHRoaXMuZW5lcmd5O1xuICAgICAgcGFydGljbGUucmdiLmcgPSBwYXJ0aWNsZS5kYXRhLmNvbG9yQi5nICsgKHBhcnRpY2xlLmRhdGEuY29sb3JBLmcgLSBwYXJ0aWNsZS5kYXRhLmNvbG9yQi5nKSAqIHRoaXMuZW5lcmd5O1xuICAgICAgcGFydGljbGUucmdiLmIgPSBwYXJ0aWNsZS5kYXRhLmNvbG9yQi5iICsgKHBhcnRpY2xlLmRhdGEuY29sb3JBLmIgLSBwYXJ0aWNsZS5kYXRhLmNvbG9yQi5iKSAqIHRoaXMuZW5lcmd5O1xuXG4gICAgICBwYXJ0aWNsZS5yZ2IuciA9IHBhcnRpY2xlLnJnYi5yIDw8IDA7XG4gICAgICBwYXJ0aWNsZS5yZ2IuZyA9IHBhcnRpY2xlLnJnYi5nIDw8IDA7XG4gICAgICBwYXJ0aWNsZS5yZ2IuYiA9IHBhcnRpY2xlLnJnYi5iIDw8IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcnRpY2xlLnJnYi5yID0gcGFydGljbGUuZGF0YS5jb2xvckEucjtcbiAgICAgIHBhcnRpY2xlLnJnYi5nID0gcGFydGljbGUuZGF0YS5jb2xvckEuZztcbiAgICAgIHBhcnRpY2xlLnJnYi5iID0gcGFydGljbGUuZGF0YS5jb2xvckEuYjtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBNYXRoVXRpbCBmcm9tIFwiLi4vbWF0aC9NYXRoVXRpbFwiO1xuaW1wb3J0IFZlY3RvcjJEIGZyb20gXCIuLi9tYXRoL1ZlY3RvcjJEXCI7XG5pbXBvcnQgU3BhbiBmcm9tIFwiLi4vbWF0aC9TcGFuXCI7XG5pbXBvcnQgQmVoYXZpb3VyIGZyb20gXCIuL0JlaGF2aW91clwiO1xuXG5jb25zdCBDSEFOR0lORyA9IFwiY2hhbmdpbmdcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ3ljbG9uZSBleHRlbmRzIEJlaGF2aW91ciB7XG4gIC8qKlxuICAgKiBAbWVtYmVyb2YhIFByb3RvbiNcbiAgICogQGF1Z21lbnRzIFByb3Rvbi5CZWhhdmlvdXJcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBhbGlhcyBQcm90b24uQ3ljbG9uZVxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gYW5nbGVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGZvcmNlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gXHRcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2UuZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gbmFtZSBUaGUgQmVoYXZpb3VyIG5hbWVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGFuZ2xlLCBmb3JjZSwgbGlmZSwgZWFzaW5nKSB7XG4gICAgc3VwZXIobGlmZSwgZWFzaW5nKTtcbiAgICB0aGlzLnNldEFuZ2xlQW5kRm9yY2UoYW5nbGUsIGZvcmNlKTtcbiAgICB0aGlzLm5hbWUgPSBcIkN5Y2xvbmVcIjtcbiAgfVxuXG4gIHNldEFuZ2xlQW5kRm9yY2UoYW5nbGUsIGZvcmNlKSB7XG4gICAgdGhpcy5mb3JjZSA9IENIQU5HSU5HO1xuICAgIHRoaXMuYW5nbGUgPSBNYXRoVXRpbC5QSSAvIDI7XG5cbiAgICBpZiAoYW5nbGUgPT09IFwicmlnaHRcIikge1xuICAgICAgdGhpcy5hbmdsZSA9IE1hdGhVdGlsLlBJIC8gMjtcbiAgICB9IGVsc2UgaWYgKGFuZ2xlID09PSBcImxlZnRcIikge1xuICAgICAgdGhpcy5hbmdsZSA9IC1NYXRoVXRpbC5QSSAvIDI7XG4gICAgfSBlbHNlIGlmIChhbmdsZSA9PT0gXCJyYW5kb21cIikge1xuICAgICAgdGhpcy5hbmdsZSA9IFwicmFuZG9tXCI7XG4gICAgfSBlbHNlIGlmIChhbmdsZSBpbnN0YW5jZW9mIFNwYW4pIHtcbiAgICAgIHRoaXMuYW5nbGUgPSBcInNwYW5cIjtcbiAgICAgIHRoaXMuc3BhbiA9IGFuZ2xlO1xuICAgIH0gZWxzZSBpZiAoYW5nbGUpIHtcbiAgICAgIHRoaXMuYW5nbGUgPSBhbmdsZTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBTdHJpbmcoZm9yY2UpLnRvTG93ZXJDYXNlKCkgPT09IFwiY2hhbmdpbmdcIiB8fFxuICAgICAgU3RyaW5nKGZvcmNlKS50b0xvd2VyQ2FzZSgpID09PSBcImNoYW5nXCIgfHxcbiAgICAgIFN0cmluZyhmb3JjZSkudG9Mb3dlckNhc2UoKSA9PT0gXCJhdXRvXCJcbiAgICApIHtcbiAgICAgIHRoaXMuZm9yY2UgPSBDSEFOR0lORztcbiAgICB9IGVsc2UgaWYgKGZvcmNlKSB7XG4gICAgICB0aGlzLmZvcmNlID0gZm9yY2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoaXMgYmVoYXZpb3VyJ3MgcGFyYW1ldGVyc1xuICAgKlxuICAgKiBAbWV0aG9kIHJlc2V0XG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkN5Y2xvbmVcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBhbmdsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gZm9yY2VcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XSBcdFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZS5lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqL1xuICByZXNldChhbmdsZSwgZm9yY2UsIGxpZmUsIGVhc2luZykge1xuICAgIHRoaXMuYW5nbGUgPSBNYXRoVXRpbC5QSSAvIDI7XG4gICAgdGhpcy5zZXRBbmdsZUFuZEZvcmNlKGFuZ2xlLCBmb3JjZSk7XG4gICAgbGlmZSAmJiBzdXBlci5yZXNldChsaWZlLCBlYXNpbmcpO1xuICB9XG5cbiAgaW5pdGlhbGl6ZShwYXJ0aWNsZSkge1xuICAgIGlmICh0aGlzLmFuZ2xlID09PSBcInJhbmRvbVwiKSB7XG4gICAgICBwYXJ0aWNsZS5kYXRhLmNhbmdsZSA9IE1hdGhVdGlsLnJhbmRvbUFUb0IoLU1hdGhVdGlsLlBJLCBNYXRoVXRpbC5QSSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmFuZ2xlID09PSBcInNwYW5cIikge1xuICAgICAgcGFydGljbGUuZGF0YS5jYW5nbGUgPSB0aGlzLnNwYW4uZ2V0VmFsdWUoKTtcbiAgICB9XG5cbiAgICBwYXJ0aWNsZS5kYXRhLmN5Y2xvbmUgPSBuZXcgVmVjdG9yMkQoMCwgMCk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgdGhpcyBiZWhhdmlvdXIgZm9yIGFsbCBwYXJ0aWNsZXMgZXZlcnkgdGltZVxuICAgKlxuICAgKiBAbWV0aG9kIGFwcGx5QmVoYXZpb3VyXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkN5Y2xvbmVcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlBhcnRpY2xlfSBwYXJ0aWNsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gdGhlIGludGVncmF0ZSB0aW1lIDEvbXNcbiAgICogQHBhcmFtIHtJbnR9IHRoZSBwYXJ0aWNsZSBpbmRleFxuICAgKi9cbiAgYXBwbHlCZWhhdmlvdXIocGFydGljbGUsIHRpbWUsIGluZGV4KSB7XG4gICAgdGhpcy5jYWxjdWxhdGUocGFydGljbGUsIHRpbWUsIGluZGV4KTtcblxuICAgIGxldCBsZW5ndGg7XG4gICAgbGV0IGdyYWRpZW50ID0gcGFydGljbGUudi5nZXRHcmFkaWVudCgpO1xuICAgIGlmICh0aGlzLmFuZ2xlID09PSBcInJhbmRvbVwiIHx8IHRoaXMuYW5nbGUgPT09IFwic3BhblwiKSB7XG4gICAgICBncmFkaWVudCArPSBwYXJ0aWNsZS5kYXRhLmNhbmdsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ3JhZGllbnQgKz0gdGhpcy5hbmdsZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5mb3JjZSA9PT0gQ0hBTkdJTkcpIHtcbiAgICAgIGxlbmd0aCA9IHBhcnRpY2xlLnYubGVuZ3RoKCkgLyAxMDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxlbmd0aCA9IHRoaXMuZm9yY2U7XG4gICAgfVxuXG4gICAgcGFydGljbGUuZGF0YS5jeWNsb25lLnggPSBsZW5ndGggKiBNYXRoLmNvcyhncmFkaWVudCk7XG4gICAgcGFydGljbGUuZGF0YS5jeWNsb25lLnkgPSBsZW5ndGggKiBNYXRoLnNpbihncmFkaWVudCk7XG4gICAgcGFydGljbGUuZGF0YS5jeWNsb25lID0gdGhpcy5ub3JtYWxpemVGb3JjZShwYXJ0aWNsZS5kYXRhLmN5Y2xvbmUpO1xuICAgIHBhcnRpY2xlLmEuYWRkKHBhcnRpY2xlLmRhdGEuY3ljbG9uZSk7XG4gIH1cbn1cbiIsImltcG9ydCBBdHRyYWN0aW9uIGZyb20gXCIuL0F0dHJhY3Rpb25cIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVwdWxzaW9uIGV4dGVuZHMgQXR0cmFjdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgb3BwaXNpdGUgb2YgUHJvdG9uLkF0dHJhY3Rpb24gLSB0dXJucyB0aGUgZm9yY2VcbiAgICpcbiAgICogQG1lbWJlcm9mISBQcm90b24jXG4gICAqIEBhdWdtZW50cyBQcm90b24jUHJvdG9uLkF0dHJhY3Rpb25cbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBhbGlhcyBQcm90b24uUmVwdWxzaW9uXG4gICAqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvbiBmb3IgJ2ZvcmNlJyBhbmQgJ3JhZGl1cydcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uVmVjdG9yMkR9IHRhcmdldFBvc2l0aW9uIHRoZSBhdHRyYWN0aW9uIHBvaW50IGNvb3JkaW5hdGVzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbZm9yY2U9MTAwXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW3JhZGl1cz0xMDAwXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldIFx0XHRcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2UuZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKlxuICAgKiBAcHJvcGVydHkge051bWJlcn0gZm9yY2VcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IG5hbWUgVGhlIEJlaGF2aW91ciBuYW1lXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih0YXJnZXRQb3NpdGlvbiwgZm9yY2UsIHJhZGl1cywgbGlmZSwgZWFzaW5nKSB7XG4gICAgc3VwZXIodGFyZ2V0UG9zaXRpb24sIGZvcmNlLCByYWRpdXMsIGxpZmUsIGVhc2luZyk7XG5cbiAgICB0aGlzLmZvcmNlICo9IC0xO1xuICAgIHRoaXMubmFtZSA9IFwiUmVwdWxzaW9uXCI7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhpcyBiZWhhdmlvdXIncyBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIEBtZXRob2QgcmVzZXRcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uUmVwdWxzaW9uXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb24gZm9yICdmb3JjZScgYW5kICdyYWRpdXMnXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlZlY3RvcjJEfSB0YXJnZXRQb3NpdGlvbiB0aGUgYXR0cmFjdGlvbiBwb2ludCBjb29yZGluYXRlc1xuICAgKiBAcGFyYW0ge051bWJlcn0gW2ZvcmNlPTEwMF1cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtyYWRpdXM9MTAwMF1cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XSBcdFx0XHRcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlLmVhc2VMaW5lYXJdIFx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICovXG4gIHJlc2V0KHRhcmdldFBvc2l0aW9uLCBmb3JjZSwgcmFkaXVzLCBsaWZlLCBlYXNpbmcpIHtcbiAgICBzdXBlci5yZXNldCh0YXJnZXRQb3NpdGlvbiwgZm9yY2UsIHJhZGl1cywgbGlmZSwgZWFzaW5nKTtcbiAgICB0aGlzLmZvcmNlICo9IC0xO1xuICB9XG59XG4iLCJpbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IFZlY3RvcjJEIGZyb20gXCIuLi9tYXRoL1ZlY3RvcjJEXCI7XG5pbXBvcnQgQmVoYXZpb3VyIGZyb20gXCIuL0JlaGF2aW91clwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHcmF2aXR5V2VsbCBleHRlbmRzIEJlaGF2aW91ciB7XG4gIC8qKlxuICAgKiBAbWVtYmVyb2YhIFByb3RvbiNcbiAgICogQGF1Z21lbnRzIEJlaGF2aW91clxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGFsaWFzIEdyYXZpdHlXZWxsXG4gICAqXG4gICAqIEBwYXJhbSB7VmVjdG9yMkR9IFtjZW50ZXJQb2ludD1uZXcgVmVjdG9yMkRdIFRoZSBwb2ludCBpbiB0aGUgY2VudGVyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbZm9yY2U9MTAwXVx0XHRcdFx0XHRUaGUgZm9yY2VcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XVx0XHRcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2VMaW5lYXJdXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gbmFtZSBUaGUgQmVoYXZpb3VyIG5hbWVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNlbnRlclBvaW50LCBmb3JjZSwgbGlmZSwgZWFzaW5nKSB7XG4gICAgc3VwZXIobGlmZSwgZWFzaW5nKTtcblxuICAgIHRoaXMuZGlzdGFuY2VWZWMgPSBuZXcgVmVjdG9yMkQoKTtcbiAgICB0aGlzLmNlbnRlclBvaW50ID0gVXRpbC5pbml0VmFsdWUoY2VudGVyUG9pbnQsIG5ldyBWZWN0b3IyRCgpKTtcbiAgICB0aGlzLmZvcmNlID0gVXRpbC5pbml0VmFsdWUodGhpcy5ub3JtYWxpemVWYWx1ZShmb3JjZSksIDEwMCk7XG5cbiAgICB0aGlzLm5hbWUgPSBcIkdyYXZpdHlXZWxsXCI7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhpcyBiZWhhdmlvdXIncyBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIEBtZXRob2QgcmVzZXRcbiAgICogQG1lbWJlcm9mIFByb3RvbiNHcmF2aXR5V2VsbFxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtWZWN0b3IyRH0gW2NlbnRlclBvaW50PW5ldyBWZWN0b3IyRF0gVGhlIHBvaW50IGluIHRoZSBjZW50ZXJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtmb3JjZT0xMDBdXHRcdFx0XHRcdFRoZSBmb3JjZVxuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldXHRcdFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZUxpbmVhcl1cdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqL1xuICByZXNldChjZW50ZXJQb2ludCwgZm9yY2UsIGxpZmUsIGVhc2luZykge1xuICAgIHRoaXMuZGlzdGFuY2VWZWMgPSBuZXcgVmVjdG9yMkQoKTtcbiAgICB0aGlzLmNlbnRlclBvaW50ID0gVXRpbC5pbml0VmFsdWUoY2VudGVyUG9pbnQsIG5ldyBWZWN0b3IyRCgpKTtcbiAgICB0aGlzLmZvcmNlID0gVXRpbC5pbml0VmFsdWUodGhpcy5ub3JtYWxpemVWYWx1ZShmb3JjZSksIDEwMCk7XG5cbiAgICBsaWZlICYmIHN1cGVyLnJlc2V0KGxpZmUsIGVhc2luZyk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXRkb2NcbiAgICovXG4gIGluaXRpYWxpemUocGFydGljbGUpIHt9XG5cbiAgLyoqXG4gICAqIEFwcGx5IHRoaXMgYmVoYXZpb3VyIGZvciBhbGwgcGFydGljbGVzIGV2ZXJ5IHRpbWVcbiAgICpcbiAgICogQG1ldGhvZCBhcHBseUJlaGF2aW91clxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI0dyYXZpdHlXZWxsXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1BhcnRpY2xlfSBwYXJ0aWNsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gdGhlIGludGVncmF0ZSB0aW1lIDEvbXNcbiAgICogQHBhcmFtIHtJbnR9IHRoZSBwYXJ0aWNsZSBpbmRleFxuICAgKi9cbiAgYXBwbHlCZWhhdmlvdXIocGFydGljbGUsIHRpbWUsIGluZGV4KSB7XG4gICAgdGhpcy5kaXN0YW5jZVZlYy5zZXQodGhpcy5jZW50ZXJQb2ludC54IC0gcGFydGljbGUucC54LCB0aGlzLmNlbnRlclBvaW50LnkgLSBwYXJ0aWNsZS5wLnkpO1xuICAgIGNvbnN0IGRpc3RhbmNlU3EgPSB0aGlzLmRpc3RhbmNlVmVjLmxlbmd0aFNxKCk7XG5cbiAgICBpZiAoZGlzdGFuY2VTcSAhPT0gMCkge1xuICAgICAgY29uc3QgZGlzdGFuY2UgPSB0aGlzLmRpc3RhbmNlVmVjLmxlbmd0aCgpO1xuICAgICAgY29uc3QgZmFjdG9yID0gKHRoaXMuZm9yY2UgKiB0aW1lKSAvIChkaXN0YW5jZVNxICogZGlzdGFuY2UpO1xuXG4gICAgICBwYXJ0aWNsZS52LnggKz0gZmFjdG9yICogdGhpcy5kaXN0YW5jZVZlYy54O1xuICAgICAgcGFydGljbGUudi55ICs9IGZhY3RvciAqIHRoaXMuZGlzdGFuY2VWZWMueTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBQcm9wVXRpbCBmcm9tIFwiLi4vdXRpbHMvUHJvcFV0aWxcIjtcbmltcG9ydCBJbml0aWFsaXplIGZyb20gXCIuL0luaXRpYWxpemVcIjtcbmltcG9ydCBNYXRoVXRpbCBmcm9tIFwiLi4vbWF0aC9NYXRoVXRpbFwiO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXRpYWxpemUoZW1pdHRlciwgcGFydGljbGUsIGluaXRpYWxpemVzKSB7XG4gICAgY29uc3QgbGVuZ3RoID0gaW5pdGlhbGl6ZXMubGVuZ3RoO1xuICAgIGxldCBpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaW5pdGlhbGl6ZXNbaV0gaW5zdGFuY2VvZiBJbml0aWFsaXplKSB7XG4gICAgICAgIGluaXRpYWxpemVzW2ldLmluaXQoZW1pdHRlciwgcGFydGljbGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pbml0KGVtaXR0ZXIsIHBhcnRpY2xlLCBpbml0aWFsaXplc1tpXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5iaW5kRW1pdHRlcihlbWl0dGVyLCBwYXJ0aWNsZSk7XG4gIH0sXG5cbiAgLy8gaW5pdFxuICBpbml0KGVtaXR0ZXIsIHBhcnRpY2xlLCBpbml0aWFsaXplKSB7XG4gICAgUHJvcFV0aWwuc2V0UHJvcChwYXJ0aWNsZSwgaW5pdGlhbGl6ZSk7XG4gICAgUHJvcFV0aWwuc2V0VmVjdG9yVmFsKHBhcnRpY2xlLCBpbml0aWFsaXplKTtcbiAgfSxcblxuICBiaW5kRW1pdHRlcihlbWl0dGVyLCBwYXJ0aWNsZSkge1xuICAgIGlmIChlbWl0dGVyLmJpbmRFbWl0dGVyKSB7XG4gICAgICBwYXJ0aWNsZS5wLmFkZChlbWl0dGVyLnApO1xuICAgICAgcGFydGljbGUudi5hZGQoZW1pdHRlci52KTtcbiAgICAgIHBhcnRpY2xlLmEuYWRkKGVtaXR0ZXIuYSk7XG5cbiAgICAgIHBhcnRpY2xlLnYucm90YXRlKE1hdGhVdGlsLmRlZ3JlZVRyYW5zZm9ybShlbWl0dGVyLnJvdGF0aW9uKSk7XG4gICAgfVxuICB9XG59O1xuIiwiaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBQdWlkIGZyb20gXCIuLi91dGlscy9QdWlkXCI7XG5pbXBvcnQgUGFydGljbGUgZnJvbSBcIi4uL2NvcmUvUGFydGljbGVcIjtcbmltcG9ydCBFdmVudERpc3BhdGNoZXIgZnJvbSBcIi4uL2V2ZW50cy9FdmVudERpc3BhdGNoZXJcIjtcblxuaW1wb3J0IFJhdGUgZnJvbSBcIi4uL2luaXRpYWxpemUvUmF0ZVwiO1xuaW1wb3J0IEluaXRpYWxpemVVdGlsIGZyb20gXCIuLi9pbml0aWFsaXplL0luaXRpYWxpemVVdGlsXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVtaXR0ZXIgZXh0ZW5kcyBQYXJ0aWNsZSB7XG4gIC8qKlxuICAgKiBZb3UgY2FuIHVzZSB0aGlzIGVtaXQgcGFydGljbGVzLlxuICAgKlxuICAgKiBJdCB3aWxsIGRpc3BhdGNoIGZvbGxvdyBldmVudHM6XG4gICAqIFBBUlRJQ0xFX0NSRUFURURcbiAgICogUEFSVElDTEVfVVBEQVRBXG4gICAqIFBBUlRJQ0xFX0RFQURcbiAgICpcbiAgICogQGNsYXNzIEVtaXR0ZXJcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjb25mIHRoZSBwYXJhbWV0ZXJzIG9iamVjdDtcbiAgICogZm9yIGV4YW1wbGUge2RhbXBpbmc6MC4wMSxiaW5kRW1pdHRlcjpmYWxzZX1cbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmYgPSB7fSkge1xuICAgIHN1cGVyKGNvbmYpO1xuXG4gICAgdGhpcy5wYXJ0aWNsZXMgPSBbXTtcbiAgICB0aGlzLmJlaGF2aW91cnMgPSBbXTtcbiAgICB0aGlzLmluaXRpYWxpemVzID0gW107XG5cbiAgICB0aGlzLmVtaXRUaW1lID0gMDtcbiAgICB0aGlzLmVtaXRTcGVlZCA9IDA7XG4gICAgdGhpcy50b3RhbFRpbWUgPSAtMTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBmcmljdGlvbiBjb2VmZmljaWVudCBmb3IgYWxsIHBhcnRpY2xlIGVtaXQgYnkgVGhpcztcbiAgICAgKiBAcHJvcGVydHkgZGFtcGluZ1xuICAgICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAgICogQGRlZmF1bHQgMC4wMDZcbiAgICAgKi9cbiAgICB0aGlzLmRhbXBpbmcgPSAwLjAwNjtcblxuICAgIC8qKlxuICAgICAqIElmIGJpbmRFbWl0dGVyIHRoZSBwYXJ0aWNsZXMgY2FuIGJpbmQgdGhpcyBlbWl0dGVyJ3MgcHJvcGVydHk7XG4gICAgICogQHByb3BlcnR5IGJpbmRFbWl0dGVyXG4gICAgICogQHR5cGUge0Jvb2xlYW59XG4gICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAqL1xuICAgIHRoaXMuYmluZEVtaXR0ZXIgPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBwYXJ0aWNsZXMgcGVyIHNlY29uZCBlbWl0IChhIFtwYXJ0aWNsZV0vYiBbc10pO1xuICAgICAqIEBwcm9wZXJ0eSByYXRlXG4gICAgICogQHR5cGUge1JhdGV9XG4gICAgICogQGRlZmF1bHQgUmF0ZSgxLCAuMSlcbiAgICAgKi9cbiAgICB0aGlzLnJhdGUgPSBuZXcgUmF0ZSgxLCAwLjEpO1xuXG4gICAgdGhpcy5uYW1lID0gXCJFbWl0dGVyXCI7XG4gICAgdGhpcy5pZCA9IFB1aWQuaWQodGhpcy5uYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzdGFydCBlbWl0IHBhcnRpY2xlXG4gICAqIEBtZXRob2QgZW1pdFxuICAgKiBAcGFyYW0ge051bWJlcn0gZW1pdFRpbWUgYmVnaW4gZW1pdCB0aW1lO1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbGlmZSB0aGUgbGlmZSBvZiB0aGlzIGVtaXR0ZXJcbiAgICovXG4gIGVtaXQodG90YWxUaW1lLCBsaWZlKSB7XG4gICAgdGhpcy5zdG9wZWQgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXRUaW1lID0gMDtcbiAgICB0aGlzLnRvdGFsVGltZSA9IFV0aWwuaW5pdFZhbHVlKHRvdGFsVGltZSwgSW5maW5pdHkpO1xuXG4gICAgaWYgKGxpZmUgPT09IHRydWUgfHwgbGlmZSA9PT0gXCJsaWZlXCIgfHwgbGlmZSA9PT0gXCJkZXN0cm95XCIpIHtcbiAgICAgIHRoaXMubGlmZSA9IHRvdGFsVGltZSA9PT0gXCJvbmNlXCIgPyAxIDogdGhpcy50b3RhbFRpbWU7XG4gICAgfSBlbHNlIGlmICghaXNOYU4obGlmZSkpIHtcbiAgICAgIHRoaXMubGlmZSA9IGxpZmU7XG4gICAgfVxuXG4gICAgdGhpcy5yYXRlLmluaXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzdG9wIGVtaXRpbmdcbiAgICogQG1ldGhvZCBzdG9wXG4gICAqL1xuICBzdG9wKCkge1xuICAgIHRoaXMudG90YWxUaW1lID0gLTE7XG4gICAgdGhpcy5lbWl0VGltZSA9IDA7XG4gICAgdGhpcy5zdG9wZWQgPSB0cnVlO1xuICB9XG5cbiAgcHJlRW1pdCh0aW1lKSB7XG4gICAgbGV0IG9sZFN0b3BlZCA9IHRoaXMuc3RvcGVkO1xuICAgIGxldCBvbGRFbWl0VGltZSA9IHRoaXMuZW1pdFRpbWU7XG4gICAgbGV0IG9sZFRvdGFsVGltZSA9IHRoaXMudG90YWxUaW1lO1xuXG4gICAgdGhpcy5zdG9wZWQgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXRUaW1lID0gMDtcbiAgICB0aGlzLnRvdGFsVGltZSA9IHRpbWU7XG4gICAgdGhpcy5yYXRlLmluaXQoKTtcblxuICAgIGNvbnN0IHN0ZXAgPSAwLjAxNjc7XG4gICAgd2hpbGUgKHRpbWUgPiBzdGVwKSB7XG4gICAgICB0aW1lIC09IHN0ZXA7XG4gICAgICB0aGlzLnVwZGF0ZShzdGVwKTtcbiAgICB9XG5cbiAgICB0aGlzLnN0b3BlZCA9IG9sZFN0b3BlZDtcbiAgICB0aGlzLmVtaXRUaW1lID0gb2xkRW1pdFRpbWUgKyBNYXRoLm1heCh0aW1lLCAwKTtcbiAgICB0aGlzLnRvdGFsVGltZSA9IG9sZFRvdGFsVGltZTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZW1vdmUgY3VycmVudCBhbGwgcGFydGljbGVzXG4gICAqIEBtZXRob2QgcmVtb3ZlQWxsUGFydGljbGVzXG4gICAqL1xuICByZW1vdmVBbGxQYXJ0aWNsZXMoKSB7XG4gICAgbGV0IGkgPSB0aGlzLnBhcnRpY2xlcy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkgdGhpcy5wYXJ0aWNsZXNbaV0uZGVhZCA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogYWRkIGluaXRpYWxpemUgdG8gdGhpcyBlbWl0dGVyXG4gICAqIEBtZXRob2QgYWRkU2VsZkluaXRpYWxpemVcbiAgICovXG4gIGFkZFNlbGZJbml0aWFsaXplKGluaXRpYWxpemUpIHtcbiAgICBpZiAoaW5pdGlhbGl6ZVtcImluaXRcIl0pIHtcbiAgICAgIGluaXRpYWxpemUuaW5pdCh0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbml0QWxsKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGFkZCB0aGUgSW5pdGlhbGl6ZSB0byBwYXJ0aWNsZXM7XG4gICAqXG4gICAqIHlvdSBjYW4gdXNlIGluaXRpYWxpemVzIGFycmF5OmZvciBleGFtcGxlIGVtaXR0ZXIuYWRkSW5pdGlhbGl6ZShpbml0aWFsaXplMSxpbml0aWFsaXplMixpbml0aWFsaXplMyk7XG4gICAqIEBtZXRob2QgYWRkSW5pdGlhbGl6ZVxuICAgKiBAcGFyYW0ge0luaXRpYWxpemV9IGluaXRpYWxpemUgbGlrZSB0aGlzIG5ldyBSYWRpdXMoMSwgMTIpXG4gICAqL1xuICBhZGRJbml0aWFsaXplKC4uLnJlc3QpIHtcbiAgICBsZXQgaSA9IHJlc3QubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pIHRoaXMuaW5pdGlhbGl6ZXMucHVzaChyZXN0W2ldKTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZW1vdmUgdGhlIEluaXRpYWxpemVcbiAgICogQG1ldGhvZCByZW1vdmVJbml0aWFsaXplXG4gICAqIEBwYXJhbSB7SW5pdGlhbGl6ZX0gaW5pdGlhbGl6ZSBhIGluaXRpYWxpemVcbiAgICovXG4gIHJlbW92ZUluaXRpYWxpemUoaW5pdGlhbGl6ZXIpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuaW5pdGlhbGl6ZXMuaW5kZXhPZihpbml0aWFsaXplcik7XG4gICAgaWYgKGluZGV4ID4gLTEpIHRoaXMuaW5pdGlhbGl6ZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZW1vdmUgYWxsIEluaXRpYWxpemVzXG4gICAqIEBtZXRob2QgcmVtb3ZlSW5pdGlhbGl6ZXJzXG4gICAqL1xuICByZW1vdmVBbGxJbml0aWFsaXplcnMoKSB7XG4gICAgVXRpbC5lbXB0eUFycmF5KHRoaXMuaW5pdGlhbGl6ZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIGFkZCB0aGUgQmVoYXZpb3VyIHRvIHBhcnRpY2xlcztcbiAgICpcbiAgICogeW91IGNhbiB1c2UgQmVoYXZpb3VycyBhcnJheTplbWl0dGVyLmFkZEJlaGF2aW91cihCZWhhdmlvdXIxLEJlaGF2aW91cjIsQmVoYXZpb3VyMyk7XG4gICAqIEBtZXRob2QgYWRkQmVoYXZpb3VyXG4gICAqIEBwYXJhbSB7QmVoYXZpb3VyfSBiZWhhdmlvdXIgbGlrZSB0aGlzIG5ldyBDb2xvcigncmFuZG9tJylcbiAgICovXG4gIGFkZEJlaGF2aW91ciguLi5yZXN0KSB7XG4gICAgbGV0IGkgPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIGxldCBiZWhhdmlvdXIgPSByZXN0W2ldO1xuICAgICAgdGhpcy5iZWhhdmlvdXJzLnB1c2goYmVoYXZpb3VyKTtcbiAgICAgIGlmIChiZWhhdmlvdXIucGFyZW50cykgYmVoYXZpb3VyLnBhcmVudHMucHVzaCh0aGlzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogcmVtb3ZlIHRoZSBCZWhhdmlvdXJcbiAgICogQG1ldGhvZCByZW1vdmVCZWhhdmlvdXJcbiAgICogQHBhcmFtIHtCZWhhdmlvdXJ9IGJlaGF2aW91ciBhIGJlaGF2aW91clxuICAgKi9cbiAgcmVtb3ZlQmVoYXZpb3VyKGJlaGF2aW91cikge1xuICAgIGxldCBpbmRleCA9IHRoaXMuYmVoYXZpb3Vycy5pbmRleE9mKGJlaGF2aW91cik7XG4gICAgdGhpcy5iZWhhdmlvdXJzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICBpZiAoYmVoYXZpb3VyLnBhcmVudHMpIHtcbiAgICAgIGluZGV4ID0gYmVoYXZpb3VyLnBhcmVudHMuaW5kZXhPZihiZWhhdmlvdXIpO1xuICAgICAgYmVoYXZpb3VyLnBhcmVudHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogcmVtb3ZlIGFsbCBiZWhhdmlvdXJzXG4gICAqIEBtZXRob2QgcmVtb3ZlQWxsQmVoYXZpb3Vyc1xuICAgKi9cbiAgcmVtb3ZlQWxsQmVoYXZpb3VycygpIHtcbiAgICBVdGlsLmVtcHR5QXJyYXkodGhpcy5iZWhhdmlvdXJzKTtcbiAgfVxuXG4gIC8vIGVtaXR0ZXIgdXBkYXRlXG4gIHVwZGF0ZSh0aW1lKSB7XG4gICAgdGhpcy5hZ2UgKz0gdGltZTtcbiAgICBpZiAodGhpcy5hZ2UgPj0gdGhpcy5saWZlIHx8IHRoaXMuZGVhZCkgdGhpcy5kZXN0cm95KCk7XG5cbiAgICB0aGlzLmVtaXR0aW5nKHRpbWUpO1xuICAgIHRoaXMuaW50ZWdyYXRlKHRpbWUpO1xuICB9XG5cbiAgaW50ZWdyYXRlKHRpbWUpIHtcbiAgICBpZiAoIXRoaXMucGFyZW50KSByZXR1cm47XG5cbiAgICBjb25zdCBkYW1waW5nID0gMSAtIHRoaXMuZGFtcGluZztcbiAgICB0aGlzLnBhcmVudC5pbnRlZ3JhdG9yLmNhbGN1bGF0ZSh0aGlzLCB0aW1lLCBkYW1waW5nKTtcblxuICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMucGFydGljbGVzLmxlbmd0aDtcbiAgICBsZXQgaSwgcGFydGljbGU7XG5cbiAgICBmb3IgKGkgPSBsZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgcGFydGljbGUgPSB0aGlzLnBhcnRpY2xlc1tpXTtcblxuICAgICAgLy8gcGFydGljbGUgdXBkYXRlXG4gICAgICBwYXJ0aWNsZS51cGRhdGUodGltZSwgaSk7XG4gICAgICB0aGlzLnBhcmVudC5pbnRlZ3JhdG9yLmNhbGN1bGF0ZShwYXJ0aWNsZSwgdGltZSwgZGFtcGluZyk7XG4gICAgICB0aGlzLmRpc3BhdGNoKFwiUEFSVElDTEVfVVBEQVRFXCIsIHBhcnRpY2xlKTtcblxuICAgICAgLy8gY2hlY2sgZGVhZFxuICAgICAgaWYgKHBhcnRpY2xlLmRlYWQpIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaChcIlBBUlRJQ0xFX0RFQURcIiwgcGFydGljbGUpO1xuXG4gICAgICAgIHRoaXMucGFyZW50LnBvb2wuZXhwaXJlKHBhcnRpY2xlKTtcbiAgICAgICAgdGhpcy5wYXJ0aWNsZXMuc3BsaWNlKGksIDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGRpc3BhdGNoKGV2ZW50LCB0YXJnZXQpIHtcbiAgICB0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC5kaXNwYXRjaEV2ZW50KGV2ZW50LCB0YXJnZXQpO1xuICAgIHRoaXMuYmluZEV2ZW50ICYmIHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCwgdGFyZ2V0KTtcbiAgfVxuXG4gIGVtaXR0aW5nKHRpbWUpIHtcbiAgICBpZiAodGhpcy50b3RhbFRpbWUgPT09IFwib25jZVwiKSB7XG4gICAgICBsZXQgaTtcbiAgICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMucmF0ZS5nZXRWYWx1ZSg5OTk5OSk7XG5cbiAgICAgIGlmIChsZW5ndGggPiAwKSB0aGlzLmVtaXRTcGVlZCA9IGxlbmd0aDtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgdGhpcy5jcmVhdGVQYXJ0aWNsZSgpO1xuICAgICAgdGhpcy50b3RhbFRpbWUgPSBcIm5vbmVcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbWl0VGltZSArPSB0aW1lO1xuXG4gICAgICBpZiAodGhpcy5lbWl0VGltZSA8IHRoaXMudG90YWxUaW1lKSB7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMucmF0ZS5nZXRWYWx1ZSh0aW1lKTtcbiAgICAgICAgbGV0IGk7XG5cbiAgICAgICAgaWYgKGxlbmd0aCA+IDApIHRoaXMuZW1pdFNwZWVkID0gbGVuZ3RoO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHRoaXMuY3JlYXRlUGFydGljbGUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogY3JlYXRlIHNpbmdsZSBwYXJ0aWNsZTtcbiAgICpcbiAgICogY2FuIHVzZSBlbWl0KHt4OjEwfSxuZXcgR3Jhdml0eSgxMCkseydwYXJ0aWNsZVVwZGF0ZScsZnVufSkgb3IgZW1pdChbe3g6MTB9LG5ldyBJbml0aWFsaXplXSxuZXcgR3Jhdml0eSgxMCkseydwYXJ0aWNsZVVwZGF0ZScsZnVufSlcbiAgICogQG1ldGhvZCByZW1vdmVBbGxQYXJ0aWNsZXNcbiAgICovXG4gIGNyZWF0ZVBhcnRpY2xlKGluaXRpYWxpemUsIGJlaGF2aW91cikge1xuICAgIGNvbnN0IHBhcnRpY2xlID0gdGhpcy5wYXJlbnQucG9vbC5nZXQoUGFydGljbGUpO1xuICAgIHRoaXMuc2V0dXBQYXJ0aWNsZShwYXJ0aWNsZSwgaW5pdGlhbGl6ZSwgYmVoYXZpb3VyKTtcbiAgICB0aGlzLmRpc3BhdGNoKFwiUEFSVElDTEVfQ1JFQVRFRFwiLCBwYXJ0aWNsZSk7XG5cbiAgICByZXR1cm4gcGFydGljbGU7XG4gIH1cblxuICBzZXR1cFBhcnRpY2xlKHBhcnRpY2xlLCBpbml0aWFsaXplLCBiZWhhdmlvdXIpIHtcbiAgICBsZXQgaW5pdGlhbGl6ZXMgPSB0aGlzLmluaXRpYWxpemVzO1xuICAgIGxldCBiZWhhdmlvdXJzID0gdGhpcy5iZWhhdmlvdXJzO1xuXG4gICAgaWYgKGluaXRpYWxpemUpIGluaXRpYWxpemVzID0gVXRpbC50b0FycmF5KGluaXRpYWxpemUpO1xuICAgIGlmIChiZWhhdmlvdXIpIGJlaGF2aW91cnMgPSBVdGlsLnRvQXJyYXkoYmVoYXZpb3VyKTtcblxuICAgIHBhcnRpY2xlLnJlc2V0KCk7XG4gICAgSW5pdGlhbGl6ZVV0aWwuaW5pdGlhbGl6ZSh0aGlzLCBwYXJ0aWNsZSwgaW5pdGlhbGl6ZXMpO1xuICAgIHBhcnRpY2xlLmFkZEJlaGF2aW91cnMoYmVoYXZpb3Vycyk7XG4gICAgcGFydGljbGUucGFyZW50ID0gdGhpcztcblxuICAgIHRoaXMucGFydGljbGVzLnB1c2gocGFydGljbGUpO1xuICB9XG5cbiAgcmVtb3ZlKCkge1xuICAgIHRoaXMuc3RvcCgpO1xuICAgIFV0aWwuZGVzdHJveUFsbCh0aGlzLnBhcnRpY2xlcyk7XG4gIH1cblxuICAvKipcbiAgICogRGVzdG9yeSB0aGlzIEVtaXR0ZXJcbiAgICogQG1ldGhvZCBkZXN0cm95XG4gICAqL1xuICBkZXN0cm95KCkge1xuICAgIHRoaXMuZGVhZCA9IHRydWU7XG4gICAgdGhpcy5yZW1vdmUoKTtcbiAgICB0aGlzLnJlbW92ZUFsbEluaXRpYWxpemVycygpO1xuICAgIHRoaXMucmVtb3ZlQWxsQmVoYXZpb3VycygpO1xuICAgIHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LnJlbW92ZUVtaXR0ZXIodGhpcyk7XG4gIH1cbn1cblxuRXZlbnREaXNwYXRjaGVyLmJpbmQoRW1pdHRlcik7XG4iLCJpbXBvcnQgRW1pdHRlciBmcm9tIFwiLi9FbWl0dGVyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJlaGF2aW91ckVtaXR0ZXIgZXh0ZW5kcyBFbWl0dGVyIHtcbiAgLyoqXG4gICAqIFRoZSBCZWhhdmlvdXJFbWl0dGVyIGNsYXNzIGluaGVyaXRzIGZyb20gUHJvdG9uLkVtaXR0ZXJcbiAgICpcbiAgICogdXNlIHRoZSBCZWhhdmlvdXJFbWl0dGVyIHlvdSBjYW4gYWRkIGJlaGF2aW91cnMgdG8gc2VsZjtcbiAgICogQGNsYXNzIFByb3Rvbi5CZWhhdmlvdXJFbWl0dGVyXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge09iamVjdH0gY29uZiB0aGUgcGFyYW1ldGVycyBvYmplY3Q7XG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb25mKSB7XG4gICAgc3VwZXIoY29uZik7XG5cbiAgICB0aGlzLnNlbGZCZWhhdmlvdXJzID0gW107XG4gIH1cblxuICAvKipcbiAgICogYWRkIHRoZSBCZWhhdmlvdXIgdG8gZW1pdHRlcjtcbiAgICpcbiAgICogeW91IGNhbiB1c2UgQmVoYXZpb3VycyBhcnJheTplbWl0dGVyLmFkZFNlbGZCZWhhdmlvdXIoQmVoYXZpb3VyMSxCZWhhdmlvdXIyLEJlaGF2aW91cjMpO1xuICAgKiBAbWV0aG9kIGFkZFNlbGZCZWhhdmlvdXJcbiAgICogQHBhcmFtIHtQcm90b24uQmVoYXZpb3VyfSBiZWhhdmlvdXIgbGlrZSB0aGlzIG5ldyBQcm90b24uQ29sb3IoJ3JhbmRvbScpXG4gICAqL1xuICBhZGRTZWxmQmVoYXZpb3VyKC4uLnJlc3QpIHtcbiAgICBsZXQgaSxcbiAgICAgIGxlbmd0aCA9IHJlc3QubGVuZ3RoO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgYmVoYXZpb3VyID0gcmVzdFtpXTtcbiAgICAgIHRoaXMuc2VsZkJlaGF2aW91cnMucHVzaChiZWhhdmlvdXIpO1xuICAgICAgYmVoYXZpb3VyLmluaXRpYWxpemUodGhpcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHJlbW92ZSB0aGUgQmVoYXZpb3VyIGZvciBzZWxmXG4gICAqIEBtZXRob2QgcmVtb3ZlU2VsZkJlaGF2aW91clxuICAgKiBAcGFyYW0ge1Byb3Rvbi5CZWhhdmlvdXJ9IGJlaGF2aW91ciBhIGJlaGF2aW91clxuICAgKi9cbiAgcmVtb3ZlU2VsZkJlaGF2aW91cihiZWhhdmlvdXIpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuc2VsZkJlaGF2aW91cnMuaW5kZXhPZihiZWhhdmlvdXIpO1xuICAgIGlmIChpbmRleCA+IC0xKSB0aGlzLnNlbGZCZWhhdmlvdXJzLnNwbGljZShpbmRleCwgMSk7XG4gIH1cblxuICB1cGRhdGUodGltZSkge1xuICAgIHN1cGVyLnVwZGF0ZSh0aW1lKTtcblxuICAgIGlmICghdGhpcy5zbGVlcCkge1xuICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5zZWxmQmVoYXZpb3Vycy5sZW5ndGg7XG4gICAgICBsZXQgaTtcblxuICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuc2VsZkJlaGF2aW91cnNbaV0uYXBwbHlCZWhhdmlvdXIodGhpcywgdGltZSwgaSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IEVtaXR0ZXIgZnJvbSBcIi4vRW1pdHRlclwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGb2xsb3dFbWl0dGVyIGV4dGVuZHMgRW1pdHRlciB7XG4gIC8qKlxuICAgKiBUaGUgRm9sbG93RW1pdHRlciBjbGFzcyBpbmhlcml0cyBmcm9tIFByb3Rvbi5FbWl0dGVyXG4gICAqXG4gICAqIHVzZSB0aGUgRm9sbG93RW1pdHRlciB3aWxsIGVtaXQgcGFydGljbGUgd2hlbiBtb3VzZW1vdmluZ1xuICAgKlxuICAgKiBAY2xhc3MgUHJvdG9uLkZvbGxvd0VtaXR0ZXJcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gbW91c2VUYXJnZXQgbW91c2VldmVudCdzIHRhcmdldDtcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGVhc2UgdGhlIGVhc2luZyBvZiBmb2xsb3dpbmcgc3BlZWQ7XG4gICAqIEBkZWZhdWx0IDAuN1xuICAgKiBAcGFyYW0ge09iamVjdH0gY29uZiB0aGUgcGFyYW1ldGVycyBvYmplY3Q7XG4gICAqL1xuICBjb25zdHJ1Y3Rvcihtb3VzZVRhcmdldCwgZWFzZSwgY29uZikge1xuICAgIHN1cGVyKGNvbmYpO1xuXG4gICAgdGhpcy5tb3VzZVRhcmdldCA9IFV0aWwuaW5pdFZhbHVlKG1vdXNlVGFyZ2V0LCB3aW5kb3cpO1xuICAgIHRoaXMuZWFzZSA9IFV0aWwuaW5pdFZhbHVlKGVhc2UsIDAuNyk7XG5cbiAgICB0aGlzLl9hbGxvd0VtaXR0aW5nID0gZmFsc2U7XG4gICAgdGhpcy5pbml0RXZlbnRIYW5kbGVyKCk7XG4gIH1cblxuICBpbml0RXZlbnRIYW5kbGVyKCkge1xuICAgIHRoaXMubW91c2Vtb3ZlSGFuZGxlciA9IGUgPT4gdGhpcy5tb3VzZW1vdmUuY2FsbCh0aGlzLCBlKTtcbiAgICB0aGlzLm1vdXNlZG93bkhhbmRsZXIgPSBlID0+IHRoaXMubW91c2Vkb3duLmNhbGwodGhpcywgZSk7XG4gICAgdGhpcy5tb3VzZXVwSGFuZGxlciA9IGUgPT4gdGhpcy5tb3VzZXVwLmNhbGwodGhpcywgZSk7XG4gICAgdGhpcy5tb3VzZVRhcmdldC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIHRoaXMubW91c2Vtb3ZlSGFuZGxlciwgZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIHN0YXJ0IGVtaXQgcGFydGljbGVcbiAgICogQG1ldGhvZCBlbWl0XG4gICAqL1xuICBlbWl0KCkge1xuICAgIHRoaXMuX2FsbG93RW1pdHRpbmcgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIHN0b3AgZW1pdGluZ1xuICAgKiBAbWV0aG9kIHN0b3BcbiAgICovXG4gIHN0b3AoKSB7XG4gICAgdGhpcy5fYWxsb3dFbWl0dGluZyA9IGZhbHNlO1xuICB9XG5cbiAgbW91c2Vtb3ZlKGUpIHtcbiAgICBpZiAoZS5sYXllclggfHwgZS5sYXllclggPT09IDApIHtcbiAgICAgIHRoaXMucC54ICs9IChlLmxheWVyWCAtIHRoaXMucC54KSAqIHRoaXMuZWFzZTtcbiAgICAgIHRoaXMucC55ICs9IChlLmxheWVyWSAtIHRoaXMucC55KSAqIHRoaXMuZWFzZTtcbiAgICB9IGVsc2UgaWYgKGUub2Zmc2V0WCB8fCBlLm9mZnNldFggPT09IDApIHtcbiAgICAgIHRoaXMucC54ICs9IChlLm9mZnNldFggLSB0aGlzLnAueCkgKiB0aGlzLmVhc2U7XG4gICAgICB0aGlzLnAueSArPSAoZS5vZmZzZXRZIC0gdGhpcy5wLnkpICogdGhpcy5lYXNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9hbGxvd0VtaXR0aW5nKSBzdXBlci5lbWl0KFwib25jZVwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0b3J5IHRoaXMgRW1pdHRlclxuICAgKiBAbWV0aG9kIGRlc3Ryb3lcbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIHRoaXMubW91c2VUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCB0aGlzLm1vdXNlbW92ZUhhbmRsZXIsIGZhbHNlKTtcbiAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQge1xuICAvKipcbiAgICogRGV0ZXJtaW5lIHdoZXRoZXIgaXQgaXMgYSBwaWN0dXJlIG9iamVjdFxuICAgKlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBpcyBvciBub1xuICAgKi9cbiAgaXNJbWFnZShvYmopIHtcbiAgICBpZiAoIW9iaikgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgdGFnTmFtZSA9IGAke29iai50YWdOYW1lfWAudG9VcHBlckNhc2UoKTtcbiAgICBjb25zdCBub2RlTmFtZSA9IGAke29iai5ub2RlTmFtZX1gLnRvVXBwZXJDYXNlKCk7XG4gICAgaWYgKG5vZGVOYW1lID09PSBcIklNR1wiIHx8IHRhZ05hbWUgPT09IFwiSU1HXCIpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcblxuICAvKipcbiAgICogRGV0ZXJtaW5lIHdoZXRoZXIgaXQgaXMgYSBzdHJpbmcgb2JqZWN0XG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IGlzIG9yIG5vXG4gICAqL1xuICBpc1N0cmluZyhvYmopIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gXCJzdHJpbmdcIjtcbiAgfVxufTtcbiIsImltcG9ydCBQb29sIGZyb20gXCIuLi9jb3JlL1Bvb2xcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFzZVJlbmRlcmVyIHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgc3Ryb2tlKSB7XG4gICAgdGhpcy5wb29sID0gbmV3IFBvb2woKTtcbiAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgIHRoaXMuc3Ryb2tlID0gc3Ryb2tlO1xuICAgIHRoaXMuY2lyY2xlQ29uZiA9IHsgaXNDaXJjbGU6IHRydWUgfTtcblxuICAgIHRoaXMuaW5pdEV2ZW50SGFuZGxlcigpO1xuICAgIHRoaXMubmFtZSA9IFwiQmFzZVJlbmRlcmVyXCI7XG4gIH1cblxuICBzZXRTdHJva2UoY29sb3IgPSBcIiMwMDAwMDBcIiwgdGhpbmtuZXNzID0gMSkge1xuICAgIHRoaXMuc3Ryb2tlID0geyBjb2xvciwgdGhpbmtuZXNzIH07XG4gIH1cblxuICBpbml0RXZlbnRIYW5kbGVyKCkge1xuICAgIHRoaXMuX3Byb3RvblVwZGF0ZUhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICB0aGlzLm9uUHJvdG9uVXBkYXRlLmNhbGwodGhpcyk7XG4gICAgfTtcblxuICAgIHRoaXMuX3Byb3RvblVwZGF0ZUFmdGVySGFuZGxlciA9ICgpID0+IHtcbiAgICAgIHRoaXMub25Qcm90b25VcGRhdGVBZnRlci5jYWxsKHRoaXMpO1xuICAgIH07XG5cbiAgICB0aGlzLl9lbWl0dGVyQWRkZWRIYW5kbGVyID0gZW1pdHRlciA9PiB7XG4gICAgICB0aGlzLm9uRW1pdHRlckFkZGVkLmNhbGwodGhpcywgZW1pdHRlcik7XG4gICAgfTtcblxuICAgIHRoaXMuX2VtaXR0ZXJSZW1vdmVkSGFuZGxlciA9IGVtaXR0ZXIgPT4ge1xuICAgICAgdGhpcy5vbkVtaXR0ZXJSZW1vdmVkLmNhbGwodGhpcywgZW1pdHRlcik7XG4gICAgfTtcblxuICAgIHRoaXMuX3BhcnRpY2xlQ3JlYXRlZEhhbmRsZXIgPSBwYXJ0aWNsZSA9PiB7XG4gICAgICB0aGlzLm9uUGFydGljbGVDcmVhdGVkLmNhbGwodGhpcywgcGFydGljbGUpO1xuICAgIH07XG5cbiAgICB0aGlzLl9wYXJ0aWNsZVVwZGF0ZUhhbmRsZXIgPSBwYXJ0aWNsZSA9PiB7XG4gICAgICB0aGlzLm9uUGFydGljbGVVcGRhdGUuY2FsbCh0aGlzLCBwYXJ0aWNsZSk7XG4gICAgfTtcblxuICAgIHRoaXMuX3BhcnRpY2xlRGVhZEhhbmRsZXIgPSBwYXJ0aWNsZSA9PiB7XG4gICAgICB0aGlzLm9uUGFydGljbGVEZWFkLmNhbGwodGhpcywgcGFydGljbGUpO1xuICAgIH07XG4gIH1cblxuICBpbml0KHByb3Rvbikge1xuICAgIHRoaXMucGFyZW50ID0gcHJvdG9uO1xuXG4gICAgcHJvdG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJQUk9UT05fVVBEQVRFXCIsIHRoaXMuX3Byb3RvblVwZGF0ZUhhbmRsZXIpO1xuICAgIHByb3Rvbi5hZGRFdmVudExpc3RlbmVyKFwiUFJPVE9OX1VQREFURV9BRlRFUlwiLCB0aGlzLl9wcm90b25VcGRhdGVBZnRlckhhbmRsZXIpO1xuXG4gICAgcHJvdG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJFTUlUVEVSX0FEREVEXCIsIHRoaXMuX2VtaXR0ZXJBZGRlZEhhbmRsZXIpO1xuICAgIHByb3Rvbi5hZGRFdmVudExpc3RlbmVyKFwiRU1JVFRFUl9SRU1PVkVEXCIsIHRoaXMuX2VtaXR0ZXJSZW1vdmVkSGFuZGxlcik7XG5cbiAgICBwcm90b24uYWRkRXZlbnRMaXN0ZW5lcihcIlBBUlRJQ0xFX0NSRUFURURcIiwgdGhpcy5fcGFydGljbGVDcmVhdGVkSGFuZGxlcik7XG4gICAgcHJvdG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJQQVJUSUNMRV9VUERBVEVcIiwgdGhpcy5fcGFydGljbGVVcGRhdGVIYW5kbGVyKTtcbiAgICBwcm90b24uYWRkRXZlbnRMaXN0ZW5lcihcIlBBUlRJQ0xFX0RFQURcIiwgdGhpcy5fcGFydGljbGVEZWFkSGFuZGxlcik7XG4gIH1cblxuICByZXNpemUod2lkdGgsIGhlaWdodCkge31cblxuICBkZXN0cm95KCkge1xuICAgIHRoaXMucmVtb3ZlKCk7XG4gICAgdGhpcy5wb29sLmRlc3Ryb3koKTtcbiAgICB0aGlzLnBvb2wgPSBudWxsO1xuICAgIHRoaXMuZWxlbWVudCA9IG51bGw7XG4gICAgdGhpcy5zdHJva2UgPSBudWxsO1xuICB9XG5cbiAgcmVtb3ZlKHByb3Rvbikge1xuICAgIHRoaXMucGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJQUk9UT05fVVBEQVRFXCIsIHRoaXMuX3Byb3RvblVwZGF0ZUhhbmRsZXIpO1xuICAgIHRoaXMucGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJQUk9UT05fVVBEQVRFX0FGVEVSXCIsIHRoaXMuX3Byb3RvblVwZGF0ZUFmdGVySGFuZGxlcik7XG5cbiAgICB0aGlzLnBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiRU1JVFRFUl9BRERFRFwiLCB0aGlzLl9lbWl0dGVyQWRkZWRIYW5kbGVyKTtcbiAgICB0aGlzLnBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiRU1JVFRFUl9SRU1PVkVEXCIsIHRoaXMuX2VtaXR0ZXJSZW1vdmVkSGFuZGxlcik7XG5cbiAgICB0aGlzLnBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiUEFSVElDTEVfQ1JFQVRFRFwiLCB0aGlzLl9wYXJ0aWNsZUNyZWF0ZWRIYW5kbGVyKTtcbiAgICB0aGlzLnBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiUEFSVElDTEVfVVBEQVRFXCIsIHRoaXMuX3BhcnRpY2xlVXBkYXRlSGFuZGxlcik7XG4gICAgdGhpcy5wYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIlBBUlRJQ0xFX0RFQURcIiwgdGhpcy5fcGFydGljbGVEZWFkSGFuZGxlcik7XG5cbiAgICB0aGlzLnBhcmVudCA9IG51bGw7XG4gIH1cblxuICBvblByb3RvblVwZGF0ZSgpIHt9XG4gIG9uUHJvdG9uVXBkYXRlQWZ0ZXIoKSB7fVxuXG4gIG9uRW1pdHRlckFkZGVkKGVtaXR0ZXIpIHt9XG4gIG9uRW1pdHRlclJlbW92ZWQoZW1pdHRlcikge31cblxuICBvblBhcnRpY2xlQ3JlYXRlZChwYXJ0aWNsZSkge31cbiAgb25QYXJ0aWNsZVVwZGF0ZShwYXJ0aWNsZSkge31cbiAgb25QYXJ0aWNsZURlYWQocGFydGljbGUpIHt9XG59XG4iLCJpbXBvcnQgVHlwZXMgZnJvbSBcIi4uL3V0aWxzL1R5cGVzXCI7XG5pbXBvcnQgSW1nVXRpbCBmcm9tIFwiLi4vdXRpbHMvSW1nVXRpbFwiO1xuaW1wb3J0IENvbG9yVXRpbCBmcm9tIFwiLi4vdXRpbHMvQ29sb3JVdGlsXCI7XG5pbXBvcnQgTWF0aFV0aWwgZnJvbSBcIi4uL21hdGgvTWF0aFV0aWxcIjtcbmltcG9ydCBCYXNlUmVuZGVyZXIgZnJvbSBcIi4vQmFzZVJlbmRlcmVyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhbnZhc1JlbmRlcmVyIGV4dGVuZHMgQmFzZVJlbmRlcmVyIHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCkge1xuICAgIHN1cGVyKGVsZW1lbnQpO1xuXG4gICAgdGhpcy5zdHJva2UgPSBudWxsO1xuICAgIHRoaXMuY29udGV4dCA9IHRoaXMuZWxlbWVudC5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgdGhpcy5idWZmZXJDYWNoZSA9IHt9O1xuICAgIHRoaXMubmFtZSA9IFwiQ2FudmFzUmVuZGVyZXJcIjtcbiAgfVxuXG4gIHJlc2l6ZSh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgdGhpcy5lbGVtZW50LndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5lbGVtZW50LmhlaWdodCA9IGhlaWdodDtcbiAgfVxuXG4gIG9uUHJvdG9uVXBkYXRlKCkge1xuICAgIHRoaXMuY29udGV4dC5jbGVhclJlY3QoMCwgMCwgdGhpcy5lbGVtZW50LndpZHRoLCB0aGlzLmVsZW1lbnQuaGVpZ2h0KTtcbiAgfVxuXG4gIG9uUGFydGljbGVDcmVhdGVkKHBhcnRpY2xlKSB7XG4gICAgaWYgKHBhcnRpY2xlLmJvZHkpIHtcbiAgICAgIEltZ1V0aWwuZ2V0SW1nRnJvbUNhY2hlKHBhcnRpY2xlLmJvZHksIHRoaXMuYWRkSW1nMkJvZHksIHBhcnRpY2xlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFydGljbGUuY29sb3IgPSBwYXJ0aWNsZS5jb2xvciB8fCBcIiNmZjAwMDBcIjtcbiAgICB9XG4gIH1cblxuICBvblBhcnRpY2xlVXBkYXRlKHBhcnRpY2xlKSB7XG4gICAgaWYgKHBhcnRpY2xlLmJvZHkpIHtcbiAgICAgIGlmIChUeXBlcy5pc0ltYWdlKHBhcnRpY2xlLmJvZHkpKSB7XG4gICAgICAgIHRoaXMuZHJhd0ltYWdlKHBhcnRpY2xlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kcmF3Q2lyY2xlKHBhcnRpY2xlKTtcbiAgICB9XG4gIH1cblxuICBvblBhcnRpY2xlRGVhZChwYXJ0aWNsZSkge1xuICAgIHBhcnRpY2xlLmJvZHkgPSBudWxsO1xuICB9XG5cbiAgLy8gcHJpdmF0ZSBtZXRob2RcbiAgYWRkSW1nMkJvZHkoaW1nLCBwYXJ0aWNsZSkge1xuICAgIHBhcnRpY2xlLmJvZHkgPSBpbWc7XG4gIH1cblxuICAvLyBwcml2YXRlIGRyYXdJbWFnZSBtZXRob2RcbiAgZHJhd0ltYWdlKHBhcnRpY2xlKSB7XG4gICAgY29uc3QgdyA9IChwYXJ0aWNsZS5ib2R5LndpZHRoICogcGFydGljbGUuc2NhbGUpIHwgMDtcbiAgICBjb25zdCBoID0gKHBhcnRpY2xlLmJvZHkuaGVpZ2h0ICogcGFydGljbGUuc2NhbGUpIHwgMDtcbiAgICBjb25zdCB4ID0gcGFydGljbGUucC54IC0gdyAvIDI7XG4gICAgY29uc3QgeSA9IHBhcnRpY2xlLnAueSAtIGggLyAyO1xuXG4gICAgaWYgKCEhcGFydGljbGUuY29sb3IpIHtcbiAgICAgIGlmICghcGFydGljbGUuZGF0YVtcImJ1ZmZlclwiXSkgcGFydGljbGUuZGF0YS5idWZmZXIgPSB0aGlzLmNyZWF0ZUJ1ZmZlcihwYXJ0aWNsZS5ib2R5KTtcblxuICAgICAgY29uc3QgYnVmQ29udGV4dCA9IHBhcnRpY2xlLmRhdGEuYnVmZmVyLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgIGJ1ZkNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHBhcnRpY2xlLmRhdGEuYnVmZmVyLndpZHRoLCBwYXJ0aWNsZS5kYXRhLmJ1ZmZlci5oZWlnaHQpO1xuICAgICAgYnVmQ29udGV4dC5nbG9iYWxBbHBoYSA9IHBhcnRpY2xlLmFscGhhO1xuICAgICAgYnVmQ29udGV4dC5kcmF3SW1hZ2UocGFydGljbGUuYm9keSwgMCwgMCk7XG5cbiAgICAgIGJ1ZkNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gXCJzb3VyY2UtYXRvcFwiO1xuICAgICAgYnVmQ29udGV4dC5maWxsU3R5bGUgPSBDb2xvclV0aWwucmdiVG9IZXgocGFydGljbGUucmdiKTtcbiAgICAgIGJ1ZkNvbnRleHQuZmlsbFJlY3QoMCwgMCwgcGFydGljbGUuZGF0YS5idWZmZXIud2lkdGgsIHBhcnRpY2xlLmRhdGEuYnVmZmVyLmhlaWdodCk7XG4gICAgICBidWZDb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IFwic291cmNlLW92ZXJcIjtcbiAgICAgIGJ1ZkNvbnRleHQuZ2xvYmFsQWxwaGEgPSAxO1xuXG4gICAgICB0aGlzLmNvbnRleHQuZHJhd0ltYWdlKFxuICAgICAgICBwYXJ0aWNsZS5kYXRhLmJ1ZmZlcixcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgcGFydGljbGUuZGF0YS5idWZmZXIud2lkdGgsXG4gICAgICAgIHBhcnRpY2xlLmRhdGEuYnVmZmVyLmhlaWdodCxcbiAgICAgICAgeCxcbiAgICAgICAgeSxcbiAgICAgICAgdyxcbiAgICAgICAgaFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb250ZXh0LnNhdmUoKTtcblxuICAgICAgdGhpcy5jb250ZXh0Lmdsb2JhbEFscGhhID0gcGFydGljbGUuYWxwaGE7XG4gICAgICB0aGlzLmNvbnRleHQudHJhbnNsYXRlKHBhcnRpY2xlLnAueCwgcGFydGljbGUucC55KTtcbiAgICAgIHRoaXMuY29udGV4dC5yb3RhdGUoTWF0aFV0aWwuZGVncmVlVHJhbnNmb3JtKHBhcnRpY2xlLnJvdGF0aW9uKSk7XG4gICAgICB0aGlzLmNvbnRleHQudHJhbnNsYXRlKC1wYXJ0aWNsZS5wLngsIC1wYXJ0aWNsZS5wLnkpO1xuICAgICAgdGhpcy5jb250ZXh0LmRyYXdJbWFnZShwYXJ0aWNsZS5ib2R5LCAwLCAwLCBwYXJ0aWNsZS5ib2R5LndpZHRoLCBwYXJ0aWNsZS5ib2R5LmhlaWdodCwgeCwgeSwgdywgaCk7XG5cbiAgICAgIHRoaXMuY29udGV4dC5nbG9iYWxBbHBoYSA9IDE7XG4gICAgICB0aGlzLmNvbnRleHQucmVzdG9yZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHByaXZhdGUgZHJhd0NpcmNsZSAtLVxuICBkcmF3Q2lyY2xlKHBhcnRpY2xlKSB7XG4gICAgaWYgKHBhcnRpY2xlLnJnYikge1xuICAgICAgdGhpcy5jb250ZXh0LmZpbGxTdHlsZSA9IGByZ2JhKCR7cGFydGljbGUucmdiLnJ9LCR7cGFydGljbGUucmdiLmd9LCR7cGFydGljbGUucmdiLmJ9LCR7cGFydGljbGUuYWxwaGF9KWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29udGV4dC5maWxsU3R5bGUgPSBwYXJ0aWNsZS5jb2xvcjtcbiAgICB9XG5cbiAgICAvLyBkcmF3IGNpcmNsZVxuICAgIHRoaXMuY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICB0aGlzLmNvbnRleHQuYXJjKHBhcnRpY2xlLnAueCwgcGFydGljbGUucC55LCBwYXJ0aWNsZS5yYWRpdXMsIDAsIE1hdGguUEkgKiAyLCB0cnVlKTtcblxuICAgIGlmICh0aGlzLnN0cm9rZSkge1xuICAgICAgdGhpcy5jb250ZXh0LnN0cm9rZVN0eWxlID0gdGhpcy5zdHJva2UuY29sb3I7XG4gICAgICB0aGlzLmNvbnRleHQubGluZVdpZHRoID0gdGhpcy5zdHJva2UudGhpbmtuZXNzO1xuICAgICAgdGhpcy5jb250ZXh0LnN0cm9rZSgpO1xuICAgIH1cblxuICAgIHRoaXMuY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICB0aGlzLmNvbnRleHQuZmlsbCgpO1xuICB9XG5cbiAgLy8gcHJpdmF0ZSBjcmVhdGVCdWZmZXJcbiAgY3JlYXRlQnVmZmVyKGltYWdlKSB7XG4gICAgaWYgKFR5cGVzLmlzSW1hZ2UoaW1hZ2UpKSB7XG4gICAgICBjb25zdCBzaXplID0gaW1hZ2Uud2lkdGggKyBcIl9cIiArIGltYWdlLmhlaWdodDtcbiAgICAgIGxldCBjYW52YXMgPSB0aGlzLmJ1ZmZlckNhY2hlW3NpemVdO1xuXG4gICAgICBpZiAoIWNhbnZhcykge1xuICAgICAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgICAgICBjYW52YXMud2lkdGggPSBpbWFnZS53aWR0aDtcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IGltYWdlLmhlaWdodDtcbiAgICAgICAgdGhpcy5idWZmZXJDYWNoZVtzaXplXSA9IGNhbnZhcztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNhbnZhcztcbiAgICB9XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICB0aGlzLnN0cm9rZSA9IG51bGw7XG4gICAgdGhpcy5jb250ZXh0ID0gbnVsbDtcbiAgICB0aGlzLmJ1ZmZlckNhY2hlID0gbnVsbDtcbiAgfVxufVxuIiwiaW1wb3J0IERvbVV0aWwgZnJvbSBcIi4uL3V0aWxzL0RvbVV0aWxcIjtcbmltcG9ydCBJbWdVdGlsIGZyb20gXCIuLi91dGlscy9JbWdVdGlsXCI7XG5pbXBvcnQgQmFzZVJlbmRlcmVyIGZyb20gXCIuL0Jhc2VSZW5kZXJlclwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEb21SZW5kZXJlciBleHRlbmRzIEJhc2VSZW5kZXJlciB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQpIHtcbiAgICBzdXBlcihlbGVtZW50KTtcblxuICAgIHRoaXMuc3Ryb2tlID0gbnVsbDtcbiAgICB0aGlzLnRyYW5zZm9ybTNkID0gZmFsc2U7XG4gICAgdGhpcy5wb29sLmNyZWF0ZSA9IChib2R5LCBwYXJ0aWNsZSkgPT4gdGhpcy5jcmVhdGVCb2R5KGJvZHksIHBhcnRpY2xlKTtcbiAgICB0aGlzLmFkZEltZzJCb2R5ID0gdGhpcy5hZGRJbWcyQm9keS5iaW5kKHRoaXMpO1xuXG4gICAgdGhpcy5uYW1lID0gXCJEb21SZW5kZXJlclwiO1xuICB9XG5cbiAgb25QYXJ0aWNsZUNyZWF0ZWQocGFydGljbGUpIHtcbiAgICBpZiAocGFydGljbGUuYm9keSkge1xuICAgICAgSW1nVXRpbC5nZXRJbWdGcm9tQ2FjaGUocGFydGljbGUuYm9keSwgdGhpcy5hZGRJbWcyQm9keSwgcGFydGljbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJ0aWNsZS5ib2R5ID0gdGhpcy5wb29sLmdldCh0aGlzLmNpcmNsZUNvbmYsIHBhcnRpY2xlKTtcbiAgICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZChwYXJ0aWNsZS5ib2R5KTtcbiAgICB9XG4gIH1cblxuICBvblBhcnRpY2xlVXBkYXRlKHBhcnRpY2xlKSB7XG4gICAgaWYgKHRoaXMuYm9keVJlYWR5KHBhcnRpY2xlKSkge1xuICAgICAgaWYgKHRoaXMudHJhbnNmb3JtM2QpIHtcbiAgICAgICAgRG9tVXRpbC50cmFuc2Zvcm0zZChwYXJ0aWNsZS5ib2R5LCBwYXJ0aWNsZS5wLngsIHBhcnRpY2xlLnAueSwgcGFydGljbGUuc2NhbGUsIHBhcnRpY2xlLnJvdGF0aW9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIERvbVV0aWwudHJhbnNmb3JtKHBhcnRpY2xlLmJvZHksIHBhcnRpY2xlLnAueCwgcGFydGljbGUucC55LCBwYXJ0aWNsZS5zY2FsZSwgcGFydGljbGUucm90YXRpb24pO1xuICAgICAgfVxuXG4gICAgICBwYXJ0aWNsZS5ib2R5LnN0eWxlLm9wYWNpdHkgPSBwYXJ0aWNsZS5hbHBoYTtcblxuICAgICAgaWYgKHBhcnRpY2xlLmJvZHkuaXNDaXJjbGUpIHtcbiAgICAgICAgcGFydGljbGUuYm9keS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBwYXJ0aWNsZS5jb2xvciB8fCBcIiNmZjAwMDBcIjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvblBhcnRpY2xlRGVhZChwYXJ0aWNsZSkge1xuICAgIGlmICh0aGlzLmJvZHlSZWFkeShwYXJ0aWNsZSkpIHtcbiAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVDaGlsZChwYXJ0aWNsZS5ib2R5KTtcbiAgICAgIHRoaXMucG9vbC5leHBpcmUocGFydGljbGUuYm9keSk7XG4gICAgICBwYXJ0aWNsZS5ib2R5ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBib2R5UmVhZHkocGFydGljbGUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHBhcnRpY2xlLmJvZHkgPT09IFwib2JqZWN0XCIgJiYgcGFydGljbGUuYm9keSAmJiAhcGFydGljbGUuYm9keS5pc0lubmVyO1xuICB9XG5cbiAgLy8gcHJpdmF0ZSBtZXRob2RcbiAgYWRkSW1nMkJvZHkoaW1nLCBwYXJ0aWNsZSkge1xuICAgIGlmIChwYXJ0aWNsZS5kZWFkKSByZXR1cm47XG4gICAgcGFydGljbGUuYm9keSA9IHRoaXMucG9vbC5nZXQoaW1nLCBwYXJ0aWNsZSk7XG4gICAgRG9tVXRpbC5yZXNpemUocGFydGljbGUuYm9keSwgaW1nLndpZHRoLCBpbWcuaGVpZ2h0KTtcblxuICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZChwYXJ0aWNsZS5ib2R5KTtcbiAgfVxuXG4gIGNyZWF0ZUJvZHkoYm9keSwgcGFydGljbGUpIHtcbiAgICBpZiAoYm9keS5pc0NpcmNsZSkgcmV0dXJuIHRoaXMuY3JlYXRlQ2lyY2xlKHBhcnRpY2xlKTtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVTcHJpdGUoYm9keSwgcGFydGljbGUpO1xuICB9XG5cbiAgLy8gcHJpdmF0ZSBtZXRob2RzXG4gIGNyZWF0ZUNpcmNsZShwYXJ0aWNsZSkge1xuICAgIGNvbnN0IGRvbSA9IERvbVV0aWwuY3JlYXRlRGl2KGAke3BhcnRpY2xlLmlkfV9kb21gLCAyICogcGFydGljbGUucmFkaXVzLCAyICogcGFydGljbGUucmFkaXVzKTtcbiAgICBkb20uc3R5bGUuYm9yZGVyUmFkaXVzID0gYCR7cGFydGljbGUucmFkaXVzfXB4YDtcblxuICAgIGlmICh0aGlzLnN0cm9rZSkge1xuICAgICAgZG9tLnN0eWxlLmJvcmRlckNvbG9yID0gdGhpcy5zdHJva2UuY29sb3I7XG4gICAgICBkb20uc3R5bGUuYm9yZGVyV2lkdGggPSBgJHt0aGlzLnN0cm9rZS50aGlua25lc3N9cHhgO1xuICAgIH1cbiAgICBkb20uaXNDaXJjbGUgPSB0cnVlO1xuXG4gICAgcmV0dXJuIGRvbTtcbiAgfVxuXG4gIGNyZWF0ZVNwcml0ZShib2R5LCBwYXJ0aWNsZSkge1xuICAgIGNvbnN0IHVybCA9IHR5cGVvZiBib2R5ID09PSBcInN0cmluZ1wiID8gYm9keSA6IGJvZHkuc3JjO1xuICAgIGNvbnN0IGRvbSA9IERvbVV0aWwuY3JlYXRlRGl2KGAke3BhcnRpY2xlLmlkfV9kb21gLCBib2R5LndpZHRoLCBib2R5LmhlaWdodCk7XG4gICAgZG9tLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9IGB1cmwoJHt1cmx9KWA7XG5cbiAgICByZXR1cm4gZG9tO1xuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgdGhpcy5zdHJva2UgPSBudWxsO1xuICB9XG59XG4iLCJpbXBvcnQgVHlwZXMgZnJvbSBcIi4uL3V0aWxzL1R5cGVzXCI7XG5pbXBvcnQgQmFzZVJlbmRlcmVyIGZyb20gXCIuL0Jhc2VSZW5kZXJlclwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFYXNlbFJlbmRlcmVyIGV4dGVuZHMgQmFzZVJlbmRlcmVyIHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgc3Ryb2tlKSB7XG4gICAgc3VwZXIoZWxlbWVudCk7XG5cbiAgICB0aGlzLnN0cm9rZSA9IHN0cm9rZTtcbiAgICB0aGlzLm5hbWUgPSBcIkVhc2VsUmVuZGVyZXJcIjtcbiAgfVxuXG4gIG9uUGFydGljbGVDcmVhdGVkKHBhcnRpY2xlKSB7XG4gICAgaWYgKHBhcnRpY2xlLmJvZHkpIHtcbiAgICAgIHRoaXMuY3JlYXRlU3ByaXRlKHBhcnRpY2xlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jcmVhdGVDaXJjbGUocGFydGljbGUpO1xuICAgIH1cblxuICAgIHRoaXMuZWxlbWVudC5hZGRDaGlsZChwYXJ0aWNsZS5ib2R5KTtcbiAgfVxuXG4gIG9uUGFydGljbGVVcGRhdGUocGFydGljbGUpIHtcbiAgICBpZiAocGFydGljbGUuYm9keSkge1xuICAgICAgcGFydGljbGUuYm9keS54ID0gcGFydGljbGUucC54O1xuICAgICAgcGFydGljbGUuYm9keS55ID0gcGFydGljbGUucC55O1xuXG4gICAgICBwYXJ0aWNsZS5ib2R5LmFscGhhID0gcGFydGljbGUuYWxwaGE7XG4gICAgICBwYXJ0aWNsZS5ib2R5LnNjYWxlWCA9IHBhcnRpY2xlLmJvZHkuc2NhbGVZID0gcGFydGljbGUuc2NhbGU7XG4gICAgICBwYXJ0aWNsZS5ib2R5LnJvdGF0aW9uID0gcGFydGljbGUucm90YXRpb247XG4gICAgfVxuICB9XG5cbiAgb25QYXJ0aWNsZURlYWQocGFydGljbGUpIHtcbiAgICBpZiAocGFydGljbGUuYm9keSkge1xuICAgICAgcGFydGljbGUuYm9keS5wYXJlbnQgJiYgcGFydGljbGUuYm9keS5wYXJlbnQucmVtb3ZlQ2hpbGQocGFydGljbGUuYm9keSk7XG4gICAgICB0aGlzLnBvb2wuZXhwaXJlKHBhcnRpY2xlLmJvZHkpO1xuICAgICAgcGFydGljbGUuYm9keSA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHBhcnRpY2xlLmdyYXBoaWNzKSB0aGlzLnBvb2wuZXhwaXJlKHBhcnRpY2xlLmdyYXBoaWNzKTtcbiAgfVxuXG4gIC8vIHByaXZhdGVcbiAgY3JlYXRlU3ByaXRlKHBhcnRpY2xlKSB7XG4gICAgcGFydGljbGUuYm9keSA9IHRoaXMucG9vbC5nZXQocGFydGljbGUuYm9keSk7XG5cbiAgICBpZiAocGFydGljbGUuYm9keS5wYXJlbnQpIHJldHVybjtcbiAgICBpZiAocGFydGljbGUuYm9keVtcImltYWdlXCJdKSB7XG4gICAgICBwYXJ0aWNsZS5ib2R5LnJlZ1ggPSBwYXJ0aWNsZS5ib2R5LmltYWdlLndpZHRoIC8gMjtcbiAgICAgIHBhcnRpY2xlLmJvZHkucmVnWSA9IHBhcnRpY2xlLmJvZHkuaW1hZ2UuaGVpZ2h0IC8gMjtcbiAgICB9XG4gIH1cblxuICBjcmVhdGVDaXJjbGUocGFydGljbGUpIHtcbiAgICBjb25zdCBncmFwaGljcyA9IHRoaXMucG9vbC5nZXQoY3JlYXRlanMuR3JhcGhpY3MpO1xuXG4gICAgaWYgKHRoaXMuc3Ryb2tlKSB7XG4gICAgICBpZiAoVHlwZXMuaXNTdHJpbmcodGhpcy5zdHJva2UpKSB7XG4gICAgICAgIGdyYXBoaWNzLmJlZ2luU3Ryb2tlKHRoaXMuc3Ryb2tlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGdyYXBoaWNzLmJlZ2luU3Ryb2tlKFwiIzAwMDAwMFwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZ3JhcGhpY3MuYmVnaW5GaWxsKHBhcnRpY2xlLmNvbG9yIHx8IFwiI2ZmMDAwMFwiKS5kcmF3Q2lyY2xlKDAsIDAsIHBhcnRpY2xlLnJhZGl1cyk7XG4gICAgY29uc3Qgc2hhcGUgPSB0aGlzLnBvb2wuZ2V0KGNyZWF0ZWpzLlNoYXBlLCBbZ3JhcGhpY3NdKTtcblxuICAgIHBhcnRpY2xlLmJvZHkgPSBzaGFwZTtcbiAgICBwYXJ0aWNsZS5ncmFwaGljcyA9IGdyYXBoaWNzO1xuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgdGhpcy5zdHJva2UgPSBudWxsO1xuICB9XG59XG4iLCJpbXBvcnQgUmVjdGFuZ2xlIGZyb20gXCIuLi9tYXRoL1JlY3RhbmdsZVwiO1xuaW1wb3J0IEJhc2VSZW5kZXJlciBmcm9tIFwiLi9CYXNlUmVuZGVyZXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGl4ZWxSZW5kZXJlciBleHRlbmRzIEJhc2VSZW5kZXJlciB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIHJlY3RhbmdsZSkge1xuICAgIHN1cGVyKGVsZW1lbnQpO1xuXG4gICAgdGhpcy5jb250ZXh0ID0gdGhpcy5lbGVtZW50LmdldENvbnRleHQoXCIyZFwiKTtcbiAgICB0aGlzLmltYWdlRGF0YSA9IG51bGw7XG4gICAgdGhpcy5yZWN0YW5nbGUgPSByZWN0YW5nbGU7XG4gICAgdGhpcy5jcmVhdGVJbWFnZURhdGEocmVjdGFuZ2xlKTtcblxuICAgIHRoaXMubmFtZSA9IFwiUGl4ZWxSZW5kZXJlclwiO1xuICB9XG5cbiAgcmVzaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICB0aGlzLmVsZW1lbnQud2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLmVsZW1lbnQuaGVpZ2h0ID0gaGVpZ2h0O1xuICB9XG5cbiAgY3JlYXRlSW1hZ2VEYXRhKHJlY3RhbmdsZSkge1xuICAgIHRoaXMucmVjdGFuZ2xlID0gcmVjdGFuZ2xlID8gcmVjdGFuZ2xlIDogbmV3IFJlY3RhbmdsZSgwLCAwLCB0aGlzLmVsZW1lbnQud2lkdGgsIHRoaXMuZWxlbWVudC5oZWlnaHQpO1xuICAgIHRoaXMuaW1hZ2VEYXRhID0gdGhpcy5jb250ZXh0LmNyZWF0ZUltYWdlRGF0YSh0aGlzLnJlY3RhbmdsZS53aWR0aCwgdGhpcy5yZWN0YW5nbGUuaGVpZ2h0KTtcbiAgICB0aGlzLmNvbnRleHQucHV0SW1hZ2VEYXRhKHRoaXMuaW1hZ2VEYXRhLCB0aGlzLnJlY3RhbmdsZS54LCB0aGlzLnJlY3RhbmdsZS55KTtcbiAgfVxuXG4gIG9uUHJvdG9uVXBkYXRlKCkge1xuICAgIHRoaXMuY29udGV4dC5jbGVhclJlY3QodGhpcy5yZWN0YW5nbGUueCwgdGhpcy5yZWN0YW5nbGUueSwgdGhpcy5yZWN0YW5nbGUud2lkdGgsIHRoaXMucmVjdGFuZ2xlLmhlaWdodCk7XG4gICAgdGhpcy5pbWFnZURhdGEgPSB0aGlzLmNvbnRleHQuZ2V0SW1hZ2VEYXRhKFxuICAgICAgdGhpcy5yZWN0YW5nbGUueCxcbiAgICAgIHRoaXMucmVjdGFuZ2xlLnksXG4gICAgICB0aGlzLnJlY3RhbmdsZS53aWR0aCxcbiAgICAgIHRoaXMucmVjdGFuZ2xlLmhlaWdodFxuICAgICk7XG4gIH1cblxuICBvblByb3RvblVwZGF0ZUFmdGVyKCkge1xuICAgIHRoaXMuY29udGV4dC5wdXRJbWFnZURhdGEodGhpcy5pbWFnZURhdGEsIHRoaXMucmVjdGFuZ2xlLngsIHRoaXMucmVjdGFuZ2xlLnkpO1xuICB9XG5cbiAgb25QYXJ0aWNsZUNyZWF0ZWQocGFydGljbGUpIHt9XG5cbiAgb25QYXJ0aWNsZVVwZGF0ZShwYXJ0aWNsZSkge1xuICAgIGlmICh0aGlzLmltYWdlRGF0YSkge1xuICAgICAgdGhpcy5zZXRQaXhlbChcbiAgICAgICAgdGhpcy5pbWFnZURhdGEsXG4gICAgICAgIChwYXJ0aWNsZS5wLnggLSB0aGlzLnJlY3RhbmdsZS54KSA+PiAwLFxuICAgICAgICAocGFydGljbGUucC55IC0gdGhpcy5yZWN0YW5nbGUueSkgPj4gMCxcbiAgICAgICAgcGFydGljbGVcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgc2V0UGl4ZWwoaW1hZ2VkYXRhLCB4LCB5LCBwYXJ0aWNsZSkge1xuICAgIGNvbnN0IHJnYiA9IHBhcnRpY2xlLnJnYjtcbiAgICBpZiAoeCA8IDAgfHwgeCA+IHRoaXMuZWxlbWVudC53aWR0aCB8fCB5IDwgMCB8fCB5ID4gdGhpcy5lbGVtZW50d2lkdGgpIHJldHVybjtcblxuICAgIGNvbnN0IGkgPSAoKHkgPj4gMCkgKiBpbWFnZWRhdGEud2lkdGggKyAoeCA+PiAwKSkgKiA0O1xuICAgIGltYWdlZGF0YS5kYXRhW2ldID0gcmdiLnI7XG4gICAgaW1hZ2VkYXRhLmRhdGFbaSArIDFdID0gcmdiLmc7XG4gICAgaW1hZ2VkYXRhLmRhdGFbaSArIDJdID0gcmdiLmI7XG4gICAgaW1hZ2VkYXRhLmRhdGFbaSArIDNdID0gcGFydGljbGUuYWxwaGEgKiAyNTU7XG4gIH1cblxuICBvblBhcnRpY2xlRGVhZChwYXJ0aWNsZSkge31cblxuICBkZXN0cm95KCkge1xuICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICB0aGlzLnN0cm9rZSA9IG51bGw7XG4gICAgdGhpcy5jb250ZXh0ID0gbnVsbDtcbiAgICB0aGlzLmltYWdlRGF0YSA9IG51bGw7XG4gICAgdGhpcy5yZWN0YW5nbGUgPSBudWxsO1xuICB9XG59XG4iLCJpbXBvcnQgVHlwZXMgZnJvbSBcIi4uL3V0aWxzL1R5cGVzXCI7XG5pbXBvcnQgQ29sb3JVdGlsIGZyb20gXCIuLi91dGlscy9Db2xvclV0aWxcIjtcbmltcG9ydCBNYXRoVXRpbCBmcm9tIFwiLi4vbWF0aC9NYXRoVXRpbFwiO1xuaW1wb3J0IEJhc2VSZW5kZXJlciBmcm9tIFwiLi9CYXNlUmVuZGVyZXJcIjtcblxubGV0IFBJWElDbGFzcztcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBpeGlSZW5kZXJlciBleHRlbmRzIEJhc2VSZW5kZXJlciB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIHN0cm9rZSkge1xuICAgIHN1cGVyKGVsZW1lbnQpO1xuXG4gICAgdGhpcy5zdHJva2UgPSBzdHJva2U7XG4gICAgdGhpcy5jb2xvciA9IGZhbHNlO1xuICAgIHRoaXMuc2V0Q29sb3IgPSBmYWxzZTtcbiAgICB0aGlzLmJsZW5kTW9kZSA9IG51bGw7XG4gICAgdGhpcy5wb29sLmNyZWF0ZSA9IChib2R5LCBwYXJ0aWNsZSkgPT4gdGhpcy5jcmVhdGVCb2R5KGJvZHksIHBhcnRpY2xlKTtcbiAgICB0aGlzLnNldFBJWEkod2luZG93LlBJWEkpO1xuXG4gICAgdGhpcy5uYW1lID0gXCJQaXhpUmVuZGVyZXJcIjtcbiAgfVxuXG4gIHNldFBJWEkoUElYSSkge1xuICAgIHRyeSB7XG4gICAgICBQSVhJQ2xhc3MgPSBQSVhJIHx8IHsgU3ByaXRlOiB7fSB9O1xuICAgICAgdGhpcy5jcmVhdGVGcm9tSW1hZ2UgPSBQSVhJQ2xhc3MuU3ByaXRlLmZyb20gfHwgUElYSUNsYXNzLlNwcml0ZS5mcm9tSW1hZ2U7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxuXG4gIG9uUHJvdG9uVXBkYXRlKCkge31cblxuICAvKipcbiAgICogQHBhcmFtIHBhcnRpY2xlXG4gICAqL1xuICBvblBhcnRpY2xlQ3JlYXRlZChwYXJ0aWNsZSkge1xuICAgIGlmIChwYXJ0aWNsZS5ib2R5KSB7XG4gICAgICBwYXJ0aWNsZS5ib2R5ID0gdGhpcy5wb29sLmdldChwYXJ0aWNsZS5ib2R5LCBwYXJ0aWNsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcnRpY2xlLmJvZHkgPSB0aGlzLnBvb2wuZ2V0KHRoaXMuY2lyY2xlQ29uZiwgcGFydGljbGUpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmJsZW5kTW9kZSkge1xuICAgICAgcGFydGljbGUuYm9keS5ibGVuZE1vZGUgPSB0aGlzLmJsZW5kTW9kZTtcbiAgICB9XG5cbiAgICB0aGlzLmVsZW1lbnQuYWRkQ2hpbGQocGFydGljbGUuYm9keSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHBhcnRpY2xlXG4gICAqL1xuICBvblBhcnRpY2xlVXBkYXRlKHBhcnRpY2xlKSB7XG4gICAgdGhpcy50cmFuc2Zvcm0ocGFydGljbGUsIHBhcnRpY2xlLmJvZHkpO1xuXG4gICAgaWYgKHRoaXMuc2V0Q29sb3IgPT09IHRydWUgfHwgdGhpcy5jb2xvciA9PT0gdHJ1ZSkge1xuICAgICAgcGFydGljbGUuYm9keS50aW50ID0gQ29sb3JVdGlsLmdldEhleDE2RnJvbVBhcnRpY2xlKHBhcnRpY2xlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHBhcnRpY2xlXG4gICAqL1xuICBvblBhcnRpY2xlRGVhZChwYXJ0aWNsZSkge1xuICAgIHRoaXMuZWxlbWVudC5yZW1vdmVDaGlsZChwYXJ0aWNsZS5ib2R5KTtcbiAgICB0aGlzLnBvb2wuZXhwaXJlKHBhcnRpY2xlLmJvZHkpO1xuICAgIHBhcnRpY2xlLmJvZHkgPSBudWxsO1xuICB9XG5cbiAgdHJhbnNmb3JtKHBhcnRpY2xlLCB0YXJnZXQpIHtcbiAgICB0YXJnZXQueCA9IHBhcnRpY2xlLnAueDtcbiAgICB0YXJnZXQueSA9IHBhcnRpY2xlLnAueTtcblxuICAgIHRhcmdldC5hbHBoYSA9IHBhcnRpY2xlLmFscGhhO1xuXG4gICAgdGFyZ2V0LnNjYWxlLnggPSBwYXJ0aWNsZS5zY2FsZTtcbiAgICB0YXJnZXQuc2NhbGUueSA9IHBhcnRpY2xlLnNjYWxlO1xuXG4gICAgLy8gdXNpbmcgY2FjaGVkIHZlcnNpb24gb2YgTWF0aFV0aWwuUElfMTgwIGZvciBzbGlnaHQgcGVyZm9ybWFuY2UgaW5jcmVhc2UuXG4gICAgdGFyZ2V0LnJvdGF0aW9uID0gcGFydGljbGUucm90YXRpb24gKiBNYXRoVXRpbC5QSV8xODA7IC8vIE1hdGhVdGlsLlBJXzE4MDtcbiAgfVxuXG4gIGNyZWF0ZUJvZHkoYm9keSwgcGFydGljbGUpIHtcbiAgICBpZiAoYm9keS5pc0NpcmNsZSkgcmV0dXJuIHRoaXMuY3JlYXRlQ2lyY2xlKHBhcnRpY2xlKTtcbiAgICBlbHNlIHJldHVybiB0aGlzLmNyZWF0ZVNwcml0ZShib2R5KTtcbiAgfVxuXG4gIGNyZWF0ZVNwcml0ZShib2R5KSB7XG4gICAgY29uc3Qgc3ByaXRlID0gYm9keS5pc0lubmVyID8gdGhpcy5jcmVhdGVGcm9tSW1hZ2UoYm9keS5zcmMpIDogbmV3IFBJWElDbGFzcy5TcHJpdGUoYm9keSk7XG5cbiAgICBzcHJpdGUuYW5jaG9yLnggPSAwLjU7XG4gICAgc3ByaXRlLmFuY2hvci55ID0gMC41O1xuXG4gICAgcmV0dXJuIHNwcml0ZTtcbiAgfVxuXG4gIGNyZWF0ZUNpcmNsZShwYXJ0aWNsZSkge1xuICAgIGNvbnN0IGdyYXBoaWNzID0gbmV3IFBJWElDbGFzcy5HcmFwaGljcygpO1xuXG4gICAgaWYgKHRoaXMuc3Ryb2tlKSB7XG4gICAgICBjb25zdCBzdHJva2UgPSBUeXBlcy5pc1N0cmluZyh0aGlzLnN0cm9rZSkgPyB0aGlzLnN0cm9rZSA6IDB4MDAwMDAwO1xuICAgICAgZ3JhcGhpY3MuYmVnaW5TdHJva2Uoc3Ryb2tlKTtcbiAgICB9XG5cbiAgICBncmFwaGljcy5iZWdpbkZpbGwocGFydGljbGUuY29sb3IgfHwgMHgwMDhjZWQpO1xuICAgIGdyYXBoaWNzLmRyYXdDaXJjbGUoMCwgMCwgcGFydGljbGUucmFkaXVzKTtcbiAgICBncmFwaGljcy5lbmRGaWxsKCk7XG5cbiAgICByZXR1cm4gZ3JhcGhpY3M7XG4gIH1cblxuICBkZXN0cm95KHBhcnRpY2xlcykge1xuICAgIHN1cGVyLmRlc3Ryb3koKTtcblxuICAgIGxldCBpID0gcGFydGljbGVzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICBsZXQgcGFydGljbGUgPSBwYXJ0aWNsZXNbaV07XG4gICAgICBpZiAocGFydGljbGUuYm9keSkge1xuICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlQ2hpbGQocGFydGljbGUuYm9keSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgTWF0MyBmcm9tIFwiLi4vbWF0aC9NYXQzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1TdGFjayB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMubWF0cyA9IFtdO1xuICAgIHRoaXMuc2l6ZSA9IDA7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDIwOyBpKyspIHRoaXMubWF0cy5wdXNoKE1hdDMuY3JlYXRlKFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXSkpO1xuICB9XG5cbiAgc2V0KG0sIGkpIHtcbiAgICBpZiAoaSA9PT0gMCkgTWF0My5zZXQobSwgdGhpcy5tYXRzWzBdKTtcbiAgICBlbHNlIE1hdDMubXVsdGlwbHkodGhpcy5tYXRzW2kgLSAxXSwgbSwgdGhpcy5tYXRzW2ldKTtcblxuICAgIHRoaXMuc2l6ZSA9IE1hdGgubWF4KHRoaXMuc2l6ZSwgaSArIDEpO1xuICB9XG5cbiAgcHVzaChtKSB7XG4gICAgaWYgKHRoaXMuc2l6ZSA9PT0gMCkgTWF0My5zZXQobSwgdGhpcy5tYXRzWzBdKTtcbiAgICBlbHNlIE1hdDMubXVsdGlwbHkodGhpcy5tYXRzW3RoaXMuc2l6ZSAtIDFdLCBtLCB0aGlzLm1hdHNbdGhpcy5zaXplXSk7XG5cbiAgICB0aGlzLnNpemUrKztcbiAgfVxuXG4gIHBvcCgpIHtcbiAgICBpZiAodGhpcy5zaXplID4gMCkgdGhpcy5zaXplLS07XG4gIH1cblxuICB0b3AoKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0c1t0aGlzLnNpemUgLSAxXTtcbiAgfVxufVxuIiwiaW1wb3J0IE1hdDMgZnJvbSBcIi4uL21hdGgvTWF0M1wiO1xuaW1wb3J0IEJhc2VSZW5kZXJlciBmcm9tIFwiLi9CYXNlUmVuZGVyZXJcIjtcblxuaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBJbWdVdGlsIGZyb20gXCIuLi91dGlscy9JbWdVdGlsXCI7XG5pbXBvcnQgTVN0YWNrIGZyb20gXCIuLi91dGlscy9NU3RhY2tcIjtcbmltcG9ydCBEb21VdGlsIGZyb20gXCIuLi91dGlscy9Eb21VdGlsXCI7XG5pbXBvcnQgV2ViR0xVdGlsIGZyb20gXCIuLi91dGlscy9XZWJHTFV0aWxcIjtcbmltcG9ydCBNYXRoVXRpbCBmcm9tIFwiLi4vbWF0aC9NYXRoVXRpbFwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXZWJHTFJlbmRlcmVyIGV4dGVuZHMgQmFzZVJlbmRlcmVyIHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCkge1xuICAgIHN1cGVyKGVsZW1lbnQpO1xuXG4gICAgdGhpcy5nbCA9IHRoaXMuZWxlbWVudC5nZXRDb250ZXh0KFwiZXhwZXJpbWVudGFsLXdlYmdsXCIsIHsgYW50aWFsaWFzOiB0cnVlLCBzdGVuY2lsOiBmYWxzZSwgZGVwdGg6IGZhbHNlIH0pO1xuICAgIGlmICghdGhpcy5nbCkgYWxlcnQoXCJTb3JyeSB5b3VyIGJyb3dzZXIgZG8gbm90IHN1cHBlc3QgV2ViR0whXCIpO1xuXG4gICAgdGhpcy5pbml0VmFyKCk7XG4gICAgdGhpcy5zZXRNYXhSYWRpdXMoKTtcbiAgICB0aGlzLmluaXRTaGFkZXJzKCk7XG4gICAgdGhpcy5pbml0QnVmZmVycygpO1xuXG4gICAgdGhpcy5nbC5ibGVuZEVxdWF0aW9uKHRoaXMuZ2wuRlVOQ19BREQpO1xuICAgIHRoaXMuZ2wuYmxlbmRGdW5jKHRoaXMuZ2wuU1JDX0FMUEhBLCB0aGlzLmdsLk9ORV9NSU5VU19TUkNfQUxQSEEpO1xuICAgIHRoaXMuZ2wuZW5hYmxlKHRoaXMuZ2wuQkxFTkQpO1xuICAgIHRoaXMuYWRkSW1nMkJvZHkgPSB0aGlzLmFkZEltZzJCb2R5LmJpbmQodGhpcyk7XG5cbiAgICB0aGlzLm5hbWUgPSBcIldlYkdMUmVuZGVyZXJcIjtcbiAgfVxuXG4gIGluaXQocHJvdG9uKSB7XG4gICAgc3VwZXIuaW5pdChwcm90b24pO1xuICAgIHRoaXMucmVzaXplKHRoaXMuZWxlbWVudC53aWR0aCwgdGhpcy5lbGVtZW50LmhlaWdodCk7XG4gIH1cblxuICByZXNpemUod2lkdGgsIGhlaWdodCkge1xuICAgIHRoaXMudW1hdFs0XSA9IC0yO1xuICAgIHRoaXMudW1hdFs3XSA9IDE7XG5cbiAgICB0aGlzLnNtYXRbMF0gPSAxIC8gd2lkdGg7XG4gICAgdGhpcy5zbWF0WzRdID0gMSAvIGhlaWdodDtcblxuICAgIHRoaXMubXN0YWNrLnNldCh0aGlzLnVtYXQsIDApO1xuICAgIHRoaXMubXN0YWNrLnNldCh0aGlzLnNtYXQsIDEpO1xuXG4gICAgdGhpcy5nbC52aWV3cG9ydCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB0aGlzLmVsZW1lbnQud2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLmVsZW1lbnQuaGVpZ2h0ID0gaGVpZ2h0O1xuICB9XG5cbiAgc2V0TWF4UmFkaXVzKHJhZGl1cykge1xuICAgIHRoaXMuY2lyY2xlQ2FudmFzVVJMID0gdGhpcy5jcmVhdGVDaXJjbGUocmFkaXVzKTtcbiAgfVxuXG4gIGdldFZlcnRleFNoYWRlcigpIHtcbiAgICBjb25zdCB2c1NvdXJjZSA9IFtcbiAgICAgIFwidW5pZm9ybSB2ZWMyIHZpZXdwb3J0O1wiLFxuICAgICAgXCJhdHRyaWJ1dGUgdmVjMiBhVmVydGV4UG9zaXRpb247XCIsXG4gICAgICBcImF0dHJpYnV0ZSB2ZWMyIGFUZXh0dXJlQ29vcmQ7XCIsXG4gICAgICBcInVuaWZvcm0gbWF0MyB0TWF0O1wiLFxuICAgICAgXCJ2YXJ5aW5nIHZlYzIgdlRleHR1cmVDb29yZDtcIixcbiAgICAgIFwidmFyeWluZyBmbG9hdCBhbHBoYTtcIixcbiAgICAgIFwidm9pZCBtYWluKCkge1wiLFxuICAgICAgXCJ2ZWMzIHYgPSB0TWF0ICogdmVjMyhhVmVydGV4UG9zaXRpb24sIDEuMCk7XCIsXG4gICAgICBcImdsX1Bvc2l0aW9uID0gdmVjNCh2LngsIHYueSwgMCwgMSk7XCIsXG4gICAgICBcInZUZXh0dXJlQ29vcmQgPSBhVGV4dHVyZUNvb3JkO1wiLFxuICAgICAgXCJhbHBoYSA9IHRNYXRbMF1bMl07XCIsXG4gICAgICBcIn1cIlxuICAgIF0uam9pbihcIlxcblwiKTtcbiAgICByZXR1cm4gdnNTb3VyY2U7XG4gIH1cblxuICBnZXRGcmFnbWVudFNoYWRlcigpIHtcbiAgICBjb25zdCBmc1NvdXJjZSA9IFtcbiAgICAgIFwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XCIsXG4gICAgICBcInZhcnlpbmcgdmVjMiB2VGV4dHVyZUNvb3JkO1wiLFxuICAgICAgXCJ2YXJ5aW5nIGZsb2F0IGFscGhhO1wiLFxuICAgICAgXCJ1bmlmb3JtIHNhbXBsZXIyRCB1U2FtcGxlcjtcIixcbiAgICAgIFwidW5pZm9ybSB2ZWM0IGNvbG9yO1wiLFxuICAgICAgXCJ1bmlmb3JtIGJvb2wgdXNlVGV4dHVyZTtcIixcbiAgICAgIFwidW5pZm9ybSB2ZWMzIHVDb2xvcjtcIixcbiAgICAgIFwidm9pZCBtYWluKCkge1wiLFxuICAgICAgXCJ2ZWM0IHRleHR1cmVDb2xvciA9IHRleHR1cmUyRCh1U2FtcGxlciwgdlRleHR1cmVDb29yZCk7XCIsXG4gICAgICBcImdsX0ZyYWdDb2xvciA9IHRleHR1cmVDb2xvciAqIHZlYzQodUNvbG9yLCAxLjApO1wiLFxuICAgICAgXCJnbF9GcmFnQ29sb3IudyAqPSBhbHBoYTtcIixcbiAgICAgIFwifVwiXG4gICAgXS5qb2luKFwiXFxuXCIpO1xuICAgIHJldHVybiBmc1NvdXJjZTtcbiAgfVxuXG4gIGluaXRWYXIoKSB7XG4gICAgdGhpcy5tc3RhY2sgPSBuZXcgTVN0YWNrKCk7XG4gICAgdGhpcy51bWF0ID0gTWF0My5jcmVhdGUoWzIsIDAsIDEsIDAsIC0yLCAwLCAtMSwgMSwgMV0pO1xuICAgIHRoaXMuc21hdCA9IE1hdDMuY3JlYXRlKFsxIC8gMTAwLCAwLCAxLCAwLCAxIC8gMTAwLCAwLCAwLCAwLCAxXSk7XG4gICAgdGhpcy50ZXh0dXJlYnVmZmVycyA9IHt9O1xuICB9XG5cbiAgYmxlbmRFcXVhdGlvbihBKSB7XG4gICAgdGhpcy5nbC5ibGVuZEVxdWF0aW9uKHRoaXMuZ2xbQV0pO1xuICB9XG5cbiAgYmxlbmRGdW5jKEEsIEIpIHtcbiAgICB0aGlzLmdsLmJsZW5kRnVuYyh0aGlzLmdsW0FdLCB0aGlzLmdsW0JdKTtcbiAgfVxuXG4gIGdldFNoYWRlcihnbCwgc3RyLCBmcykge1xuICAgIGNvbnN0IHNoYWRlciA9IGZzID8gZ2wuY3JlYXRlU2hhZGVyKGdsLkZSQUdNRU5UX1NIQURFUikgOiBnbC5jcmVhdGVTaGFkZXIoZ2wuVkVSVEVYX1NIQURFUik7XG5cbiAgICBnbC5zaGFkZXJTb3VyY2Uoc2hhZGVyLCBzdHIpO1xuICAgIGdsLmNvbXBpbGVTaGFkZXIoc2hhZGVyKTtcblxuICAgIGlmICghZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKHNoYWRlciwgZ2wuQ09NUElMRV9TVEFUVVMpKSB7XG4gICAgICBhbGVydChnbC5nZXRTaGFkZXJJbmZvTG9nKHNoYWRlcikpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNoYWRlcjtcbiAgfVxuXG4gIGluaXRTaGFkZXJzKCkge1xuICAgIGNvbnN0IGZyYWdtZW50U2hhZGVyID0gdGhpcy5nZXRTaGFkZXIodGhpcy5nbCwgdGhpcy5nZXRGcmFnbWVudFNoYWRlcigpLCB0cnVlKTtcbiAgICBjb25zdCB2ZXJ0ZXhTaGFkZXIgPSB0aGlzLmdldFNoYWRlcih0aGlzLmdsLCB0aGlzLmdldFZlcnRleFNoYWRlcigpLCBmYWxzZSk7XG5cbiAgICB0aGlzLnNwcm9ncmFtID0gdGhpcy5nbC5jcmVhdGVQcm9ncmFtKCk7XG4gICAgdGhpcy5nbC5hdHRhY2hTaGFkZXIodGhpcy5zcHJvZ3JhbSwgdmVydGV4U2hhZGVyKTtcbiAgICB0aGlzLmdsLmF0dGFjaFNoYWRlcih0aGlzLnNwcm9ncmFtLCBmcmFnbWVudFNoYWRlcik7XG4gICAgdGhpcy5nbC5saW5rUHJvZ3JhbSh0aGlzLnNwcm9ncmFtKTtcblxuICAgIGlmICghdGhpcy5nbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHRoaXMuc3Byb2dyYW0sIHRoaXMuZ2wuTElOS19TVEFUVVMpKSBhbGVydChcIkNvdWxkIG5vdCBpbml0aWFsaXNlIHNoYWRlcnNcIik7XG5cbiAgICB0aGlzLmdsLnVzZVByb2dyYW0odGhpcy5zcHJvZ3JhbSk7XG4gICAgdGhpcy5zcHJvZ3JhbS52cGEgPSB0aGlzLmdsLmdldEF0dHJpYkxvY2F0aW9uKHRoaXMuc3Byb2dyYW0sIFwiYVZlcnRleFBvc2l0aW9uXCIpO1xuICAgIHRoaXMuc3Byb2dyYW0udGNhID0gdGhpcy5nbC5nZXRBdHRyaWJMb2NhdGlvbih0aGlzLnNwcm9ncmFtLCBcImFUZXh0dXJlQ29vcmRcIik7XG4gICAgdGhpcy5nbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh0aGlzLnNwcm9ncmFtLnRjYSk7XG4gICAgdGhpcy5nbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh0aGlzLnNwcm9ncmFtLnZwYSk7XG5cbiAgICB0aGlzLnNwcm9ncmFtLnRNYXRVbmlmb3JtID0gdGhpcy5nbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5zcHJvZ3JhbSwgXCJ0TWF0XCIpO1xuICAgIHRoaXMuc3Byb2dyYW0uc2FtcGxlclVuaWZvcm0gPSB0aGlzLmdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnNwcm9ncmFtLCBcInVTYW1wbGVyXCIpO1xuICAgIHRoaXMuc3Byb2dyYW0udXNlVGV4ID0gdGhpcy5nbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5zcHJvZ3JhbSwgXCJ1c2VUZXh0dXJlXCIpO1xuICAgIHRoaXMuc3Byb2dyYW0uY29sb3IgPSB0aGlzLmdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnNwcm9ncmFtLCBcInVDb2xvclwiKTtcbiAgICB0aGlzLmdsLnVuaWZvcm0xaSh0aGlzLnNwcm9ncmFtLnVzZVRleCwgMSk7XG4gIH1cblxuICBpbml0QnVmZmVycygpIHtcbiAgICBjb25zdCB2cyA9IFswLCAzLCAxLCAwLCAyLCAzXTtcbiAgICBsZXQgaWR4O1xuXG4gICAgdGhpcy51bml0SUJ1ZmZlciA9IHRoaXMuZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgdGhpcy5nbC5iaW5kQnVmZmVyKHRoaXMuZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIHRoaXMudW5pdElCdWZmZXIpO1xuICAgIHRoaXMuZ2wuYnVmZmVyRGF0YSh0aGlzLmdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBuZXcgVWludDE2QXJyYXkodnMpLCB0aGlzLmdsLlNUQVRJQ19EUkFXKTtcblxuICAgIGxldCBpO1xuICAgIGxldCBpZHMgPSBbXTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIGlkcy5wdXNoKGkpO1xuICAgIGlkeCA9IG5ldyBVaW50MTZBcnJheShpZHMpO1xuXG4gICAgdGhpcy51bml0STMzID0gdGhpcy5nbC5jcmVhdGVCdWZmZXIoKTtcbiAgICB0aGlzLmdsLmJpbmRCdWZmZXIodGhpcy5nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgdGhpcy51bml0STMzKTtcbiAgICB0aGlzLmdsLmJ1ZmZlckRhdGEodGhpcy5nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgaWR4LCB0aGlzLmdsLlNUQVRJQ19EUkFXKTtcblxuICAgIGlkcyA9IFtdO1xuICAgIGZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgaWRzLnB1c2goaSwgaSArIDEsIGkgKyAyKTtcbiAgICBpZHggPSBuZXcgVWludDE2QXJyYXkoaWRzKTtcblxuICAgIHRoaXMuc3RyaXBCdWZmZXIgPSB0aGlzLmdsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCB0aGlzLnN0cmlwQnVmZmVyKTtcbiAgICB0aGlzLmdsLmJ1ZmZlckRhdGEodGhpcy5nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgaWR4LCB0aGlzLmdsLlNUQVRJQ19EUkFXKTtcbiAgfVxuXG4gIGNyZWF0ZUNpcmNsZShyYWlkdXMpIHtcbiAgICB0aGlzLmNpcmNsZUNhbnZhc1JhZGl1cyA9IFdlYkdMVXRpbC5uaHBvdChVdGlsLmluaXRWYWx1ZShyYWlkdXMsIDMyKSk7XG4gICAgY29uc3QgY2FudmFzID0gRG9tVXRpbC5jcmVhdGVDYW52YXMoXCJjaXJjbGVfY2FudmFzXCIsIHRoaXMuY2lyY2xlQ2FudmFzUmFkaXVzICogMiwgdGhpcy5jaXJjbGVDYW52YXNSYWRpdXMgKiAyKTtcbiAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcblxuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgY29udGV4dC5hcmModGhpcy5jaXJjbGVDYW52YXNSYWRpdXMsIHRoaXMuY2lyY2xlQ2FudmFzUmFkaXVzLCB0aGlzLmNpcmNsZUNhbnZhc1JhZGl1cywgMCwgTWF0aC5QSSAqIDIsIHRydWUpO1xuICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgY29udGV4dC5maWxsU3R5bGUgPSBcIiNGRkZcIjtcbiAgICBjb250ZXh0LmZpbGwoKTtcblxuICAgIHJldHVybiBjYW52YXMudG9EYXRhVVJMKCk7XG4gIH1cblxuICBkcmF3SW1nMkNhbnZhcyhwYXJ0aWNsZSkge1xuICAgIGNvbnN0IF93ID0gcGFydGljbGUuYm9keS53aWR0aDtcbiAgICBjb25zdCBfaCA9IHBhcnRpY2xlLmJvZHkuaGVpZ2h0O1xuXG4gICAgY29uc3QgX3dpZHRoID0gV2ViR0xVdGlsLm5ocG90KHBhcnRpY2xlLmJvZHkud2lkdGgpO1xuICAgIGNvbnN0IF9oZWlnaHQgPSBXZWJHTFV0aWwubmhwb3QocGFydGljbGUuYm9keS5oZWlnaHQpO1xuXG4gICAgY29uc3QgX3NjYWxlWCA9IHBhcnRpY2xlLmJvZHkud2lkdGggLyBfd2lkdGg7XG4gICAgY29uc3QgX3NjYWxlWSA9IHBhcnRpY2xlLmJvZHkuaGVpZ2h0IC8gX2hlaWdodDtcblxuICAgIGlmICghdGhpcy50ZXh0dXJlYnVmZmVyc1twYXJ0aWNsZS5kYXRhLnNyY10pXG4gICAgICB0aGlzLnRleHR1cmVidWZmZXJzW3BhcnRpY2xlLmRhdGEuc3JjXSA9IFtcbiAgICAgICAgdGhpcy5nbC5jcmVhdGVUZXh0dXJlKCksXG4gICAgICAgIHRoaXMuZ2wuY3JlYXRlQnVmZmVyKCksXG4gICAgICAgIHRoaXMuZ2wuY3JlYXRlQnVmZmVyKClcbiAgICAgIF07XG5cbiAgICBwYXJ0aWNsZS5kYXRhLnRleHR1cmUgPSB0aGlzLnRleHR1cmVidWZmZXJzW3BhcnRpY2xlLmRhdGEuc3JjXVswXTtcbiAgICBwYXJ0aWNsZS5kYXRhLnZjQnVmZmVyID0gdGhpcy50ZXh0dXJlYnVmZmVyc1twYXJ0aWNsZS5kYXRhLnNyY11bMV07XG4gICAgcGFydGljbGUuZGF0YS50Y0J1ZmZlciA9IHRoaXMudGV4dHVyZWJ1ZmZlcnNbcGFydGljbGUuZGF0YS5zcmNdWzJdO1xuXG4gICAgdGhpcy5nbC5iaW5kQnVmZmVyKHRoaXMuZ2wuQVJSQVlfQlVGRkVSLCBwYXJ0aWNsZS5kYXRhLnRjQnVmZmVyKTtcbiAgICB0aGlzLmdsLmJ1ZmZlckRhdGEoXG4gICAgICB0aGlzLmdsLkFSUkFZX0JVRkZFUixcbiAgICAgIG5ldyBGbG9hdDMyQXJyYXkoWzAuMCwgMC4wLCBfc2NhbGVYLCAwLjAsIDAuMCwgX3NjYWxlWSwgX3NjYWxlWSwgX3NjYWxlWV0pLFxuICAgICAgdGhpcy5nbC5TVEFUSUNfRFJBV1xuICAgICk7XG4gICAgdGhpcy5nbC5iaW5kQnVmZmVyKHRoaXMuZ2wuQVJSQVlfQlVGRkVSLCBwYXJ0aWNsZS5kYXRhLnZjQnVmZmVyKTtcbiAgICB0aGlzLmdsLmJ1ZmZlckRhdGEoXG4gICAgICB0aGlzLmdsLkFSUkFZX0JVRkZFUixcbiAgICAgIG5ldyBGbG9hdDMyQXJyYXkoWzAuMCwgMC4wLCBfdywgMC4wLCAwLjAsIF9oLCBfdywgX2hdKSxcbiAgICAgIHRoaXMuZ2wuU1RBVElDX0RSQVdcbiAgICApO1xuXG4gICAgY29uc3QgY29udGV4dCA9IHBhcnRpY2xlLmRhdGEuY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICBjb25zdCBkYXRhID0gY29udGV4dC5nZXRJbWFnZURhdGEoMCwgMCwgX3dpZHRoLCBfaGVpZ2h0KTtcblxuICAgIHRoaXMuZ2wuYmluZFRleHR1cmUodGhpcy5nbC5URVhUVVJFXzJELCBwYXJ0aWNsZS5kYXRhLnRleHR1cmUpO1xuICAgIHRoaXMuZ2wudGV4SW1hZ2UyRCh0aGlzLmdsLlRFWFRVUkVfMkQsIDAsIHRoaXMuZ2wuUkdCQSwgdGhpcy5nbC5SR0JBLCB0aGlzLmdsLlVOU0lHTkVEX0JZVEUsIGRhdGEpO1xuICAgIHRoaXMuZ2wudGV4UGFyYW1ldGVyaSh0aGlzLmdsLlRFWFRVUkVfMkQsIHRoaXMuZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCB0aGlzLmdsLkxJTkVBUik7XG4gICAgdGhpcy5nbC50ZXhQYXJhbWV0ZXJpKHRoaXMuZ2wuVEVYVFVSRV8yRCwgdGhpcy5nbC5URVhUVVJFX01JTl9GSUxURVIsIHRoaXMuZ2wuTElORUFSX01JUE1BUF9ORUFSRVNUKTtcbiAgICB0aGlzLmdsLmdlbmVyYXRlTWlwbWFwKHRoaXMuZ2wuVEVYVFVSRV8yRCk7XG5cbiAgICBwYXJ0aWNsZS5kYXRhLnRleHR1cmVMb2FkZWQgPSB0cnVlO1xuICAgIHBhcnRpY2xlLmRhdGEudGV4dHVyZVdpZHRoID0gX3c7XG4gICAgcGFydGljbGUuZGF0YS50ZXh0dXJlSGVpZ2h0ID0gX2g7XG4gIH1cblxuICBvblByb3RvblVwZGF0ZSgpIHtcbiAgICAvLyB0aGlzLmdsLmNsZWFyQ29sb3IoMCwgMCwgMCwgMSk7XG4gICAgLy8gdGhpcy5nbC5jbGVhcih0aGlzLmdsLkNPTE9SX0JVRkZFUl9CSVQgfCB0aGlzLmdsLkRFUFRIX0JVRkZFUl9CSVQpO1xuICB9XG5cbiAgb25QYXJ0aWNsZUNyZWF0ZWQocGFydGljbGUpIHtcbiAgICBwYXJ0aWNsZS5kYXRhLnRleHR1cmVMb2FkZWQgPSBmYWxzZTtcbiAgICBwYXJ0aWNsZS5kYXRhLnRtYXQgPSBNYXQzLmNyZWF0ZSgpO1xuICAgIHBhcnRpY2xlLmRhdGEudG1hdFs4XSA9IDE7XG4gICAgcGFydGljbGUuZGF0YS5pbWF0ID0gTWF0My5jcmVhdGUoKTtcbiAgICBwYXJ0aWNsZS5kYXRhLmltYXRbOF0gPSAxO1xuXG4gICAgaWYgKHBhcnRpY2xlLmJvZHkpIHtcbiAgICAgIEltZ1V0aWwuZ2V0SW1nRnJvbUNhY2hlKHBhcnRpY2xlLmJvZHksIHRoaXMuYWRkSW1nMkJvZHksIHBhcnRpY2xlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgSW1nVXRpbC5nZXRJbWdGcm9tQ2FjaGUodGhpcy5jaXJjbGVDYW52YXNVUkwsIHRoaXMuYWRkSW1nMkJvZHksIHBhcnRpY2xlKTtcbiAgICAgIHBhcnRpY2xlLmRhdGEub2xkU2NhbGUgPSBwYXJ0aWNsZS5yYWRpdXMgLyB0aGlzLmNpcmNsZUNhbnZhc1JhZGl1cztcbiAgICB9XG4gIH1cblxuICAvLyBwcml2YXRlXG4gIGFkZEltZzJCb2R5KGltZywgcGFydGljbGUpIHtcbiAgICBpZiAocGFydGljbGUuZGVhZCkgcmV0dXJuO1xuICAgIHBhcnRpY2xlLmJvZHkgPSBpbWc7XG4gICAgcGFydGljbGUuZGF0YS5zcmMgPSBpbWcuc3JjO1xuICAgIHBhcnRpY2xlLmRhdGEuY2FudmFzID0gSW1nVXRpbC5nZXRDYW52YXNGcm9tQ2FjaGUoaW1nKTtcbiAgICBwYXJ0aWNsZS5kYXRhLm9sZFNjYWxlID0gMTtcblxuICAgIHRoaXMuZHJhd0ltZzJDYW52YXMocGFydGljbGUpO1xuICB9XG5cbiAgb25QYXJ0aWNsZVVwZGF0ZShwYXJ0aWNsZSkge1xuICAgIGlmIChwYXJ0aWNsZS5kYXRhLnRleHR1cmVMb2FkZWQpIHtcbiAgICAgIHRoaXMudXBkYXRlTWF0cml4KHBhcnRpY2xlKTtcblxuICAgICAgdGhpcy5nbC51bmlmb3JtM2YodGhpcy5zcHJvZ3JhbS5jb2xvciwgcGFydGljbGUucmdiLnIgLyAyNTUsIHBhcnRpY2xlLnJnYi5nIC8gMjU1LCBwYXJ0aWNsZS5yZ2IuYiAvIDI1NSk7XG4gICAgICB0aGlzLmdsLnVuaWZvcm1NYXRyaXgzZnYodGhpcy5zcHJvZ3JhbS50TWF0VW5pZm9ybSwgZmFsc2UsIHRoaXMubXN0YWNrLnRvcCgpKTtcblxuICAgICAgdGhpcy5nbC5iaW5kQnVmZmVyKHRoaXMuZ2wuQVJSQVlfQlVGRkVSLCBwYXJ0aWNsZS5kYXRhLnZjQnVmZmVyKTtcbiAgICAgIHRoaXMuZ2wudmVydGV4QXR0cmliUG9pbnRlcih0aGlzLnNwcm9ncmFtLnZwYSwgMiwgdGhpcy5nbC5GTE9BVCwgZmFsc2UsIDAsIDApO1xuICAgICAgdGhpcy5nbC5iaW5kQnVmZmVyKHRoaXMuZ2wuQVJSQVlfQlVGRkVSLCBwYXJ0aWNsZS5kYXRhLnRjQnVmZmVyKTtcbiAgICAgIHRoaXMuZ2wudmVydGV4QXR0cmliUG9pbnRlcih0aGlzLnNwcm9ncmFtLnRjYSwgMiwgdGhpcy5nbC5GTE9BVCwgZmFsc2UsIDAsIDApO1xuICAgICAgdGhpcy5nbC5iaW5kVGV4dHVyZSh0aGlzLmdsLlRFWFRVUkVfMkQsIHBhcnRpY2xlLmRhdGEudGV4dHVyZSk7XG4gICAgICB0aGlzLmdsLnVuaWZvcm0xaSh0aGlzLnNwcm9ncmFtLnNhbXBsZXJVbmlmb3JtLCAwKTtcbiAgICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCB0aGlzLnVuaXRJQnVmZmVyKTtcblxuICAgICAgdGhpcy5nbC5kcmF3RWxlbWVudHModGhpcy5nbC5UUklBTkdMRVMsIDYsIHRoaXMuZ2wuVU5TSUdORURfU0hPUlQsIDApO1xuICAgICAgdGhpcy5tc3RhY2sucG9wKCk7XG4gICAgfVxuICB9XG5cbiAgb25QYXJ0aWNsZURlYWQocGFydGljbGUpIHt9XG5cbiAgdXBkYXRlTWF0cml4KHBhcnRpY2xlKSB7XG4gICAgY29uc3QgbW92ZU9yaWdpbk1hdHJpeCA9IFdlYkdMVXRpbC5tYWtlVHJhbnNsYXRpb24oXG4gICAgICAtcGFydGljbGUuZGF0YS50ZXh0dXJlV2lkdGggLyAyLFxuICAgICAgLXBhcnRpY2xlLmRhdGEudGV4dHVyZUhlaWdodCAvIDJcbiAgICApO1xuICAgIGNvbnN0IHRyYW5zbGF0aW9uTWF0cml4ID0gV2ViR0xVdGlsLm1ha2VUcmFuc2xhdGlvbihwYXJ0aWNsZS5wLngsIHBhcnRpY2xlLnAueSk7XG5cbiAgICBjb25zdCBhbmdlbCA9IHBhcnRpY2xlLnJvdGF0aW9uICogTWF0aFV0aWwuUElfMTgwO1xuICAgIGNvbnN0IHJvdGF0aW9uTWF0cml4ID0gV2ViR0xVdGlsLm1ha2VSb3RhdGlvbihhbmdlbCk7XG5cbiAgICBjb25zdCBzY2FsZSA9IHBhcnRpY2xlLnNjYWxlICogcGFydGljbGUuZGF0YS5vbGRTY2FsZTtcbiAgICBjb25zdCBzY2FsZU1hdHJpeCA9IFdlYkdMVXRpbC5tYWtlU2NhbGUoc2NhbGUsIHNjYWxlKTtcbiAgICBsZXQgbWF0cml4ID0gV2ViR0xVdGlsLm1hdHJpeE11bHRpcGx5KG1vdmVPcmlnaW5NYXRyaXgsIHNjYWxlTWF0cml4KTtcblxuICAgIG1hdHJpeCA9IFdlYkdMVXRpbC5tYXRyaXhNdWx0aXBseShtYXRyaXgsIHJvdGF0aW9uTWF0cml4KTtcbiAgICBtYXRyaXggPSBXZWJHTFV0aWwubWF0cml4TXVsdGlwbHkobWF0cml4LCB0cmFuc2xhdGlvbk1hdHJpeCk7XG5cbiAgICBNYXQzLmludmVyc2UobWF0cml4LCBwYXJ0aWNsZS5kYXRhLmltYXQpO1xuICAgIG1hdHJpeFsyXSA9IHBhcnRpY2xlLmFscGhhO1xuXG4gICAgdGhpcy5tc3RhY2sucHVzaChtYXRyaXgpO1xuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgdGhpcy5nbCA9IG51bGw7XG4gICAgdGhpcy5tc3RhY2sgPSBudWxsO1xuICAgIHRoaXMudW1hdCA9IG51bGw7XG4gICAgdGhpcy5zbWF0ID0gbnVsbDtcbiAgICB0aGlzLnRleHR1cmVidWZmZXJzID0gbnVsbDtcbiAgfVxufVxuIiwiaW1wb3J0IEJhc2VSZW5kZXJlciBmcm9tIFwiLi9CYXNlUmVuZGVyZXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ3VzdG9tUmVuZGVyZXIgZXh0ZW5kcyBCYXNlUmVuZGVyZXIge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50KSB7XG4gICAgc3VwZXIoZWxlbWVudCk7XG5cbiAgICB0aGlzLm5hbWUgPSBcIkN1c3RvbVJlbmRlcmVyXCI7XG4gIH1cbn1cbiIsImltcG9ydCBab25lIGZyb20gXCIuL1pvbmVcIjtcbmltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgTWF0aFV0aWwgZnJvbSBcIi4uL21hdGgvTWF0aFV0aWxcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGluZVpvbmUgZXh0ZW5kcyBab25lIHtcbiAgY29uc3RydWN0b3IoeDEsIHkxLCB4MiwgeTIsIGRpcmVjdGlvbikge1xuICAgIHN1cGVyKCk7XG5cbiAgICBpZiAoeDIgLSB4MSA+PSAwKSB7XG4gICAgICB0aGlzLngxID0geDE7XG4gICAgICB0aGlzLnkxID0geTE7XG4gICAgICB0aGlzLngyID0geDI7XG4gICAgICB0aGlzLnkyID0geTI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMueDEgPSB4MjtcbiAgICAgIHRoaXMueTEgPSB5MjtcbiAgICAgIHRoaXMueDIgPSB4MTtcbiAgICAgIHRoaXMueTIgPSB5MTtcbiAgICB9XG5cbiAgICB0aGlzLmR4ID0gdGhpcy54MiAtIHRoaXMueDE7XG4gICAgdGhpcy5keSA9IHRoaXMueTIgLSB0aGlzLnkxO1xuXG4gICAgdGhpcy5taW54ID0gTWF0aC5taW4odGhpcy54MSwgdGhpcy54Mik7XG4gICAgdGhpcy5taW55ID0gTWF0aC5taW4odGhpcy55MSwgdGhpcy55Mik7XG4gICAgdGhpcy5tYXh4ID0gTWF0aC5tYXgodGhpcy54MSwgdGhpcy54Mik7XG4gICAgdGhpcy5tYXh5ID0gTWF0aC5tYXgodGhpcy55MSwgdGhpcy55Mik7XG5cbiAgICB0aGlzLmRvdCA9IHRoaXMueDIgKiB0aGlzLnkxIC0gdGhpcy54MSAqIHRoaXMueTI7XG4gICAgdGhpcy54eHl5ID0gdGhpcy5keCAqIHRoaXMuZHggKyB0aGlzLmR5ICogdGhpcy5keTtcblxuICAgIHRoaXMuZ3JhZGllbnQgPSB0aGlzLmdldEdyYWRpZW50KCk7XG4gICAgdGhpcy5sZW5ndGggPSB0aGlzLmdldExlbmd0aCgpO1xuICAgIHRoaXMuZGlyZWN0aW9uID0gVXRpbC5pbml0VmFsdWUoZGlyZWN0aW9uLCBcIj5cIik7XG4gIH1cblxuICBnZXRQb3NpdGlvbigpIHtcbiAgICB0aGlzLnJhbmRvbSA9IE1hdGgucmFuZG9tKCk7XG4gICAgdGhpcy52ZWN0b3IueCA9IHRoaXMueDEgKyB0aGlzLnJhbmRvbSAqIHRoaXMubGVuZ3RoICogTWF0aC5jb3ModGhpcy5ncmFkaWVudCk7XG4gICAgdGhpcy52ZWN0b3IueSA9IHRoaXMueTEgKyB0aGlzLnJhbmRvbSAqIHRoaXMubGVuZ3RoICogTWF0aC5zaW4odGhpcy5ncmFkaWVudCk7XG5cbiAgICByZXR1cm4gdGhpcy52ZWN0b3I7XG4gIH1cblxuICBnZXREaXJlY3Rpb24oeCwgeSkge1xuICAgIGNvbnN0IEEgPSB0aGlzLmR5O1xuICAgIGNvbnN0IEIgPSAtdGhpcy5keDtcbiAgICBjb25zdCBDID0gdGhpcy5kb3Q7XG4gICAgY29uc3QgRCA9IEIgPT09IDAgPyAxIDogQjtcblxuICAgIGlmICgoQSAqIHggKyBCICogeSArIEMpICogRCA+IDApIHJldHVybiB0cnVlO1xuICAgIGVsc2UgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0RGlzdGFuY2UoeCwgeSkge1xuICAgIGNvbnN0IEEgPSB0aGlzLmR5O1xuICAgIGNvbnN0IEIgPSAtdGhpcy5keDtcbiAgICBjb25zdCBDID0gdGhpcy5kb3Q7XG4gICAgY29uc3QgRCA9IEEgKiB4ICsgQiAqIHkgKyBDO1xuXG4gICAgcmV0dXJuIEQgLyBNYXRoLnNxcnQodGhpcy54eHl5KTtcbiAgfVxuXG4gIGdldFN5bW1ldHJpYyh2KSB7XG4gICAgY29uc3QgdGhhMiA9IHYuZ2V0R3JhZGllbnQoKTtcbiAgICBjb25zdCB0aGExID0gdGhpcy5nZXRHcmFkaWVudCgpO1xuICAgIGNvbnN0IHRoYSA9IDIgKiAodGhhMSAtIHRoYTIpO1xuXG4gICAgY29uc3Qgb2xkeCA9IHYueDtcbiAgICBjb25zdCBvbGR5ID0gdi55O1xuXG4gICAgdi54ID0gb2xkeCAqIE1hdGguY29zKHRoYSkgLSBvbGR5ICogTWF0aC5zaW4odGhhKTtcbiAgICB2LnkgPSBvbGR4ICogTWF0aC5zaW4odGhhKSArIG9sZHkgKiBNYXRoLmNvcyh0aGEpO1xuXG4gICAgcmV0dXJuIHY7XG4gIH1cblxuICBnZXRHcmFkaWVudCgpIHtcbiAgICByZXR1cm4gTWF0aC5hdGFuMih0aGlzLmR5LCB0aGlzLmR4KTtcbiAgfVxuXG4gIHJhbmdlT3V0KHBhcnRpY2xlKSB7XG4gICAgY29uc3QgYW5nbGUgPSBNYXRoLmFicyh0aGlzLmdldEdyYWRpZW50KCkpO1xuXG4gICAgaWYgKGFuZ2xlIDw9IE1hdGhVdGlsLlBJIC8gNCkge1xuICAgICAgaWYgKHBhcnRpY2xlLnAueCA8PSB0aGlzLm1heHggJiYgcGFydGljbGUucC54ID49IHRoaXMubWlueCkgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwYXJ0aWNsZS5wLnkgPD0gdGhpcy5tYXh5ICYmIHBhcnRpY2xlLnAueSA+PSB0aGlzLm1pbnkpIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldExlbmd0aCgpIHtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZHggKiB0aGlzLmR4ICsgdGhpcy5keSAqIHRoaXMuZHkpO1xuICB9XG5cbiAgY3Jvc3NpbmcocGFydGljbGUpIHtcbiAgICBpZiAodGhpcy5jcm9zc1R5cGUgPT09IFwiZGVhZFwiKSB7XG4gICAgICBpZiAodGhpcy5kaXJlY3Rpb24gPT09IFwiPlwiIHx8IHRoaXMuZGlyZWN0aW9uID09PSBcIlJcIiB8fCB0aGlzLmRpcmVjdGlvbiA9PT0gXCJyaWdodFwiIHx8IHRoaXMuZGlyZWN0aW9uID09PSBcImRvd25cIikge1xuICAgICAgICBpZiAoIXRoaXMucmFuZ2VPdXQocGFydGljbGUpKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmdldERpcmVjdGlvbihwYXJ0aWNsZS5wLngsIHBhcnRpY2xlLnAueSkpIHBhcnRpY2xlLmRlYWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCF0aGlzLnJhbmdlT3V0KHBhcnRpY2xlKSkgcmV0dXJuO1xuICAgICAgICBpZiAoIXRoaXMuZ2V0RGlyZWN0aW9uKHBhcnRpY2xlLnAueCwgcGFydGljbGUucC55KSkgcGFydGljbGUuZGVhZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmNyb3NzVHlwZSA9PT0gXCJib3VuZFwiKSB7XG4gICAgICBpZiAoIXRoaXMucmFuZ2VPdXQocGFydGljbGUpKSByZXR1cm47XG5cbiAgICAgIGlmICh0aGlzLmdldERpc3RhbmNlKHBhcnRpY2xlLnAueCwgcGFydGljbGUucC55KSA8PSBwYXJ0aWNsZS5yYWRpdXMpIHtcbiAgICAgICAgaWYgKHRoaXMuZHggPT09IDApIHtcbiAgICAgICAgICBwYXJ0aWNsZS52LnggKj0gLTE7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5keSA9PT0gMCkge1xuICAgICAgICAgIHBhcnRpY2xlLnYueSAqPSAtMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmdldFN5bW1ldHJpYyhwYXJ0aWNsZS52KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5jcm9zc1R5cGUgPT09IFwiY3Jvc3NcIikge1xuICAgICAgaWYgKHRoaXMuYWxlcnQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlNvcnJ5LCBMaW5lWm9uZSBkb2VzIG5vdCBzdXBwb3J0IGNyb3NzIG1ldGhvZCFcIik7XG4gICAgICAgIHRoaXMuYWxlcnQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBab25lIGZyb20gXCIuL1pvbmVcIjtcbmltcG9ydCBNYXRoVXRpbCBmcm9tIFwiLi4vbWF0aC9NYXRoVXRpbFwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDaXJjbGVab25lIGV4dGVuZHMgWm9uZSB7XG4gIGNvbnN0cnVjdG9yKHgsIHksIHJhZGl1cykge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG4gICAgdGhpcy5yYWRpdXMgPSByYWRpdXM7XG4gICAgdGhpcy5hbmdsZSA9IDA7XG4gICAgdGhpcy5jZW50ZXIgPSB7IHgsIHkgfTtcbiAgfVxuXG4gIGdldFBvc2l0aW9uKCkge1xuICAgIHRoaXMuYW5nbGUgPSBNYXRoVXRpbC5QSXgyICogTWF0aC5yYW5kb20oKTtcbiAgICB0aGlzLnJhbmRvbVJhZGl1cyA9IE1hdGgucmFuZG9tKCkgKiB0aGlzLnJhZGl1cztcbiAgICB0aGlzLnZlY3Rvci54ID0gdGhpcy54ICsgdGhpcy5yYW5kb21SYWRpdXMgKiBNYXRoLmNvcyh0aGlzLmFuZ2xlKTtcbiAgICB0aGlzLnZlY3Rvci55ID0gdGhpcy55ICsgdGhpcy5yYW5kb21SYWRpdXMgKiBNYXRoLnNpbih0aGlzLmFuZ2xlKTtcblxuICAgIHJldHVybiB0aGlzLnZlY3RvcjtcbiAgfVxuXG4gIHNldENlbnRlcih4LCB5KSB7XG4gICAgdGhpcy5jZW50ZXIueCA9IHg7XG4gICAgdGhpcy5jZW50ZXIueSA9IHk7XG4gIH1cblxuICBjcm9zc2luZyhwYXJ0aWNsZSkge1xuICAgIGNvbnN0IGQgPSBwYXJ0aWNsZS5wLmRpc3RhbmNlVG8odGhpcy5jZW50ZXIpO1xuXG4gICAgaWYgKHRoaXMuY3Jvc3NUeXBlID09PSBcImRlYWRcIikge1xuICAgICAgaWYgKGQgLSBwYXJ0aWNsZS5yYWRpdXMgPiB0aGlzLnJhZGl1cykgcGFydGljbGUuZGVhZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNyb3NzVHlwZSA9PT0gXCJib3VuZFwiKSB7XG4gICAgICBpZiAoZCArIHBhcnRpY2xlLnJhZGl1cyA+PSB0aGlzLnJhZGl1cykgdGhpcy5nZXRTeW1tZXRyaWMocGFydGljbGUpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jcm9zc1R5cGUgPT09IFwiY3Jvc3NcIikge1xuICAgICAgaWYgKHRoaXMuYWxlcnQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlNvcnJ5LCBDaXJjbGVab25lIGRvZXMgbm90IHN1cHBvcnQgY3Jvc3MgbWV0aG9kIVwiKTtcbiAgICAgICAgdGhpcy5hbGVydCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldFN5bW1ldHJpYyhwYXJ0aWNsZSkge1xuICAgIGNvbnN0IHRoYTIgPSBwYXJ0aWNsZS52LmdldEdyYWRpZW50KCk7XG4gICAgY29uc3QgdGhhMSA9IHRoaXMuZ2V0R3JhZGllbnQocGFydGljbGUpO1xuXG4gICAgY29uc3QgdGhhID0gMiAqICh0aGExIC0gdGhhMik7XG4gICAgY29uc3Qgb2xkeCA9IHBhcnRpY2xlLnYueDtcbiAgICBjb25zdCBvbGR5ID0gcGFydGljbGUudi55O1xuXG4gICAgcGFydGljbGUudi54ID0gb2xkeCAqIE1hdGguY29zKHRoYSkgLSBvbGR5ICogTWF0aC5zaW4odGhhKTtcbiAgICBwYXJ0aWNsZS52LnkgPSBvbGR4ICogTWF0aC5zaW4odGhhKSArIG9sZHkgKiBNYXRoLmNvcyh0aGEpO1xuICB9XG5cbiAgZ2V0R3JhZGllbnQocGFydGljbGUpIHtcbiAgICByZXR1cm4gLU1hdGhVdGlsLlBJXzIgKyBNYXRoLmF0YW4yKHBhcnRpY2xlLnAueSAtIHRoaXMuY2VudGVyLnksIHBhcnRpY2xlLnAueCAtIHRoaXMuY2VudGVyLngpO1xuICB9XG59XG4iLCJpbXBvcnQgWm9uZSBmcm9tIFwiLi9ab25lXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlY3Rab25lIGV4dGVuZHMgWm9uZSB7XG4gIGNvbnN0cnVjdG9yKHgsIHksIHdpZHRoLCBoZWlnaHQpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgfVxuXG4gIGdldFBvc2l0aW9uKCkge1xuICAgIHRoaXMudmVjdG9yLnggPSB0aGlzLnggKyBNYXRoLnJhbmRvbSgpICogdGhpcy53aWR0aDtcbiAgICB0aGlzLnZlY3Rvci55ID0gdGhpcy55ICsgTWF0aC5yYW5kb20oKSAqIHRoaXMuaGVpZ2h0O1xuXG4gICAgcmV0dXJuIHRoaXMudmVjdG9yO1xuICB9XG5cbiAgY3Jvc3NpbmcocGFydGljbGUpIHtcbiAgICAvLyBwYXJ0aWNsZSBkZWFkIHpvbmVcbiAgICBpZiAodGhpcy5jcm9zc1R5cGUgPT09IFwiZGVhZFwiKSB7XG4gICAgICBpZiAocGFydGljbGUucC54ICsgcGFydGljbGUucmFkaXVzIDwgdGhpcy54KSBwYXJ0aWNsZS5kZWFkID0gdHJ1ZTtcbiAgICAgIGVsc2UgaWYgKHBhcnRpY2xlLnAueCAtIHBhcnRpY2xlLnJhZGl1cyA+IHRoaXMueCArIHRoaXMud2lkdGgpIHBhcnRpY2xlLmRlYWQgPSB0cnVlO1xuXG4gICAgICBpZiAocGFydGljbGUucC55ICsgcGFydGljbGUucmFkaXVzIDwgdGhpcy55KSBwYXJ0aWNsZS5kZWFkID0gdHJ1ZTtcbiAgICAgIGVsc2UgaWYgKHBhcnRpY2xlLnAueSAtIHBhcnRpY2xlLnJhZGl1cyA+IHRoaXMueSArIHRoaXMuaGVpZ2h0KSBwYXJ0aWNsZS5kZWFkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBwYXJ0aWNsZSBib3VuZCB6b25lXG4gICAgZWxzZSBpZiAodGhpcy5jcm9zc1R5cGUgPT09IFwiYm91bmRcIikge1xuICAgICAgaWYgKHBhcnRpY2xlLnAueCAtIHBhcnRpY2xlLnJhZGl1cyA8IHRoaXMueCkge1xuICAgICAgICBwYXJ0aWNsZS5wLnggPSB0aGlzLnggKyBwYXJ0aWNsZS5yYWRpdXM7XG4gICAgICAgIHBhcnRpY2xlLnYueCAqPSAtMTtcbiAgICAgIH0gZWxzZSBpZiAocGFydGljbGUucC54ICsgcGFydGljbGUucmFkaXVzID4gdGhpcy54ICsgdGhpcy53aWR0aCkge1xuICAgICAgICBwYXJ0aWNsZS5wLnggPSB0aGlzLnggKyB0aGlzLndpZHRoIC0gcGFydGljbGUucmFkaXVzO1xuICAgICAgICBwYXJ0aWNsZS52LnggKj0gLTE7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJ0aWNsZS5wLnkgLSBwYXJ0aWNsZS5yYWRpdXMgPCB0aGlzLnkpIHtcbiAgICAgICAgcGFydGljbGUucC55ID0gdGhpcy55ICsgcGFydGljbGUucmFkaXVzO1xuICAgICAgICBwYXJ0aWNsZS52LnkgKj0gLTE7XG4gICAgICB9IGVsc2UgaWYgKHBhcnRpY2xlLnAueSArIHBhcnRpY2xlLnJhZGl1cyA+IHRoaXMueSArIHRoaXMuaGVpZ2h0KSB7XG4gICAgICAgIHBhcnRpY2xlLnAueSA9IHRoaXMueSArIHRoaXMuaGVpZ2h0IC0gcGFydGljbGUucmFkaXVzO1xuICAgICAgICBwYXJ0aWNsZS52LnkgKj0gLTE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gcGFydGljbGUgY3Jvc3Mgem9uZVxuICAgIGVsc2UgaWYgKHRoaXMuY3Jvc3NUeXBlID09PSBcImNyb3NzXCIpIHtcbiAgICAgIGlmIChwYXJ0aWNsZS5wLnggKyBwYXJ0aWNsZS5yYWRpdXMgPCB0aGlzLnggJiYgcGFydGljbGUudi54IDw9IDApIHtcbiAgICAgICAgcGFydGljbGUucC54ID0gdGhpcy54ICsgdGhpcy53aWR0aCArIHBhcnRpY2xlLnJhZGl1cztcbiAgICAgIH0gZWxzZSBpZiAocGFydGljbGUucC54IC0gcGFydGljbGUucmFkaXVzID4gdGhpcy54ICsgdGhpcy53aWR0aCAmJiBwYXJ0aWNsZS52LnggPj0gMCkge1xuICAgICAgICBwYXJ0aWNsZS5wLnggPSB0aGlzLnggLSBwYXJ0aWNsZS5yYWRpdXM7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJ0aWNsZS5wLnkgKyBwYXJ0aWNsZS5yYWRpdXMgPCB0aGlzLnkgJiYgcGFydGljbGUudi55IDw9IDApIHtcbiAgICAgICAgcGFydGljbGUucC55ID0gdGhpcy55ICsgdGhpcy5oZWlnaHQgKyBwYXJ0aWNsZS5yYWRpdXM7XG4gICAgICB9IGVsc2UgaWYgKHBhcnRpY2xlLnAueSAtIHBhcnRpY2xlLnJhZGl1cyA+IHRoaXMueSArIHRoaXMuaGVpZ2h0ICYmIHBhcnRpY2xlLnYueSA+PSAwKSB7XG4gICAgICAgIHBhcnRpY2xlLnAueSA9IHRoaXMueSAtIHBhcnRpY2xlLnJhZGl1cztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBab25lIGZyb20gXCIuL1pvbmVcIjtcbmltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEltYWdlWm9uZSBleHRlbmRzIFpvbmUge1xuICBjb25zdHJ1Y3RvcihpbWFnZURhdGEsIHgsIHksIGQpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucmVzZXQoaW1hZ2VEYXRhLCB4LCB5LCBkKTtcbiAgfVxuXG4gIHJlc2V0KGltYWdlRGF0YSwgeCwgeSwgZCkge1xuICAgIHRoaXMuaW1hZ2VEYXRhID0gaW1hZ2VEYXRhO1xuICAgIHRoaXMueCA9IFV0aWwuaW5pdFZhbHVlKHgsIDApO1xuICAgIHRoaXMueSA9IFV0aWwuaW5pdFZhbHVlKHksIDApO1xuICAgIHRoaXMuZCA9IFV0aWwuaW5pdFZhbHVlKGQsIDIpO1xuXG4gICAgdGhpcy52ZWN0b3JzID0gW107XG4gICAgdGhpcy5zZXRWZWN0b3JzKCk7XG4gIH1cblxuICBzZXRWZWN0b3JzKCkge1xuICAgIGxldCBpLCBqO1xuICAgIGNvbnN0IGxlbmd0aDEgPSB0aGlzLmltYWdlRGF0YS53aWR0aDtcbiAgICBjb25zdCBsZW5ndGgyID0gdGhpcy5pbWFnZURhdGEuaGVpZ2h0O1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDE7IGkgKz0gdGhpcy5kKSB7XG4gICAgICBmb3IgKGogPSAwOyBqIDwgbGVuZ3RoMjsgaiArPSB0aGlzLmQpIHtcbiAgICAgICAgbGV0IGluZGV4ID0gKChqID4+IDApICogbGVuZ3RoMSArIChpID4+IDApKSAqIDQ7XG5cbiAgICAgICAgaWYgKHRoaXMuaW1hZ2VEYXRhLmRhdGFbaW5kZXggKyAzXSA+IDApIHtcbiAgICAgICAgICB0aGlzLnZlY3RvcnMucHVzaCh7IHg6IGkgKyB0aGlzLngsIHk6IGogKyB0aGlzLnkgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy52ZWN0b3I7XG4gIH1cblxuICBnZXRCb3VuZCh4LCB5KSB7XG4gICAgY29uc3QgaW5kZXggPSAoKHkgPj4gMCkgKiB0aGlzLmltYWdlRGF0YS53aWR0aCArICh4ID4+IDApKSAqIDQ7XG4gICAgaWYgKHRoaXMuaW1hZ2VEYXRhLmRhdGFbaW5kZXggKyAzXSA+IDApIHJldHVybiB0cnVlO1xuICAgIGVsc2UgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0UG9zaXRpb24oKSB7XG4gICAgY29uc3QgdmVjdG9yID0gVXRpbC5nZXRSYW5kRnJvbUFycmF5KHRoaXMudmVjdG9ycyk7XG4gICAgcmV0dXJuIHRoaXMudmVjdG9yLmNvcHkodmVjdG9yKTtcbiAgfVxuXG4gIGdldENvbG9yKHgsIHkpIHtcbiAgICB4IC09IHRoaXMueDtcbiAgICB5IC09IHRoaXMueTtcbiAgICBjb25zdCBpID0gKCh5ID4+IDApICogdGhpcy5pbWFnZURhdGEud2lkdGggKyAoeCA+PiAwKSkgKiA0O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHI6IHRoaXMuaW1hZ2VEYXRhLmRhdGFbaV0sXG4gICAgICBnOiB0aGlzLmltYWdlRGF0YS5kYXRhW2kgKyAxXSxcbiAgICAgIGI6IHRoaXMuaW1hZ2VEYXRhLmRhdGFbaSArIDJdLFxuICAgICAgYTogdGhpcy5pbWFnZURhdGEuZGF0YVtpICsgM11cbiAgICB9O1xuICB9XG5cbiAgY3Jvc3NpbmcocGFydGljbGUpIHtcbiAgICBpZiAodGhpcy5jcm9zc1R5cGUgPT09IFwiZGVhZFwiKSB7XG4gICAgICBpZiAodGhpcy5nZXRCb3VuZChwYXJ0aWNsZS5wLnggLSB0aGlzLngsIHBhcnRpY2xlLnAueSAtIHRoaXMueSkpIHBhcnRpY2xlLmRlYWQgPSB0cnVlO1xuICAgICAgZWxzZSBwYXJ0aWNsZS5kZWFkID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNyb3NzVHlwZSA9PT0gXCJib3VuZFwiKSB7XG4gICAgICBpZiAoIXRoaXMuZ2V0Qm91bmQocGFydGljbGUucC54IC0gdGhpcy54LCBwYXJ0aWNsZS5wLnkgLSB0aGlzLnkpKSBwYXJ0aWNsZS52Lm5lZ2F0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuaW1hZ2VEYXRhID0gbnVsbDtcbiAgfVxufVxuIiwiaW1wb3J0IENvbG9yVXRpbCBmcm9tIFwiLi4vdXRpbHMvQ29sb3JVdGlsXCI7XG5pbXBvcnQgQ2lyY2xlWm9uZSBmcm9tIFwiLi4vem9uZS9DaXJjbGVab25lXCI7XG5pbXBvcnQgUG9pbnRab25lIGZyb20gXCIuLi96b25lL1BvaW50Wm9uZVwiO1xuaW1wb3J0IExpbmVab25lIGZyb20gXCIuLi96b25lL0xpbmVab25lXCI7XG5pbXBvcnQgUmVjdFpvbmUgZnJvbSBcIi4uL3pvbmUvUmVjdFpvbmVcIjtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBhZGRFdmVudExpc3RlbmVyKHByb3RvbiwgZnVuYykge1xuICAgIHByb3Rvbi5hZGRFdmVudExpc3RlbmVyKFwiUFJPVE9OX1VQREFURV9BRlRFUlwiLCAoKSA9PiBmdW5jKCkpO1xuICB9LFxuXG4gIGdldFN0eWxlKGNvbG9yID0gXCIjZmYwMDAwXCIpIHtcbiAgICBjb25zdCByZ2IgPSBDb2xvclV0aWwuaGV4VG9SZ2IoY29sb3IpO1xuICAgIHJldHVybiBgcmdiYSgke3JnYi5yfSwgJHtyZ2IuZ30sICR7cmdiLmJ9LCAwLjUpYDtcbiAgfSxcblxuICBkcmF3Wm9uZShwcm90b24sIGNhbnZhcywgem9uZSwgY2xlYXIpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICBjb25zdCBzdHlsZSA9IHRoaXMuZ2V0U3R5bGUoKTtcblxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihwcm90b24sICgpID0+IHtcbiAgICAgIGlmIChjbGVhcikgY29udGV4dC5jbGVhclJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcblxuICAgICAgaWYgKHpvbmUgaW5zdGFuY2VvZiBQb2ludFpvbmUpIHtcbiAgICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBzdHlsZTtcbiAgICAgICAgY29udGV4dC5hcmMoem9uZS54LCB6b25lLnksIDEwLCAwLCBNYXRoLlBJICogMiwgdHJ1ZSk7XG4gICAgICAgIGNvbnRleHQuZmlsbCgpO1xuICAgICAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgICAgfSBlbHNlIGlmICh6b25lIGluc3RhbmNlb2YgTGluZVpvbmUpIHtcbiAgICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9IHN0eWxlO1xuICAgICAgICBjb250ZXh0Lm1vdmVUbyh6b25lLngxLCB6b25lLnkxKTtcbiAgICAgICAgY29udGV4dC5saW5lVG8oem9uZS54Miwgem9uZS55Mik7XG4gICAgICAgIGNvbnRleHQuc3Ryb2tlKCk7XG4gICAgICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgICB9IGVsc2UgaWYgKHpvbmUgaW5zdGFuY2VvZiBSZWN0Wm9uZSkge1xuICAgICAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgICAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gc3R5bGU7XG4gICAgICAgIGNvbnRleHQuZHJhd1JlY3Qoem9uZS54LCB6b25lLnksIHpvbmUud2lkdGgsIHpvbmUuaGVpZ2h0KTtcbiAgICAgICAgY29udGV4dC5zdHJva2UoKTtcbiAgICAgICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICAgIH0gZWxzZSBpZiAoem9uZSBpbnN0YW5jZW9mIENpcmNsZVpvbmUpIHtcbiAgICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9IHN0eWxlO1xuICAgICAgICBjb250ZXh0LmFyYyh6b25lLngsIHpvbmUueSwgem9uZS5yYWRpdXMsIDAsIE1hdGguUEkgKiAyLCB0cnVlKTtcbiAgICAgICAgY29udGV4dC5zdHJva2UoKTtcbiAgICAgICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcblxuICBkcmF3RW1pdHRlcihwcm90b24sIGNhbnZhcywgZW1pdHRlciwgY2xlYXIpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICBjb25zdCBzdHlsZSA9IHRoaXMuZ2V0U3R5bGUoKTtcblxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihwcm90b24sICgpID0+IHtcbiAgICAgIGlmIChjbGVhcikgY29udGV4dC5jbGVhclJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcblxuICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gc3R5bGU7XG4gICAgICBjb250ZXh0LmFyYyhlbWl0dGVyLnAueCwgZW1pdHRlci5wLnksIDEwLCAwLCBNYXRoLlBJICogMiwgdHJ1ZSk7XG4gICAgICBjb250ZXh0LmZpbGwoKTtcbiAgICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgfSk7XG4gIH1cbn07XG4iLCJpbXBvcnQgUHJvdG9uIGZyb20gXCIuL2NvcmUvUHJvdG9uXCI7XG5pbXBvcnQgUGFydGljbGUgZnJvbSBcIi4vY29yZS9QYXJ0aWNsZVwiO1xuaW1wb3J0IFBvb2wgZnJvbSBcIi4vY29yZS9Qb29sXCI7XG5cbmltcG9ydCBVdGlsIGZyb20gXCIuL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBDb2xvclV0aWwgZnJvbSBcIi4vdXRpbHMvQ29sb3JVdGlsXCI7XG5pbXBvcnQgTWF0aFV0aWwgZnJvbSBcIi4vbWF0aC9NYXRoVXRpbFwiO1xuaW1wb3J0IFZlY3RvcjJEIGZyb20gXCIuL21hdGgvVmVjdG9yMkRcIjtcbmltcG9ydCBQb2xhcjJEIGZyb20gXCIuL21hdGgvUG9sYXIyRFwiO1xuaW1wb3J0IE1hdDMgZnJvbSBcIi4vbWF0aC9NYXQzXCI7XG5pbXBvcnQgU3BhbiBmcm9tIFwiLi9tYXRoL1NwYW5cIjtcbmltcG9ydCBBcnJheVNwYW4gZnJvbSBcIi4vbWF0aC9BcnJheVNwYW5cIjtcbmltcG9ydCBSZWN0YW5nbGUgZnJvbSBcIi4vbWF0aC9SZWN0YW5nbGVcIjtcbmltcG9ydCBlYXNlIGZyb20gXCIuL21hdGgvZWFzZVwiO1xuXG5pbXBvcnQgUmF0ZSBmcm9tIFwiLi9pbml0aWFsaXplL1JhdGVcIjtcbmltcG9ydCBJbml0aWFsaXplIGZyb20gXCIuL2luaXRpYWxpemUvSW5pdGlhbGl6ZVwiO1xuaW1wb3J0IExpZmUgZnJvbSBcIi4vaW5pdGlhbGl6ZS9MaWZlXCI7XG5pbXBvcnQgUG9zaXRpb24gZnJvbSBcIi4vaW5pdGlhbGl6ZS9Qb3NpdGlvblwiO1xuaW1wb3J0IFZlbG9jaXR5IGZyb20gXCIuL2luaXRpYWxpemUvVmVsb2NpdHlcIjtcbmltcG9ydCBNYXNzIGZyb20gXCIuL2luaXRpYWxpemUvTWFzc1wiO1xuaW1wb3J0IFJhZGl1cyBmcm9tIFwiLi9pbml0aWFsaXplL1JhZGl1c1wiO1xuaW1wb3J0IEJvZHkgZnJvbSBcIi4vaW5pdGlhbGl6ZS9Cb2R5XCI7XG5cbmltcG9ydCBCZWhhdmlvdXIgZnJvbSBcIi4vYmVoYXZpb3VyL0JlaGF2aW91clwiO1xuaW1wb3J0IEZvcmNlIGZyb20gXCIuL2JlaGF2aW91ci9Gb3JjZVwiO1xuaW1wb3J0IEF0dHJhY3Rpb24gZnJvbSBcIi4vYmVoYXZpb3VyL0F0dHJhY3Rpb25cIjtcbmltcG9ydCBSYW5kb21EcmlmdCBmcm9tIFwiLi9iZWhhdmlvdXIvUmFuZG9tRHJpZnRcIjtcbmltcG9ydCBHcmF2aXR5IGZyb20gXCIuL2JlaGF2aW91ci9HcmF2aXR5XCI7XG5pbXBvcnQgQ29sbGlzaW9uIGZyb20gXCIuL2JlaGF2aW91ci9Db2xsaXNpb25cIjtcbmltcG9ydCBDcm9zc1pvbmUgZnJvbSBcIi4vYmVoYXZpb3VyL0Nyb3NzWm9uZVwiO1xuaW1wb3J0IEFscGhhIGZyb20gXCIuL2JlaGF2aW91ci9BbHBoYVwiO1xuaW1wb3J0IFNjYWxlIGZyb20gXCIuL2JlaGF2aW91ci9TY2FsZVwiO1xuaW1wb3J0IFJvdGF0ZSBmcm9tIFwiLi9iZWhhdmlvdXIvUm90YXRlXCI7XG5pbXBvcnQgQ29sb3IgZnJvbSBcIi4vYmVoYXZpb3VyL0NvbG9yXCI7XG5pbXBvcnQgQ3ljbG9uZSBmcm9tIFwiLi9iZWhhdmlvdXIvQ3ljbG9uZVwiO1xuaW1wb3J0IFJlcHVsc2lvbiBmcm9tIFwiLi9iZWhhdmlvdXIvUmVwdWxzaW9uXCI7XG5pbXBvcnQgR3Jhdml0eVdlbGwgZnJvbSBcIi4vYmVoYXZpb3VyL0dyYXZpdHlXZWxsXCI7XG5cbmltcG9ydCBFbWl0dGVyIGZyb20gXCIuL2VtaXR0ZXIvRW1pdHRlclwiO1xuaW1wb3J0IEJlaGF2aW91ckVtaXR0ZXIgZnJvbSBcIi4vZW1pdHRlci9CZWhhdmlvdXJFbWl0dGVyXCI7XG5pbXBvcnQgRm9sbG93RW1pdHRlciBmcm9tIFwiLi9lbWl0dGVyL0ZvbGxvd0VtaXR0ZXJcIjtcblxuaW1wb3J0IENhbnZhc1JlbmRlcmVyIGZyb20gXCIuL3JlbmRlci9DYW52YXNSZW5kZXJlclwiO1xuaW1wb3J0IERvbVJlbmRlcmVyIGZyb20gXCIuL3JlbmRlci9Eb21SZW5kZXJlclwiO1xuaW1wb3J0IEVhc2VsUmVuZGVyZXIgZnJvbSBcIi4vcmVuZGVyL0Vhc2VsUmVuZGVyZXJcIjtcbmltcG9ydCBQaXhlbFJlbmRlcmVyIGZyb20gXCIuL3JlbmRlci9QaXhlbFJlbmRlcmVyXCI7XG5pbXBvcnQgUGl4aVJlbmRlcmVyIGZyb20gXCIuL3JlbmRlci9QaXhpUmVuZGVyZXJcIjtcbmltcG9ydCBXZWJHTFJlbmRlcmVyIGZyb20gXCIuL3JlbmRlci9XZWJHTFJlbmRlcmVyXCI7XG5pbXBvcnQgQ3VzdG9tUmVuZGVyZXIgZnJvbSBcIi4vcmVuZGVyL0N1c3RvbVJlbmRlcmVyXCI7XG5cbmltcG9ydCBab25lIGZyb20gXCIuL3pvbmUvWm9uZVwiO1xuaW1wb3J0IExpbmVab25lIGZyb20gXCIuL3pvbmUvTGluZVpvbmVcIjtcbmltcG9ydCBDaXJjbGVab25lIGZyb20gXCIuL3pvbmUvQ2lyY2xlWm9uZVwiO1xuaW1wb3J0IFBvaW50Wm9uZSBmcm9tIFwiLi96b25lL1BvaW50Wm9uZVwiO1xuaW1wb3J0IFJlY3Rab25lIGZyb20gXCIuL3pvbmUvUmVjdFpvbmVcIjtcbmltcG9ydCBJbWFnZVpvbmUgZnJvbSBcIi4vem9uZS9JbWFnZVpvbmVcIjtcblxuaW1wb3J0IERlYnVnIGZyb20gXCIuL2RlYnVnL0RlYnVnXCI7XG5cbi8vIG5hbWVzcGFjZVxuUHJvdG9uLlBhcnRpY2xlID0gUGFydGljbGU7XG5Qcm90b24uUG9vbCA9IFBvb2w7XG5cblByb3Rvbi5VdGlsID0gVXRpbDtcblByb3Rvbi5Db2xvclV0aWwgPSBDb2xvclV0aWw7XG5Qcm90b24uTWF0aFV0aWwgPSBNYXRoVXRpbDtcblByb3Rvbi5WZWN0b3IyRCA9IFByb3Rvbi5WZWN0b3IgPSBWZWN0b3IyRDtcblByb3Rvbi5Qb2xhcjJEID0gUHJvdG9uLlBvbGFyID0gUG9sYXIyRDtcblByb3Rvbi5BcnJheVNwYW4gPSBBcnJheVNwYW47XG5Qcm90b24uUmVjdGFuZ2xlID0gUmVjdGFuZ2xlO1xuUHJvdG9uLlJhdGUgPSBSYXRlO1xuUHJvdG9uLmVhc2UgPSBlYXNlO1xuUHJvdG9uLlNwYW4gPSBTcGFuO1xuUHJvdG9uLk1hdDMgPSBNYXQzO1xuUHJvdG9uLmdldFNwYW4gPSAoYSwgYiwgY2VudGVyKSA9PiBuZXcgU3BhbihhLCBiLCBjZW50ZXIpO1xuUHJvdG9uLmNyZWF0ZUFycmF5U3BhbiA9IEFycmF5U3Bhbi5jcmVhdGVBcnJheVNwYW47XG5cblByb3Rvbi5Jbml0aWFsaXplID0gUHJvdG9uLkluaXQgPSBJbml0aWFsaXplO1xuUHJvdG9uLkxpZmUgPSBQcm90b24uTCA9IExpZmU7XG5Qcm90b24uUG9zaXRpb24gPSBQcm90b24uUCA9IFBvc2l0aW9uO1xuUHJvdG9uLlZlbG9jaXR5ID0gUHJvdG9uLlYgPSBWZWxvY2l0eTtcblByb3Rvbi5NYXNzID0gUHJvdG9uLk0gPSBNYXNzO1xuUHJvdG9uLlJhZGl1cyA9IFByb3Rvbi5SID0gUmFkaXVzO1xuUHJvdG9uLkJvZHkgPSBQcm90b24uQiA9IEJvZHk7XG5cblByb3Rvbi5CZWhhdmlvdXIgPSBCZWhhdmlvdXI7XG5Qcm90b24uRm9yY2UgPSBQcm90b24uRiA9IEZvcmNlO1xuUHJvdG9uLkF0dHJhY3Rpb24gPSBQcm90b24uQSA9IEF0dHJhY3Rpb247XG5Qcm90b24uUmFuZG9tRHJpZnQgPSBQcm90b24uUkQgPSBSYW5kb21EcmlmdDtcblByb3Rvbi5HcmF2aXR5ID0gUHJvdG9uLkcgPSBHcmF2aXR5O1xuUHJvdG9uLkNvbGxpc2lvbiA9IENvbGxpc2lvbjtcblByb3Rvbi5Dcm9zc1pvbmUgPSBDcm9zc1pvbmU7XG5Qcm90b24uQWxwaGEgPSBBbHBoYTtcblByb3Rvbi5TY2FsZSA9IFByb3Rvbi5TID0gU2NhbGU7XG5Qcm90b24uUm90YXRlID0gUm90YXRlO1xuUHJvdG9uLkNvbG9yID0gQ29sb3I7XG5Qcm90b24uUmVwdWxzaW9uID0gUmVwdWxzaW9uO1xuUHJvdG9uLkN5Y2xvbmUgPSBDeWNsb25lO1xuUHJvdG9uLkdyYXZpdHlXZWxsID0gR3Jhdml0eVdlbGw7XG5cblByb3Rvbi5FbWl0dGVyID0gRW1pdHRlcjtcblByb3Rvbi5CZWhhdmlvdXJFbWl0dGVyID0gQmVoYXZpb3VyRW1pdHRlcjtcblByb3Rvbi5Gb2xsb3dFbWl0dGVyID0gRm9sbG93RW1pdHRlcjtcblxuUHJvdG9uLlpvbmUgPSBab25lO1xuUHJvdG9uLkxpbmVab25lID0gTGluZVpvbmU7XG5Qcm90b24uQ2lyY2xlWm9uZSA9IENpcmNsZVpvbmU7XG5Qcm90b24uUG9pbnRab25lID0gUG9pbnRab25lO1xuUHJvdG9uLlJlY3Rab25lID0gUmVjdFpvbmU7XG5Qcm90b24uSW1hZ2Vab25lID0gSW1hZ2Vab25lO1xuXG5Qcm90b24uQ2FudmFzUmVuZGVyZXIgPSBDYW52YXNSZW5kZXJlcjtcblByb3Rvbi5Eb21SZW5kZXJlciA9IERvbVJlbmRlcmVyO1xuUHJvdG9uLkVhc2VsUmVuZGVyZXIgPSBFYXNlbFJlbmRlcmVyO1xuUHJvdG9uLlBpeGlSZW5kZXJlciA9IFBpeGlSZW5kZXJlcjtcblByb3Rvbi5QaXhlbFJlbmRlcmVyID0gUGl4ZWxSZW5kZXJlcjtcblByb3Rvbi5XZWJHTFJlbmRlcmVyID0gUHJvdG9uLldlYkdsUmVuZGVyZXIgPSBXZWJHTFJlbmRlcmVyO1xuUHJvdG9uLkN1c3RvbVJlbmRlcmVyID0gQ3VzdG9tUmVuZGVyZXI7XG5cblByb3Rvbi5EZWJ1ZyA9IERlYnVnO1xuVXRpbC5hc3NpZ24oUHJvdG9uLCBlYXNlKTtcblxuLy8gZXhwb3J0XG5leHBvcnQgZGVmYXVsdCBQcm90b247XG4iXSwibmFtZXMiOlsiaXBvdCIsImxlbmd0aCIsIm5ocG90IiwiaSIsIm1ha2VUcmFuc2xhdGlvbiIsInR4IiwidHkiLCJtYWtlUm90YXRpb24iLCJhbmdsZUluUmFkaWFucyIsImMiLCJNYXRoIiwiY29zIiwicyIsInNpbiIsIm1ha2VTY2FsZSIsInN4Iiwic3kiLCJtYXRyaXhNdWx0aXBseSIsImEiLCJiIiwiYTAwIiwiYTAxIiwiYTAyIiwiYTEwIiwiYTExIiwiYTEyIiwiYTIwIiwiYTIxIiwiYTIyIiwiYjAwIiwiYjAxIiwiYjAyIiwiYjEwIiwiYjExIiwiYjEyIiwiYjIwIiwiYjIxIiwiYjIyIiwiY3JlYXRlQ2FudmFzIiwiaWQiLCJ3aWR0aCIsImhlaWdodCIsInBvc2l0aW9uIiwiZG9tIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50Iiwic3R5bGUiLCJvcGFjaXR5IiwidHJhbnNmb3JtIiwiY3JlYXRlRGl2IiwicmVzaXplIiwibWFyZ2luTGVmdCIsIm1hcmdpblRvcCIsImRpdiIsIngiLCJ5Iiwic2NhbGUiLCJyb3RhdGUiLCJ3aWxsQ2hhbmdlIiwiY3NzMyIsInRyYW5zZm9ybTNkIiwia2V5IiwidmFsIiwiYmtleSIsImNoYXJBdCIsInRvVXBwZXJDYXNlIiwic3Vic3RyIiwiaW1nc0NhY2hlIiwiY2FudmFzQ2FjaGUiLCJjYW52YXNJZCIsImdldEltYWdlRGF0YSIsImNvbnRleHQiLCJpbWFnZSIsInJlY3QiLCJkcmF3SW1hZ2UiLCJpbWFnZWRhdGEiLCJjbGVhclJlY3QiLCJnZXRJbWdGcm9tQ2FjaGUiLCJpbWciLCJjYWxsYmFjayIsInBhcmFtIiwic3JjIiwiSW1hZ2UiLCJvbmxvYWQiLCJlIiwidGFyZ2V0IiwiZ2V0Q2FudmFzRnJvbUNhY2hlIiwiV2ViR0xVdGlsIiwiY2FudmFzIiwiRG9tVXRpbCIsImdldENvbnRleHQiLCJpbml0VmFsdWUiLCJ2YWx1ZSIsImRlZmF1bHRzIiwidW5kZWZpbmVkIiwiaXNBcnJheSIsIk9iamVjdCIsInByb3RvdHlwZSIsInRvU3RyaW5nIiwiY2FsbCIsImVtcHR5QXJyYXkiLCJhcnIiLCJ0b0FycmF5IiwiZ2V0UmFuZEZyb21BcnJheSIsImZsb29yIiwicmFuZG9tIiwiZW1wdHlPYmplY3QiLCJvYmoiLCJpZ25vcmUiLCJpbmRleE9mIiwiY2xhc3NBcHBseSIsImNvbnN0cnVjdG9yIiwiYXJncyIsIkZhY3RvcnlGdW5jIiwiYmluZCIsImFwcGx5IiwiY29uY2F0IiwiSW1nVXRpbCIsImRlc3Ryb3lBbGwiLCJkZXN0cm95IiwiYXNzaWduIiwic291cmNlIiwiaGFzT3duUHJvcGVydHkiLCJpZHNNYXAiLCJQdWlkIiwiX2luZGV4IiwiX2NhY2hlIiwidHlwZSIsImdldElkIiwidWlkIiwiZ2V0SWRGcm9tQ2FjaGUiLCJpc0JvZHkiLCJpc0lubmVyIiwiZ2V0VGFyZ2V0IiwiUG9vbCIsIm51bSIsInRvdGFsIiwiY2FjaGUiLCJnZXQiLCJwYXJhbXMiLCJwIiwiX19wdWlkIiwicG9wIiwiY3JlYXRlT3JDbG9uZSIsImV4cGlyZSIsImdldENhY2hlIiwicHVzaCIsImNyZWF0ZSIsIlV0aWwiLCJjbG9uZSIsImdldENvdW50IiwiY291bnQiLCJTdGF0cyIsInByb3RvbiIsImNvbnRhaW5lciIsImVtaXR0ZXJJbmRleCIsInJlbmRlcmVySW5kZXgiLCJ1cGRhdGUiLCJib2R5IiwiYWRkIiwiZW1pdHRlciIsImdldEVtaXR0ZXIiLCJyZW5kZXJlciIsImdldFJlbmRlcmVyIiwic3RyIiwiZW1pdHRlcnMiLCJlbWl0U3BlZWQiLCJnZXRFbWl0dGVyUG9zIiwiaW5pdGlhbGl6ZXMiLCJjb25jYXRBcnIiLCJiZWhhdmlvdXJzIiwibmFtZSIsImdldENyZWF0ZWROdW1iZXIiLCJwb29sIiwiaW5uZXJIVE1MIiwiY3NzVGV4dCIsImpvaW4iLCJhZGRFdmVudExpc3RlbmVyIiwiYmciLCJjb2xvciIsInBhcmVudE5vZGUiLCJhcHBlbmRDaGlsZCIsInJlbmRlcmVycyIsInJlc3VsdCIsImNwb29sIiwicm91bmQiLCJFdmVudERpc3BhdGNoZXIiLCJfbGlzdGVuZXJzIiwiZGlzcGF0Y2hFdmVudCIsImhhc0V2ZW50TGlzdGVuZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwicmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnMiLCJsaXN0ZW5lciIsInNwbGljZSIsImxpc3RlbmVycyIsImhhbmRsZXIiLCJQSSIsIklORklOSVRZIiwiSW5maW5pdHkiLCJNYXRoVXRpbCIsIlBJeDIiLCJQSV8yIiwiUElfMTgwIiwiTjE4MF9QSSIsImlzSW5maW5pdHkiLCJyYW5kb21BVG9CIiwiaXNJbnQiLCJyYW5kb21GbG9hdGluZyIsImNlbnRlciIsImYiLCJyYW5kb21Db2xvciIsInNsaWNlIiwicmFuZG9tWm9uZSIsImRpc3BsYXkiLCJrIiwiZGlnaXRzIiwicG93IiwiZGVncmVlVHJhbnNmb3JtIiwidG9Db2xvcjE2IiwiSW50ZWdyYXRpb24iLCJjYWxjdWxhdGUiLCJwYXJ0aWNsZXMiLCJ0aW1lIiwiZGFtcGluZyIsImV1bGVySW50ZWdyYXRlIiwicGFydGljbGUiLCJzbGVlcCIsIm9sZCIsImNvcHkiLCJ2IiwibXVsdGlwbHlTY2FsYXIiLCJtYXNzIiwiY2xlYXIiLCJQcm90b24iLCJpbnRlZ3JhdGlvblR5cGUiLCJub3ciLCJ0aGVuIiwiZWxhcHNlZCIsInN0YXRzIiwiRVVMRVIiLCJpbnRlZ3JhdG9yIiwiX2ZwcyIsIl9pbnRlcnZhbCIsIkRFRkFVTFRfSU5URVJWQUwiLCJhZGRSZW5kZXJlciIsInJlbmRlciIsImluaXQiLCJyZW1vdmVSZW5kZXJlciIsImluZGV4IiwicmVtb3ZlIiwiYWRkRW1pdHRlciIsInBhcmVudCIsIkVNSVRURVJfQURERUQiLCJyZW1vdmVFbWl0dGVyIiwiRU1JVFRFUl9SRU1PVkVEIiwiUFJPVE9OX1VQREFURSIsIlVTRV9DTE9DSyIsIkRhdGUiLCJnZXRUaW1lIiwiYW1lbmRDaGFuZ2VUYWJzQnVnIiwiZW1pdHRlcnNVcGRhdGUiLCJQUk9UT05fVVBEQVRFX0FGVEVSIiwiZ2V0QWxsUGFydGljbGVzIiwiZGVzdHJveUFsbEVtaXR0ZXJzIiwiZGVzdHJveU90aGVyIiwic2V0VGltZW91dCIsImZwcyIsIk1FQVNVUkUiLCJSSzIiLCJQQVJUSUNMRV9DUkVBVEVEIiwiUEFSVElDTEVfVVBEQVRFIiwiUEFSVElDTEVfU0xFRVAiLCJQQVJUSUNMRV9ERUFEIiwiUmdiIiwiciIsImciLCJyZXNldCIsImhhc1Byb3AiLCJzZXRQcm9wIiwicHJvcHMiLCJwcm9wIiwiU3BhbiIsImdldFNwYW5WYWx1ZSIsInNldFZlY3RvclZhbCIsImNvbmYiLCJlYXNlTGluZWFyIiwiZWFzZUluUXVhZCIsImVhc2VPdXRRdWFkIiwiZWFzZUluT3V0UXVhZCIsImVhc2VJbkN1YmljIiwiZWFzZU91dEN1YmljIiwiZWFzZUluT3V0Q3ViaWMiLCJlYXNlSW5RdWFydCIsImVhc2VPdXRRdWFydCIsImVhc2VJbk91dFF1YXJ0IiwiZWFzZUluU2luZSIsImVhc2VPdXRTaW5lIiwiZWFzZUluT3V0U2luZSIsImVhc2VJbkV4cG8iLCJlYXNlT3V0RXhwbyIsImVhc2VJbk91dEV4cG8iLCJlYXNlSW5DaXJjIiwic3FydCIsImVhc2VPdXRDaXJjIiwiZWFzZUluT3V0Q2lyYyIsImVhc2VJbkJhY2siLCJlYXNlT3V0QmFjayIsImVhc2VJbk91dEJhY2siLCJnZXRFYXNpbmciLCJlYXNlIiwiVmVjdG9yMkQiLCJzZXQiLCJzZXRYIiwic2V0WSIsImdldEdyYWRpZW50IiwiYXRhbjIiLCJ3IiwiYWRkVmVjdG9ycyIsImFkZFhZIiwic3ViIiwic3ViVmVjdG9ycyIsImRpdmlkZVNjYWxhciIsIm5lZ2F0ZSIsImRvdCIsImxlbmd0aFNxIiwibm9ybWFsaXplIiwiZGlzdGFuY2VUbyIsImRpc3RhbmNlVG9TcXVhcmVkIiwidGhhIiwiZHgiLCJkeSIsImxlcnAiLCJhbHBoYSIsImVxdWFscyIsIlBhcnRpY2xlIiwiZGF0YSIsInJnYiIsIlByb3BVdGlsIiwiZ2V0RGlyZWN0aW9uIiwibGlmZSIsImFnZSIsImRlYWQiLCJzcHJpdGUiLCJlbmVyZ3kiLCJyYWRpdXMiLCJyb3RhdGlvbiIsImVhc2luZyIsInJlbW92ZUFsbEJlaGF2aW91cnMiLCJhcHBseUJlaGF2aW91cnMiLCJtYXgiLCJhcHBseUJlaGF2aW91ciIsImFkZEJlaGF2aW91ciIsImJlaGF2aW91ciIsInBhcmVudHMiLCJpbml0aWFsaXplIiwiYWRkQmVoYXZpb3VycyIsInJlbW92ZUJlaGF2aW91ciIsImhleFRvUmdiIiwiaCIsImhleDE2Iiwic3Vic3RyaW5nIiwicGFyc2VJbnQiLCJyZ2JUb0hleCIsInJiZyIsImdldEhleDE2RnJvbVBhcnRpY2xlIiwiTnVtYmVyIiwiUG9sYXIyRCIsImFicyIsInNldFIiLCJzZXRUaGEiLCJ0b1ZlY3RvciIsImdldFgiLCJnZXRZIiwiTWF0MyIsIm1hdDMiLCJtYXQiLCJGbG9hdDMyQXJyYXkiLCJtYXQxIiwibWF0MiIsIm11bHRpcGx5IiwiaW52ZXJzZSIsImQiLCJtdWx0aXBseVZlYzIiLCJtIiwidmVjIiwiZ2V0VmFsdWUiLCJzZXRTcGFuVmFsdWUiLCJwYW4iLCJBcnJheVNwYW4iLCJfYXJyIiwiY3JlYXRlQXJyYXlTcGFuIiwiUmVjdGFuZ2xlIiwiYm90dG9tIiwicmlnaHQiLCJjb250YWlucyIsIlJhdGUiLCJudW1wYW4iLCJ0aW1lcGFuIiwibnVtUGFuIiwidGltZVBhbiIsInN0YXJ0VGltZSIsIm5leHRUaW1lIiwiSW5pdGlhbGl6ZSIsIkxpZmUiLCJsaWZlUGFuIiwiWm9uZSIsInZlY3RvciIsImNyb3NzVHlwZSIsImFsZXJ0IiwiZ2V0UG9zaXRpb24iLCJjcm9zc2luZyIsIlBvaW50Wm9uZSIsImNvbnNvbGUiLCJlcnJvciIsIlBvc2l0aW9uIiwiem9uZSIsIlZlbG9jaXR5IiwicnBhbiIsInRoYXBhbiIsInJQYW4iLCJ0aGFQYW4iLCJub3JtYWxpemVWZWxvY2l0eSIsInZyIiwicG9sYXIyZCIsIk1hc3MiLCJtYXNzUGFuIiwiUmFkaXVzIiwib2xkUmFkaXVzIiwiQm9keSIsImltYWdlVGFyZ2V0IiwiaW5uZXIiLCJCZWhhdmlvdXIiLCJub3JtYWxpemVGb3JjZSIsImZvcmNlIiwibm9ybWFsaXplVmFsdWUiLCJGb3JjZSIsImZ4IiwiZnkiLCJBdHRyYWN0aW9uIiwidGFyZ2V0UG9zaXRpb24iLCJyYWRpdXNTcSIsImF0dHJhY3Rpb25Gb3JjZSIsIlJhbmRvbURyaWZ0IiwiZHJpZnRYIiwiZHJpZnRZIiwiZGVsYXkiLCJwYW5Gb2NlIiwiR3Jhdml0eSIsIkNvbGxpc2lvbiIsImNvbGxpc2lvblBvb2wiLCJkZWx0YSIsIm5ld1Bvb2wiLCJvdGhlclBhcnRpY2xlIiwib3ZlcmxhcCIsInRvdGFsTWFzcyIsImF2ZXJhZ2VNYXNzMSIsImF2ZXJhZ2VNYXNzMiIsImRpc3RhbmNlIiwiQ3Jvc3Nab25lIiwiQWxwaGEiLCJzYW1lIiwiYWxwaGFBIiwiYWxwaGFCIiwiU2NhbGUiLCJzY2FsZUEiLCJzY2FsZUIiLCJSb3RhdGUiLCJpbmZsdWVuY2UiLCJyb3RhdGlvbkEiLCJyb3RhdGlvbkIiLCJDb2xvciIsImNvbG9yQSIsIkNvbG9yVXRpbCIsImNvbG9yQiIsIkNIQU5HSU5HIiwiQ3ljbG9uZSIsImFuZ2xlIiwic2V0QW5nbGVBbmRGb3JjZSIsInNwYW4iLCJTdHJpbmciLCJ0b0xvd2VyQ2FzZSIsImNhbmdsZSIsImN5Y2xvbmUiLCJncmFkaWVudCIsIlJlcHVsc2lvbiIsIkdyYXZpdHlXZWxsIiwiY2VudGVyUG9pbnQiLCJkaXN0YW5jZVZlYyIsImRpc3RhbmNlU3EiLCJmYWN0b3IiLCJiaW5kRW1pdHRlciIsIkVtaXR0ZXIiLCJlbWl0VGltZSIsInRvdGFsVGltZSIsInJhdGUiLCJlbWl0Iiwic3RvcGVkIiwiaXNOYU4iLCJzdG9wIiwicHJlRW1pdCIsIm9sZFN0b3BlZCIsIm9sZEVtaXRUaW1lIiwib2xkVG90YWxUaW1lIiwic3RlcCIsInJlbW92ZUFsbFBhcnRpY2xlcyIsImFkZFNlbGZJbml0aWFsaXplIiwiaW5pdEFsbCIsImFkZEluaXRpYWxpemUiLCJyZXN0IiwicmVtb3ZlSW5pdGlhbGl6ZSIsImluaXRpYWxpemVyIiwicmVtb3ZlQWxsSW5pdGlhbGl6ZXJzIiwiYXJndW1lbnRzIiwiZW1pdHRpbmciLCJpbnRlZ3JhdGUiLCJkaXNwYXRjaCIsImV2ZW50IiwiYmluZEV2ZW50IiwiY3JlYXRlUGFydGljbGUiLCJzZXR1cFBhcnRpY2xlIiwiSW5pdGlhbGl6ZVV0aWwiLCJCZWhhdmlvdXJFbWl0dGVyIiwic2VsZkJlaGF2aW91cnMiLCJhZGRTZWxmQmVoYXZpb3VyIiwicmVtb3ZlU2VsZkJlaGF2aW91ciIsIkZvbGxvd0VtaXR0ZXIiLCJtb3VzZVRhcmdldCIsIndpbmRvdyIsIl9hbGxvd0VtaXR0aW5nIiwiaW5pdEV2ZW50SGFuZGxlciIsIm1vdXNlbW92ZUhhbmRsZXIiLCJtb3VzZW1vdmUiLCJtb3VzZWRvd25IYW5kbGVyIiwibW91c2Vkb3duIiwibW91c2V1cEhhbmRsZXIiLCJtb3VzZXVwIiwibGF5ZXJYIiwibGF5ZXJZIiwib2Zmc2V0WCIsIm9mZnNldFkiLCJpc0ltYWdlIiwidGFnTmFtZSIsIm5vZGVOYW1lIiwiaXNTdHJpbmciLCJCYXNlUmVuZGVyZXIiLCJlbGVtZW50Iiwic3Ryb2tlIiwiY2lyY2xlQ29uZiIsImlzQ2lyY2xlIiwic2V0U3Ryb2tlIiwidGhpbmtuZXNzIiwiX3Byb3RvblVwZGF0ZUhhbmRsZXIiLCJvblByb3RvblVwZGF0ZSIsIl9wcm90b25VcGRhdGVBZnRlckhhbmRsZXIiLCJvblByb3RvblVwZGF0ZUFmdGVyIiwiX2VtaXR0ZXJBZGRlZEhhbmRsZXIiLCJvbkVtaXR0ZXJBZGRlZCIsIl9lbWl0dGVyUmVtb3ZlZEhhbmRsZXIiLCJvbkVtaXR0ZXJSZW1vdmVkIiwiX3BhcnRpY2xlQ3JlYXRlZEhhbmRsZXIiLCJvblBhcnRpY2xlQ3JlYXRlZCIsIl9wYXJ0aWNsZVVwZGF0ZUhhbmRsZXIiLCJvblBhcnRpY2xlVXBkYXRlIiwiX3BhcnRpY2xlRGVhZEhhbmRsZXIiLCJvblBhcnRpY2xlRGVhZCIsIkNhbnZhc1JlbmRlcmVyIiwiYnVmZmVyQ2FjaGUiLCJhZGRJbWcyQm9keSIsIlR5cGVzIiwiZHJhd0NpcmNsZSIsImJ1ZmZlciIsImNyZWF0ZUJ1ZmZlciIsImJ1ZkNvbnRleHQiLCJnbG9iYWxBbHBoYSIsImdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiIsImZpbGxTdHlsZSIsImZpbGxSZWN0Iiwic2F2ZSIsInRyYW5zbGF0ZSIsInJlc3RvcmUiLCJiZWdpblBhdGgiLCJhcmMiLCJzdHJva2VTdHlsZSIsImxpbmVXaWR0aCIsImNsb3NlUGF0aCIsImZpbGwiLCJzaXplIiwiRG9tUmVuZGVyZXIiLCJjcmVhdGVCb2R5IiwiYm9keVJlYWR5IiwiYmFja2dyb3VuZENvbG9yIiwicmVtb3ZlQ2hpbGQiLCJjcmVhdGVDaXJjbGUiLCJjcmVhdGVTcHJpdGUiLCJib3JkZXJSYWRpdXMiLCJib3JkZXJDb2xvciIsImJvcmRlcldpZHRoIiwidXJsIiwiYmFja2dyb3VuZEltYWdlIiwiRWFzZWxSZW5kZXJlciIsImFkZENoaWxkIiwic2NhbGVYIiwic2NhbGVZIiwiZ3JhcGhpY3MiLCJyZWdYIiwicmVnWSIsImNyZWF0ZWpzIiwiR3JhcGhpY3MiLCJiZWdpblN0cm9rZSIsImJlZ2luRmlsbCIsInNoYXBlIiwiU2hhcGUiLCJQaXhlbFJlbmRlcmVyIiwicmVjdGFuZ2xlIiwiaW1hZ2VEYXRhIiwiY3JlYXRlSW1hZ2VEYXRhIiwicHV0SW1hZ2VEYXRhIiwic2V0UGl4ZWwiLCJlbGVtZW50d2lkdGgiLCJQSVhJQ2xhc3MiLCJQaXhpUmVuZGVyZXIiLCJzZXRDb2xvciIsImJsZW5kTW9kZSIsInNldFBJWEkiLCJQSVhJIiwiU3ByaXRlIiwiY3JlYXRlRnJvbUltYWdlIiwiZnJvbSIsImZyb21JbWFnZSIsInRpbnQiLCJhbmNob3IiLCJlbmRGaWxsIiwiTVN0YWNrIiwibWF0cyIsInRvcCIsIldlYkdMUmVuZGVyZXIiLCJnbCIsImFudGlhbGlhcyIsInN0ZW5jaWwiLCJkZXB0aCIsImluaXRWYXIiLCJzZXRNYXhSYWRpdXMiLCJpbml0U2hhZGVycyIsImluaXRCdWZmZXJzIiwiYmxlbmRFcXVhdGlvbiIsIkZVTkNfQUREIiwiYmxlbmRGdW5jIiwiU1JDX0FMUEhBIiwiT05FX01JTlVTX1NSQ19BTFBIQSIsImVuYWJsZSIsIkJMRU5EIiwidW1hdCIsInNtYXQiLCJtc3RhY2siLCJ2aWV3cG9ydCIsImNpcmNsZUNhbnZhc1VSTCIsImdldFZlcnRleFNoYWRlciIsInZzU291cmNlIiwiZ2V0RnJhZ21lbnRTaGFkZXIiLCJmc1NvdXJjZSIsInRleHR1cmVidWZmZXJzIiwiQSIsIkIiLCJnZXRTaGFkZXIiLCJmcyIsInNoYWRlciIsImNyZWF0ZVNoYWRlciIsIkZSQUdNRU5UX1NIQURFUiIsIlZFUlRFWF9TSEFERVIiLCJzaGFkZXJTb3VyY2UiLCJjb21waWxlU2hhZGVyIiwiZ2V0U2hhZGVyUGFyYW1ldGVyIiwiQ09NUElMRV9TVEFUVVMiLCJnZXRTaGFkZXJJbmZvTG9nIiwiZnJhZ21lbnRTaGFkZXIiLCJ2ZXJ0ZXhTaGFkZXIiLCJzcHJvZ3JhbSIsImNyZWF0ZVByb2dyYW0iLCJhdHRhY2hTaGFkZXIiLCJsaW5rUHJvZ3JhbSIsImdldFByb2dyYW1QYXJhbWV0ZXIiLCJMSU5LX1NUQVRVUyIsInVzZVByb2dyYW0iLCJ2cGEiLCJnZXRBdHRyaWJMb2NhdGlvbiIsInRjYSIsImVuYWJsZVZlcnRleEF0dHJpYkFycmF5IiwidE1hdFVuaWZvcm0iLCJnZXRVbmlmb3JtTG9jYXRpb24iLCJzYW1wbGVyVW5pZm9ybSIsInVzZVRleCIsInVuaWZvcm0xaSIsInZzIiwiaWR4IiwidW5pdElCdWZmZXIiLCJiaW5kQnVmZmVyIiwiRUxFTUVOVF9BUlJBWV9CVUZGRVIiLCJidWZmZXJEYXRhIiwiVWludDE2QXJyYXkiLCJTVEFUSUNfRFJBVyIsImlkcyIsInVuaXRJMzMiLCJzdHJpcEJ1ZmZlciIsInJhaWR1cyIsImNpcmNsZUNhbnZhc1JhZGl1cyIsInRvRGF0YVVSTCIsImRyYXdJbWcyQ2FudmFzIiwiX3ciLCJfaCIsIl93aWR0aCIsIl9oZWlnaHQiLCJfc2NhbGVYIiwiX3NjYWxlWSIsImNyZWF0ZVRleHR1cmUiLCJ0ZXh0dXJlIiwidmNCdWZmZXIiLCJ0Y0J1ZmZlciIsIkFSUkFZX0JVRkZFUiIsImJpbmRUZXh0dXJlIiwiVEVYVFVSRV8yRCIsInRleEltYWdlMkQiLCJSR0JBIiwiVU5TSUdORURfQllURSIsInRleFBhcmFtZXRlcmkiLCJURVhUVVJFX01BR19GSUxURVIiLCJMSU5FQVIiLCJURVhUVVJFX01JTl9GSUxURVIiLCJMSU5FQVJfTUlQTUFQX05FQVJFU1QiLCJnZW5lcmF0ZU1pcG1hcCIsInRleHR1cmVMb2FkZWQiLCJ0ZXh0dXJlV2lkdGgiLCJ0ZXh0dXJlSGVpZ2h0IiwidG1hdCIsImltYXQiLCJvbGRTY2FsZSIsInVwZGF0ZU1hdHJpeCIsInVuaWZvcm0zZiIsInVuaWZvcm1NYXRyaXgzZnYiLCJ2ZXJ0ZXhBdHRyaWJQb2ludGVyIiwiRkxPQVQiLCJkcmF3RWxlbWVudHMiLCJUUklBTkdMRVMiLCJVTlNJR05FRF9TSE9SVCIsIm1vdmVPcmlnaW5NYXRyaXgiLCJ0cmFuc2xhdGlvbk1hdHJpeCIsImFuZ2VsIiwicm90YXRpb25NYXRyaXgiLCJzY2FsZU1hdHJpeCIsIm1hdHJpeCIsIkN1c3RvbVJlbmRlcmVyIiwiTGluZVpvbmUiLCJ4MSIsInkxIiwieDIiLCJ5MiIsImRpcmVjdGlvbiIsIm1pbngiLCJtaW4iLCJtaW55IiwibWF4eCIsIm1heHkiLCJ4eHl5IiwiZ2V0TGVuZ3RoIiwiQyIsIkQiLCJnZXREaXN0YW5jZSIsImdldFN5bW1ldHJpYyIsInRoYTIiLCJ0aGExIiwib2xkeCIsIm9sZHkiLCJyYW5nZU91dCIsIkNpcmNsZVpvbmUiLCJyYW5kb21SYWRpdXMiLCJzZXRDZW50ZXIiLCJSZWN0Wm9uZSIsIkltYWdlWm9uZSIsInZlY3RvcnMiLCJzZXRWZWN0b3JzIiwiaiIsImxlbmd0aDEiLCJsZW5ndGgyIiwiZ2V0Qm91bmQiLCJnZXRDb2xvciIsImZ1bmMiLCJnZXRTdHlsZSIsImRyYXdab25lIiwibW92ZVRvIiwibGluZVRvIiwiZHJhd1JlY3QiLCJkcmF3RW1pdHRlciIsIlZlY3RvciIsIlBvbGFyIiwiZ2V0U3BhbiIsIkluaXQiLCJMIiwiUCIsIlYi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 +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdG9uLmpzIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMvV2ViR0xVdGlsLmpzIiwiLi4vc3JjL3V0aWxzL0RvbVV0aWwuanMiLCIuLi9zcmMvdXRpbHMvSW1nVXRpbC5qcyIsIi4uL3NyYy91dGlscy9VdGlsLmpzIiwiLi4vc3JjL3V0aWxzL1B1aWQuanMiLCIuLi9zcmMvY29yZS9Qb29sLmpzIiwiLi4vc3JjL2RlYnVnL1N0YXRzLmpzIiwiLi4vc3JjL2V2ZW50cy9FdmVudERpc3BhdGNoZXIuanMiLCIuLi9zcmMvbWF0aC9NYXRoVXRpbC5qcyIsIi4uL3NyYy9tYXRoL0ludGVncmF0aW9uLmpzIiwiLi4vc3JjL2NvcmUvUHJvdG9uLmpzIiwiLi4vc3JjL3V0aWxzL1JnYi5qcyIsIi4uL3NyYy91dGlscy9Qcm9wVXRpbC5qcyIsIi4uL3NyYy9tYXRoL2Vhc2UuanMiLCIuLi9zcmMvbWF0aC9WZWN0b3IyRC5qcyIsIi4uL3NyYy9jb3JlL1BhcnRpY2xlLmpzIiwiLi4vc3JjL3V0aWxzL0NvbG9yVXRpbC5qcyIsIi4uL3NyYy9tYXRoL1BvbGFyMkQuanMiLCIuLi9zcmMvbWF0aC9NYXQzLmpzIiwiLi4vc3JjL21hdGgvU3Bhbi5qcyIsIi4uL3NyYy9tYXRoL0FycmF5U3Bhbi5qcyIsIi4uL3NyYy9tYXRoL1JlY3RhbmdsZS5qcyIsIi4uL3NyYy9pbml0aWFsaXplL1JhdGUuanMiLCIuLi9zcmMvaW5pdGlhbGl6ZS9Jbml0aWFsaXplLmpzIiwiLi4vc3JjL2luaXRpYWxpemUvTGlmZS5qcyIsIi4uL3NyYy96b25lL1pvbmUuanMiLCIuLi9zcmMvem9uZS9Qb2ludFpvbmUuanMiLCIuLi9zcmMvaW5pdGlhbGl6ZS9Qb3NpdGlvbi5qcyIsIi4uL3NyYy9pbml0aWFsaXplL1ZlbG9jaXR5LmpzIiwiLi4vc3JjL2luaXRpYWxpemUvTWFzcy5qcyIsIi4uL3NyYy9pbml0aWFsaXplL1JhZGl1cy5qcyIsIi4uL3NyYy9pbml0aWFsaXplL0JvZHkuanMiLCIuLi9zcmMvYmVoYXZpb3VyL0JlaGF2aW91ci5qcyIsIi4uL3NyYy9iZWhhdmlvdXIvRm9yY2UuanMiLCIuLi9zcmMvYmVoYXZpb3VyL0F0dHJhY3Rpb24uanMiLCIuLi9zcmMvYmVoYXZpb3VyL1JhbmRvbURyaWZ0LmpzIiwiLi4vc3JjL2JlaGF2aW91ci9HcmF2aXR5LmpzIiwiLi4vc3JjL2JlaGF2aW91ci9Db2xsaXNpb24uanMiLCIuLi9zcmMvYmVoYXZpb3VyL0Nyb3NzWm9uZS5qcyIsIi4uL3NyYy9iZWhhdmlvdXIvQWxwaGEuanMiLCIuLi9zcmMvYmVoYXZpb3VyL1NjYWxlLmpzIiwiLi4vc3JjL2JlaGF2aW91ci9Sb3RhdGUuanMiLCIuLi9zcmMvYmVoYXZpb3VyL0NvbG9yLmpzIiwiLi4vc3JjL2JlaGF2aW91ci9DeWNsb25lLmpzIiwiLi4vc3JjL2JlaGF2aW91ci9SZXB1bHNpb24uanMiLCIuLi9zcmMvYmVoYXZpb3VyL0dyYXZpdHlXZWxsLmpzIiwiLi4vc3JjL2luaXRpYWxpemUvSW5pdGlhbGl6ZVV0aWwuanMiLCIuLi9zcmMvZW1pdHRlci9FbWl0dGVyLmpzIiwiLi4vc3JjL2VtaXR0ZXIvQmVoYXZpb3VyRW1pdHRlci5qcyIsIi4uL3NyYy9lbWl0dGVyL0ZvbGxvd0VtaXR0ZXIuanMiLCIuLi9zcmMvdXRpbHMvVHlwZXMuanMiLCIuLi9zcmMvcmVuZGVyL0Jhc2VSZW5kZXJlci5qcyIsIi4uL3NyYy9yZW5kZXIvQ2FudmFzUmVuZGVyZXIuanMiLCIuLi9zcmMvcmVuZGVyL0RvbVJlbmRlcmVyLmpzIiwiLi4vc3JjL3JlbmRlci9FYXNlbFJlbmRlcmVyLmpzIiwiLi4vc3JjL3JlbmRlci9QaXhlbFJlbmRlcmVyLmpzIiwiLi4vc3JjL3JlbmRlci9QaXhpUmVuZGVyZXIuanMiLCIuLi9zcmMvdXRpbHMvTVN0YWNrLmpzIiwiLi4vc3JjL3JlbmRlci9XZWJHTFJlbmRlcmVyLmpzIiwiLi4vc3JjL3JlbmRlci9DdXN0b21SZW5kZXJlci5qcyIsIi4uL3NyYy96b25lL0xpbmVab25lLmpzIiwiLi4vc3JjL3pvbmUvQ2lyY2xlWm9uZS5qcyIsIi4uL3NyYy96b25lL1JlY3Rab25lLmpzIiwiLi4vc3JjL3pvbmUvSW1hZ2Vab25lLmpzIiwiLi4vc3JjL2RlYnVnL0RlYnVnLmpzIiwiLi4vc3JjL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IHtcbiAgLyoqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLldlYkdMVXRpbFxuICAgKiBAbWV0aG9kIGlwb3RcbiAgICpcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uXG4gICAqIEB0b2RvIGFkZCBsZW5ndGggZGVzY3JpcHRpb25cbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGxlbmd0aFxuICAgKlxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaXBvdChsZW5ndGgpIHtcbiAgICByZXR1cm4gKGxlbmd0aCAmIChsZW5ndGggLSAxKSkgPT09IDA7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLldlYkdMVXRpbFxuICAgKiBAbWV0aG9kIG5ocG90XG4gICAqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvblxuICAgKiBAdG9kbyBhZGQgbGVuZ3RoIGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBsZW5ndGhcbiAgICpcbiAgICogQHJldHVybiB7TnVtYmVyfVxuICAgKi9cbiAgbmhwb3QobGVuZ3RoKSB7XG4gICAgLS1sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCAzMjsgaSA8PD0gMSkge1xuICAgICAgbGVuZ3RoID0gbGVuZ3RoIHwgKGxlbmd0aCA+PiBpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGVuZ3RoICsgMTtcbiAgfSxcblxuICAvKipcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uV2ViR0xVdGlsXG4gICAqIEBtZXRob2QgbWFrZVRyYW5zbGF0aW9uXG4gICAqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvblxuICAgKiBAdG9kbyBhZGQgdHgsIHR5IGRlc2NyaXB0aW9uXG4gICAqIEB0b2RvIGFkZCByZXR1cm4gZGVzY3JpcHRpb25cbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHR4IGVpdGhlciAwIG9yIDFcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHR5IGVpdGhlciAwIG9yIDFcbiAgICpcbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cbiAgbWFrZVRyYW5zbGF0aW9uKHR4LCB0eSkge1xuICAgIHJldHVybiBbMSwgMCwgMCwgMCwgMSwgMCwgdHgsIHR5LCAxXTtcbiAgfSxcblxuICAvKipcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uV2ViR0xVdGlsXG4gICAqIEBtZXRob2QgbWFrZVJvdGF0aW9uXG4gICAqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvblxuICAgKiBAdG9kbyBhZGQgcmV0dXJuIGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBhbmdsZUluUmFkaWFuc1xuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuICBtYWtlUm90YXRpb24oYW5nbGVJblJhZGlhbnMpIHtcbiAgICBsZXQgYyA9IE1hdGguY29zKGFuZ2xlSW5SYWRpYW5zKTtcbiAgICBsZXQgcyA9IE1hdGguc2luKGFuZ2xlSW5SYWRpYW5zKTtcblxuICAgIHJldHVybiBbYywgLXMsIDAsIHMsIGMsIDAsIDAsIDAsIDFdO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5XZWJHTFV0aWxcbiAgICogQG1ldGhvZCBtYWtlU2NhbGVcbiAgICpcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uXG4gICAqIEB0b2RvIGFkZCB0eCwgdHkgZGVzY3JpcHRpb25cbiAgICogQHRvZG8gYWRkIHJldHVybiBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gc3ggZWl0aGVyIDAgb3IgMVxuICAgKiBAcGFyYW0ge051bWJlcn0gc3kgZWl0aGVyIDAgb3IgMVxuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuICBtYWtlU2NhbGUoc3gsIHN5KSB7XG4gICAgcmV0dXJuIFtzeCwgMCwgMCwgMCwgc3ksIDAsIDAsIDAsIDFdO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5XZWJHTFV0aWxcbiAgICogQG1ldGhvZCBtYXRyaXhNdWx0aXBseVxuICAgKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb25cbiAgICogQHRvZG8gYWRkIGEsIGIgZGVzY3JpcHRpb25cbiAgICogQHRvZG8gYWRkIHJldHVybiBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gYVxuICAgKiBAcGFyYW0ge09iamVjdH0gYlxuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuICBtYXRyaXhNdWx0aXBseShhLCBiKSB7XG4gICAgbGV0IGEwMCA9IGFbMCAqIDMgKyAwXTtcbiAgICBsZXQgYTAxID0gYVswICogMyArIDFdO1xuICAgIGxldCBhMDIgPSBhWzAgKiAzICsgMl07XG4gICAgbGV0IGExMCA9IGFbMSAqIDMgKyAwXTtcbiAgICBsZXQgYTExID0gYVsxICogMyArIDFdO1xuICAgIGxldCBhMTIgPSBhWzEgKiAzICsgMl07XG4gICAgbGV0IGEyMCA9IGFbMiAqIDMgKyAwXTtcbiAgICBsZXQgYTIxID0gYVsyICogMyArIDFdO1xuICAgIGxldCBhMjIgPSBhWzIgKiAzICsgMl07XG4gICAgbGV0IGIwMCA9IGJbMCAqIDMgKyAwXTtcbiAgICBsZXQgYjAxID0gYlswICogMyArIDFdO1xuICAgIGxldCBiMDIgPSBiWzAgKiAzICsgMl07XG4gICAgbGV0IGIxMCA9IGJbMSAqIDMgKyAwXTtcbiAgICBsZXQgYjExID0gYlsxICogMyArIDFdO1xuICAgIGxldCBiMTIgPSBiWzEgKiAzICsgMl07XG4gICAgbGV0IGIyMCA9IGJbMiAqIDMgKyAwXTtcbiAgICBsZXQgYjIxID0gYlsyICogMyArIDFdO1xuICAgIGxldCBiMjIgPSBiWzIgKiAzICsgMl07XG5cbiAgICByZXR1cm4gW1xuICAgICAgYTAwICogYjAwICsgYTAxICogYjEwICsgYTAyICogYjIwLFxuICAgICAgYTAwICogYjAxICsgYTAxICogYjExICsgYTAyICogYjIxLFxuICAgICAgYTAwICogYjAyICsgYTAxICogYjEyICsgYTAyICogYjIyLFxuICAgICAgYTEwICogYjAwICsgYTExICogYjEwICsgYTEyICogYjIwLFxuICAgICAgYTEwICogYjAxICsgYTExICogYjExICsgYTEyICogYjIxLFxuICAgICAgYTEwICogYjAyICsgYTExICogYjEyICsgYTEyICogYjIyLFxuICAgICAgYTIwICogYjAwICsgYTIxICogYjEwICsgYTIyICogYjIwLFxuICAgICAgYTIwICogYjAxICsgYTIxICogYjExICsgYTIyICogYjIxLFxuICAgICAgYTIwICogYjAyICsgYTIxICogYjEyICsgYTIyICogYjIyXG4gICAgXTtcbiAgfVxufTtcbiIsImV4cG9ydCBkZWZhdWx0IHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgY2FudmFzLiBUaGUgb3BhY2l0eSBpcyBieSBkZWZhdWx0IHNldCB0byAwXG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkRvbVV0aWxcbiAgICogQG1ldGhvZCBjcmVhdGVDYW52YXNcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9ICRpZCB0aGUgY2FudmFzJyBpZFxuICAgKiBAcGFyYW0ge051bWJlcn0gJHdpZHRoIHRoZSBjYW52YXMnIHdpZHRoXG4gICAqIEBwYXJhbSB7TnVtYmVyfSAkaGVpZ2h0IHRoZSBjYW52YXMnIGhlaWdodFxuICAgKiBAcGFyYW0ge1N0cmluZ30gWyRwb3NpdGlvbj1hYnNvbHV0ZV0gdGhlIGNhbnZhcycgcG9zaXRpb24sIGRlZmF1bHQgaXMgJ2Fic29sdXRlJ1xuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuICBjcmVhdGVDYW52YXMoaWQsIHdpZHRoLCBoZWlnaHQsIHBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiKSB7XG4gICAgY29uc3QgZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcblxuICAgIGRvbS5pZCA9IGlkO1xuICAgIGRvbS53aWR0aCA9IHdpZHRoO1xuICAgIGRvbS5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgZG9tLnN0eWxlLm9wYWNpdHkgPSAwO1xuICAgIGRvbS5zdHlsZS5wb3NpdGlvbiA9IHBvc2l0aW9uO1xuICAgIHRoaXMudHJhbnNmb3JtKGRvbSwgLTUwMCwgLTUwMCwgMCwgMCk7XG5cbiAgICByZXR1cm4gZG9tO1xuICB9LFxuXG4gIGNyZWF0ZURpdihpZCwgd2lkdGgsIGhlaWdodCkge1xuICAgIGNvbnN0IGRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cbiAgICBkb20uaWQgPSBpZDtcbiAgICBkb20uc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgdGhpcy5yZXNpemUoZG9tLCB3aWR0aCwgaGVpZ2h0KTtcblxuICAgIHJldHVybiBkb207XG4gIH0sXG5cbiAgcmVzaXplKGRvbSwgd2lkdGgsIGhlaWdodCkge1xuICAgIGRvbS5zdHlsZS53aWR0aCA9IHdpZHRoICsgXCJweFwiO1xuICAgIGRvbS5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyBcInB4XCI7XG4gICAgZG9tLnN0eWxlLm1hcmdpbkxlZnQgPSAtd2lkdGggLyAyICsgXCJweFwiO1xuICAgIGRvbS5zdHlsZS5tYXJnaW5Ub3AgPSAtaGVpZ2h0IC8gMiArIFwicHhcIjtcbiAgfSxcblxuICAvKipcbiAgICogQWRkcyBhIHRyYW5zZm9ybTogdHJhbnNsYXRlKCksIHNjYWxlKCksIHJvdGF0ZSgpIHRvIGEgZ2l2ZW4gZGl2IGRvbSBmb3IgYWxsIGJyb3dzZXJzXG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkRvbVV0aWxcbiAgICogQG1ldGhvZCB0cmFuc2Zvcm1cbiAgICpcbiAgICogQHBhcmFtIHtIVE1MRGl2RWxlbWVudH0gZGl2XG4gICAqIEBwYXJhbSB7TnVtYmVyfSAkeFxuICAgKiBAcGFyYW0ge051bWJlcn0gJHlcbiAgICogQHBhcmFtIHtOdW1iZXJ9ICRzY2FsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gJHJvdGF0ZVxuICAgKi9cbiAgdHJhbnNmb3JtKGRpdiwgeCwgeSwgc2NhbGUsIHJvdGF0ZSkge1xuICAgIGRpdi5zdHlsZS53aWxsQ2hhbmdlID0gXCJ0cmFuc2Zvcm1cIjtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7eH1weCwgJHt5fXB4KSBzY2FsZSgke3NjYWxlfSkgcm90YXRlKCR7cm90YXRlfWRlZylgO1xuICAgIHRoaXMuY3NzMyhkaXYsIFwidHJhbnNmb3JtXCIsIHRyYW5zZm9ybSk7XG4gIH0sXG5cbiAgdHJhbnNmb3JtM2QoZGl2LCB4LCB5LCBzY2FsZSwgcm90YXRlKSB7XG4gICAgZGl2LnN0eWxlLndpbGxDaGFuZ2UgPSBcInRyYW5zZm9ybVwiO1xuICAgIGNvbnN0IHRyYW5zZm9ybSA9IGB0cmFuc2xhdGUzZCgke3h9cHgsICR7eX1weCwgMCkgc2NhbGUoJHtzY2FsZX0pIHJvdGF0ZSgke3JvdGF0ZX1kZWcpYDtcbiAgICB0aGlzLmNzczMoZGl2LCBcImJhY2tmYWNlVmlzaWJpbGl0eVwiLCBcImhpZGRlblwiKTtcbiAgICB0aGlzLmNzczMoZGl2LCBcInRyYW5zZm9ybVwiLCB0cmFuc2Zvcm0pO1xuICB9LFxuXG4gIGNzczMoZGl2LCBrZXksIHZhbCkge1xuICAgIGNvbnN0IGJrZXkgPSBrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBrZXkuc3Vic3RyKDEpO1xuXG4gICAgZGl2LnN0eWxlW2BXZWJraXQke2JrZXl9YF0gPSB2YWw7XG4gICAgZGl2LnN0eWxlW2BNb3oke2JrZXl9YF0gPSB2YWw7XG4gICAgZGl2LnN0eWxlW2BPJHtia2V5fWBdID0gdmFsO1xuICAgIGRpdi5zdHlsZVtgbXMke2JrZXl9YF0gPSB2YWw7XG4gICAgZGl2LnN0eWxlW2Ake2tleX1gXSA9IHZhbDtcbiAgfVxufTtcbiIsImltcG9ydCBXZWJHTFV0aWwgZnJvbSBcIi4vV2ViR0xVdGlsXCI7XG5pbXBvcnQgRG9tVXRpbCBmcm9tIFwiLi9Eb21VdGlsXCI7XG5cbmNvbnN0IGltZ3NDYWNoZSA9IHt9O1xuY29uc3QgY2FudmFzQ2FjaGUgPSB7fTtcbmxldCBjYW52YXNJZCA9IDA7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgLyoqXG4gICAqIFRoaXMgd2lsbCBnZXQgdGhlIGltYWdlIGRhdGEuIEl0IGNvdWxkIGJlIG5lY2Vzc2FyeSB0byBjcmVhdGUgYSBQcm90b24uWm9uZS5cbiAgICpcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uVXRpbFxuICAgKiBAbWV0aG9kIGdldEltYWdlRGF0YVxuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxDYW52YXNFbGVtZW50fSAgIGNvbnRleHQgYW55IGNhbnZhcywgbXVzdCBiZSBhIDJkQ29udGV4dCAnY2FudmFzLmdldENvbnRleHQoJzJkJyknXG4gICAqIEBwYXJhbSB7T2JqZWN0fSAgICAgICAgICAgICAgaW1hZ2UgICBjb3VsZCBiZSBhbnkgZG9tIGltYWdlLCBlLmcuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGlzSXNBbkltZ1RhZycpO1xuICAgKiBAcGFyYW0ge1Byb3Rvbi5SZWN0YW5nbGV9ICAgIHJlY3RcbiAgICovXG4gIGdldEltYWdlRGF0YShjb250ZXh0LCBpbWFnZSwgcmVjdCkge1xuICAgIGNvbnRleHQuZHJhd0ltYWdlKGltYWdlLCByZWN0LngsIHJlY3QueSk7XG4gICAgY29uc3QgaW1hZ2VkYXRhID0gY29udGV4dC5nZXRJbWFnZURhdGEocmVjdC54LCByZWN0LnksIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTtcbiAgICBjb250ZXh0LmNsZWFyUmVjdChyZWN0LngsIHJlY3QueSwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpO1xuXG4gICAgcmV0dXJuIGltYWdlZGF0YTtcbiAgfSxcblxuICAvKipcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uVXRpbFxuICAgKiBAbWV0aG9kIGdldEltZ0Zyb21DYWNoZVxuICAgKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb25cbiAgICogQHRvZG8gZGVzY3JpYmUgZnVuY1xuICAgKlxuICAgKiBAcGFyYW0ge01peGVkfSAgICAgICAgICAgICAgIGltZ1xuICAgKiBAcGFyYW0ge1Byb3Rvbi5QYXJ0aWNsZX0gICAgIHBhcnRpY2xlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gICAgICAgICAgICAgZHJhd0NhbnZhcyAgc2V0IHRvIHRydWUgaWYgYSBjYW52YXMgc2hvdWxkIGJlIHNhdmVkIGludG8gcGFydGljbGUuZGF0YS5jYW52YXNcbiAgICogQHBhcmFtIHtCb29sZWFufSAgICAgICAgICAgICBmdW5jXG4gICAqL1xuICBnZXRJbWdGcm9tQ2FjaGUoaW1nLCBjYWxsYmFjaywgcGFyYW0pIHtcbiAgICBjb25zdCBzcmMgPSB0eXBlb2YgaW1nID09PSBcInN0cmluZ1wiID8gaW1nIDogaW1nLnNyYztcblxuICAgIGlmIChpbWdzQ2FjaGVbc3JjXSkge1xuICAgICAgY2FsbGJhY2soaW1nc0NhY2hlW3NyY10sIHBhcmFtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgICAgIGltYWdlLm9ubG9hZCA9IGUgPT4ge1xuICAgICAgICBpbWdzQ2FjaGVbc3JjXSA9IGUudGFyZ2V0O1xuICAgICAgICBjYWxsYmFjayhpbWdzQ2FjaGVbc3JjXSwgcGFyYW0pO1xuICAgICAgfTtcblxuICAgICAgaW1hZ2Uuc3JjID0gc3JjO1xuICAgIH1cbiAgfSxcblxuICBnZXRDYW52YXNGcm9tQ2FjaGUoaW1nLCBjYWxsYmFjaywgcGFyYW0pIHtcbiAgICBjb25zdCBzcmMgPSBpbWcuc3JjO1xuXG4gICAgaWYgKCFjYW52YXNDYWNoZVtzcmNdKSB7XG4gICAgICBjb25zdCB3aWR0aCA9IFdlYkdMVXRpbC5uaHBvdChpbWcud2lkdGgpO1xuICAgICAgY29uc3QgaGVpZ2h0ID0gV2ViR0xVdGlsLm5ocG90KGltZy5oZWlnaHQpO1xuXG4gICAgICBjb25zdCBjYW52YXMgPSBEb21VdGlsLmNyZWF0ZUNhbnZhcyhgcHJvdG9uX2NhbnZhc19jYWNoZV8keysrY2FudmFzSWR9YCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgIGNvbnRleHQuZHJhd0ltYWdlKGltZywgMCwgMCwgaW1nLndpZHRoLCBpbWcuaGVpZ2h0KTtcblxuICAgICAgY2FudmFzQ2FjaGVbc3JjXSA9IGNhbnZhcztcbiAgICB9XG5cbiAgICBjYWxsYmFjayAmJiBjYWxsYmFjayhjYW52YXNDYWNoZVtzcmNdLCBwYXJhbSk7XG5cbiAgICByZXR1cm4gY2FudmFzQ2FjaGVbc3JjXTtcbiAgfVxufTtcbiIsImltcG9ydCBJbWdVdGlsIGZyb20gXCIuL0ltZ1V0aWxcIjtcblxuZXhwb3J0IGRlZmF1bHQge1xuICAvKipcbiAgICogUmV0dXJucyB0aGUgZGVmYXVsdCBpZiB0aGUgdmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWRcbiAgICpcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uVXRpbFxuICAgKiBAbWV0aG9kIGluaXRWYWx1ZVxuICAgKlxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZSBhIHNwZWNpZmljIHZhbHVlLCBjb3VsZCBiZSBldmVyeXRoaW5nIGJ1dCBudWxsIG9yIHVuZGVmaW5lZFxuICAgKiBAcGFyYW0ge01peGVkfSBkZWZhdWx0cyB0aGUgZGVmYXVsdCBpZiB0aGUgdmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWRcbiAgICovXG4gIGluaXRWYWx1ZSh2YWx1ZSwgZGVmYXVsdHMpIHtcbiAgICB2YWx1ZSA9IHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IGRlZmF1bHRzO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSxcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSB2YWx1ZSBpcyBhIHZhbGlkIGFycmF5XG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlV0aWxcbiAgICogQG1ldGhvZCBpc0FycmF5XG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlIEFueSBhcnJheVxuICAgKlxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICovXG4gIGlzQXJyYXkodmFsdWUpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gXCJbb2JqZWN0IEFycmF5XVwiO1xuICB9LFxuXG4gIC8qKlxuICAgKiBEZXN0cm95ZXMgdGhlIGdpdmVuIGFycmF5XG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlV0aWxcbiAgICogQG1ldGhvZCBlbXB0eUFycmF5XG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IEFueSBhcnJheVxuICAgKi9cbiAgZW1wdHlBcnJheShhcnIpIHtcbiAgICBpZiAoYXJyKSBhcnIubGVuZ3RoID0gMDtcbiAgfSxcblxuICB0b0FycmF5KGFycikge1xuICAgIHJldHVybiB0aGlzLmlzQXJyYXkoYXJyKSA/IGFyciA6IFthcnJdO1xuICB9LFxuXG4gIGdldFJhbmRGcm9tQXJyYXkoYXJyKSB7XG4gICAgaWYgKCFhcnIpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBhcnJbTWF0aC5mbG9vcihhcnIubGVuZ3RoICogTWF0aC5yYW5kb20oKSldO1xuICB9LFxuXG4gIC8qKlxuICAgKiBEZXN0cm95ZXMgdGhlIGdpdmVuIG9iamVjdFxuICAgKlxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5VdGlsXG4gICAqIEBtZXRob2QgZW1wdHlPYmplY3RcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iaiBBbnkgb2JqZWN0XG4gICAqL1xuICBlbXB0eU9iamVjdChvYmosIGlnbm9yZSA9IG51bGwpIHtcbiAgICBmb3IgKGxldCBrZXkgaW4gb2JqKSB7XG4gICAgICBpZiAoaWdub3JlICYmIGlnbm9yZS5pbmRleE9mKGtleSkgPiAtMSkgY29udGludWU7XG4gICAgICBkZWxldGUgb2JqW2tleV07XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBNYWtlcyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIGFuZCBiaW5kcyB0aGUgZ2l2ZW4gYXJyYXlcbiAgICpcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uVXRpbFxuICAgKiBAbWV0aG9kIGNsYXNzQXBwbHlcbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29uc3RydWN0b3IgQSBjbGFzcyB0byBtYWtlIGFuIGluc3RhbmNlIGZyb21cbiAgICogQHBhcmFtIHtBcnJheX0gW2FyZ3NdIEFueSBhcnJheSB0byBiaW5kIGl0IHRvIHRoZSBjb25zdHJ1Y3RvclxuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBpbnN0YW5jZSBvZiBjb25zdHJ1Y3Rvciwgb3B0aW9uYWxseSBiaW5kIHdpdGggYXJnc1xuICAgKi9cbiAgY2xhc3NBcHBseShjb25zdHJ1Y3RvciwgYXJncyA9IG51bGwpIHtcbiAgICBpZiAoIWFyZ3MpIHtcbiAgICAgIHJldHVybiBuZXcgY29uc3RydWN0b3IoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgRmFjdG9yeUZ1bmMgPSBjb25zdHJ1Y3Rvci5iaW5kLmFwcGx5KGNvbnN0cnVjdG9yLCBbbnVsbF0uY29uY2F0KGFyZ3MpKTtcbiAgICAgIHJldHVybiBuZXcgRmFjdG9yeUZ1bmMoKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFRoaXMgd2lsbCBnZXQgdGhlIGltYWdlIGRhdGEuIEl0IGNvdWxkIGJlIG5lY2Vzc2FyeSB0byBjcmVhdGUgYSBQcm90b24uWm9uZS5cbiAgICpcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uVXRpbFxuICAgKiBAbWV0aG9kIGdldEltYWdlRGF0YVxuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxDYW52YXNFbGVtZW50fSAgIGNvbnRleHQgYW55IGNhbnZhcywgbXVzdCBiZSBhIDJkQ29udGV4dCAnY2FudmFzLmdldENvbnRleHQoJzJkJyknXG4gICAqIEBwYXJhbSB7T2JqZWN0fSAgICAgICAgICAgICAgaW1hZ2UgICBjb3VsZCBiZSBhbnkgZG9tIGltYWdlLCBlLmcuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGlzSXNBbkltZ1RhZycpO1xuICAgKiBAcGFyYW0ge1Byb3Rvbi5SZWN0YW5nbGV9ICAgIHJlY3RcbiAgICovXG4gIGdldEltYWdlRGF0YShjb250ZXh0LCBpbWFnZSwgcmVjdCkge1xuICAgIHJldHVybiBJbWdVdGlsLmdldEltYWdlRGF0YShjb250ZXh0LCBpbWFnZSwgcmVjdCk7XG4gIH0sXG5cbiAgZGVzdHJveUFsbChhcnIsIHBhcmFtID0gbnVsbCkge1xuICAgIGxldCBpID0gYXJyLmxlbmd0aDtcblxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGFycltpXS5kZXN0cm95KHBhcmFtKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG5cbiAgICAgIGRlbGV0ZSBhcnJbaV07XG4gICAgfVxuXG4gICAgYXJyLmxlbmd0aCA9IDA7XG4gIH0sXG5cbiAgYXNzaWduKHRhcmdldCwgc291cmNlKSB7XG4gICAgaWYgKHR5cGVvZiBPYmplY3QuYXNzaWduICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGZvciAobGV0IGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHRhcmdldCwgc291cmNlKTtcbiAgICB9XG4gIH1cbn07XG4iLCJjb25zdCBpZHNNYXAgPSB7fTtcblxuY29uc3QgUHVpZCA9IHtcbiAgX2luZGV4OiAwLFxuICBfY2FjaGU6IHt9LFxuXG4gIGlkKHR5cGUpIHtcbiAgICBpZiAoaWRzTWFwW3R5cGVdID09PSB1bmRlZmluZWQgfHwgaWRzTWFwW3R5cGVdID09PSBudWxsKSBpZHNNYXBbdHlwZV0gPSAwO1xuICAgIHJldHVybiBgJHt0eXBlfV8ke2lkc01hcFt0eXBlXSsrfWA7XG4gIH0sXG5cbiAgZ2V0SWQodGFyZ2V0KSB7XG4gICAgbGV0IHVpZCA9IHRoaXMuZ2V0SWRGcm9tQ2FjaGUodGFyZ2V0KTtcbiAgICBpZiAodWlkKSByZXR1cm4gdWlkO1xuXG4gICAgdWlkID0gYFBVSURfJHt0aGlzLl9pbmRleCsrfWA7XG4gICAgdGhpcy5fY2FjaGVbdWlkXSA9IHRhcmdldDtcbiAgICByZXR1cm4gdWlkO1xuICB9LFxuXG4gIGdldElkRnJvbUNhY2hlKHRhcmdldCkge1xuICAgIGxldCBvYmosIGlkO1xuXG4gICAgZm9yIChpZCBpbiB0aGlzLl9jYWNoZSkge1xuICAgICAgb2JqID0gdGhpcy5fY2FjaGVbaWRdO1xuXG4gICAgICBpZiAob2JqID09PSB0YXJnZXQpIHJldHVybiBpZDtcbiAgICAgIGlmICh0aGlzLmlzQm9keShvYmosIHRhcmdldCkgJiYgb2JqLnNyYyA9PT0gdGFyZ2V0LnNyYykgcmV0dXJuIGlkO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9LFxuXG4gIGlzQm9keShvYmosIHRhcmdldCkge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiB0YXJnZXQgPT09IFwib2JqZWN0XCIgJiYgb2JqLmlzSW5uZXIgJiYgdGFyZ2V0LmlzSW5uZXI7XG4gIH0sXG5cbiAgZ2V0VGFyZ2V0KHVpZCkge1xuICAgIHJldHVybiB0aGlzLl9jYWNoZVt1aWRdO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBQdWlkO1xuIiwiLyoqXG4gKiBQb29sIGlzIHRoZSBjYWNoZSBwb29sIG9mIHRoZSBwcm90b24gZW5naW5lLCBpdCBpcyB2ZXJ5IGltcG9ydGFudC5cbiAqXG4gKiBnZXQodGFyZ2V0LCBwYXJhbXMsIHVpZClcbiAqICBDbGFzc1xuICogICAgdWlkID0gUHVpZC5nZXRJZCAtPiBQdWlkIHNhdmUgdGFyZ2V0IGNhY2hlXG4gKiAgICB0YXJnZXQuX19wdWlkID0gdWlkXG4gKlxuICogIGJvZHlcbiAqICAgIHVpZCA9IFB1aWQuZ2V0SWQgLT4gUHVpZCBzYXZlIHRhcmdldCBjYWNoZVxuICpcbiAqXG4gKiBleHBpcmUodGFyZ2V0KVxuICogIGNhY2hlW3RhcmdldC5fX3B1aWRdIHB1c2ggdGFyZ2V0XG4gKlxuICovXG5pbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IFB1aWQgZnJvbSBcIi4uL3V0aWxzL1B1aWRcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUG9vbCB7XG4gIC8qKlxuICAgKiBAbWVtYmVyb2YhIFByb3RvbiNcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBhbGlhcyBQcm90b24uUG9vbFxuICAgKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb25cbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uIG9mIHByb3BlcnRpZXNcbiAgICpcbiAgICogQHByb3BlcnR5IHtOdW1iZXJ9IHRvdGFsXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjYWNoZVxuICAgKi9cbiAgY29uc3RydWN0b3IobnVtKSB7XG4gICAgdGhpcy50b3RhbCA9IDA7XG4gICAgdGhpcy5jYWNoZSA9IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBAbWV0aG9kIGdldFxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5Qb29sXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSB0YXJnZXRcbiAgICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIGp1c3QgYWRkIGlmIGB0YXJnZXRgIGlzIGEgZnVuY3Rpb25cbiAgICpcbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cbiAgZ2V0KHRhcmdldCwgcGFyYW1zLCB1aWQpIHtcbiAgICBsZXQgcDtcbiAgICB1aWQgPSB1aWQgfHwgdGFyZ2V0Ll9fcHVpZCB8fCBQdWlkLmdldElkKHRhcmdldCk7XG5cbiAgICBpZiAodGhpcy5jYWNoZVt1aWRdICYmIHRoaXMuY2FjaGVbdWlkXS5sZW5ndGggPiAwKSB7XG4gICAgICBwID0gdGhpcy5jYWNoZVt1aWRdLnBvcCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwID0gdGhpcy5jcmVhdGVPckNsb25lKHRhcmdldCwgcGFyYW1zKTtcbiAgICB9XG5cbiAgICBwLl9fcHVpZCA9IHRhcmdldC5fX3B1aWQgfHwgdWlkO1xuICAgIHJldHVybiBwO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBAbWV0aG9kIHNldFxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5Qb29sXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXRcbiAgICpcbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cbiAgZXhwaXJlKHRhcmdldCkge1xuICAgIHJldHVybiB0aGlzLmdldENhY2hlKHRhcmdldC5fX3B1aWQpLnB1c2godGFyZ2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGNsYXNzIGluc3RhbmNlXG4gICAqXG4gICAqIEB0b2RvIGFkZCBtb3JlIGRvY3VtZW50YXRpb25cbiAgICpcbiAgICogQG1ldGhvZCBjcmVhdGVcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uUG9vbFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gdGFyZ2V0IGFueSBPYmplY3Qgb3IgRnVuY3Rpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIGp1c3QgYWRkIGlmIGB0YXJnZXRgIGlzIGEgZnVuY3Rpb25cbiAgICpcbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cbiAgY3JlYXRlT3JDbG9uZSh0YXJnZXQsIHBhcmFtcykge1xuICAgIHRoaXMudG90YWwrKztcblxuICAgIGlmICh0aGlzLmNyZWF0ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlKHRhcmdldCwgcGFyYW1zKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB0YXJnZXQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIFV0aWwuY2xhc3NBcHBseSh0YXJnZXQsIHBhcmFtcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0YXJnZXQuY2xvbmUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uIC0gd2hhdCBpcyBpbiB0aGUgY2FjaGU/XG4gICAqXG4gICAqIEBtZXRob2QgZ2V0Q291bnRcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uUG9vbFxuICAgKlxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAqL1xuICBnZXRDb3VudCgpIHtcbiAgICBsZXQgY291bnQgPSAwO1xuICAgIGZvciAobGV0IGlkIGluIHRoaXMuY2FjaGUpIGNvdW50ICs9IHRoaXMuY2FjaGVbaWRdLmxlbmd0aDtcbiAgICByZXR1cm4gY291bnQrKztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95ZXMgYWxsIGl0ZW1zIGZyb20gUG9vbC5jYWNoZVxuICAgKlxuICAgKiBAbWV0aG9kIGRlc3Ryb3lcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uUG9vbFxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICBmb3IgKGxldCBpZCBpbiB0aGlzLmNhY2hlKSB7XG4gICAgICB0aGlzLmNhY2hlW2lkXS5sZW5ndGggPSAwO1xuICAgICAgZGVsZXRlIHRoaXMuY2FjaGVbaWRdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIFBvb2wuY2FjaGVcbiAgICpcbiAgICogQG1ldGhvZCBnZXRDYWNoZVxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5Qb29sXG4gICAqIEBwcml2YXRlXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB1aWQgdGhlIHVuaXF1ZSBpZFxuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuICBnZXRDYWNoZSh1aWQgPSBcImRlZmF1bHRcIikge1xuICAgIGlmICghdGhpcy5jYWNoZVt1aWRdKSB0aGlzLmNhY2hlW3VpZF0gPSBbXTtcbiAgICByZXR1cm4gdGhpcy5jYWNoZVt1aWRdO1xuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBTdGF0cyB7XG4gIGNvbnN0cnVjdG9yKHByb3Rvbikge1xuICAgIHRoaXMucHJvdG9uID0gcHJvdG9uO1xuICAgIHRoaXMuY29udGFpbmVyID0gbnVsbDtcbiAgICB0aGlzLnR5cGUgPSAxO1xuXG4gICAgdGhpcy5lbWl0dGVySW5kZXggPSAwO1xuICAgIHRoaXMucmVuZGVyZXJJbmRleCA9IDA7XG4gIH1cblxuICB1cGRhdGUoc3R5bGUsIGJvZHkpIHtcbiAgICB0aGlzLmFkZChzdHlsZSwgYm9keSk7XG5cbiAgICBjb25zdCBlbWl0dGVyID0gdGhpcy5nZXRFbWl0dGVyKCk7XG4gICAgY29uc3QgcmVuZGVyZXIgPSB0aGlzLmdldFJlbmRlcmVyKCk7XG4gICAgbGV0IHN0ciA9IFwiXCI7XG5cbiAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgY2FzZSAyOlxuICAgICAgICBzdHIgKz0gXCJlbWl0dGVyOlwiICsgdGhpcy5wcm90b24uZW1pdHRlcnMubGVuZ3RoICsgXCI8YnI+XCI7XG4gICAgICAgIGlmIChlbWl0dGVyKSBzdHIgKz0gXCJlbSBzcGVlZDpcIiArIGVtaXR0ZXIuZW1pdFNwZWVkICsgXCI8YnI+XCI7XG4gICAgICAgIGlmIChlbWl0dGVyKSBzdHIgKz0gXCJwb3M6XCIgKyB0aGlzLmdldEVtaXR0ZXJQb3MoZW1pdHRlcik7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIDM6XG4gICAgICAgIGlmIChlbWl0dGVyKSBzdHIgKz0gXCJpbml0aWFsaXplczpcIiArIGVtaXR0ZXIuaW5pdGlhbGl6ZXMubGVuZ3RoICsgXCI8YnI+XCI7XG4gICAgICAgIGlmIChlbWl0dGVyKVxuICAgICAgICAgIHN0ciArPSAnPHNwYW4gc3R5bGU9XCJkaXNwbGF5OmlubGluZS1ibG9jaztcIj4nICsgdGhpcy5jb25jYXRBcnIoZW1pdHRlci5pbml0aWFsaXplcykgKyBcIjwvc3Bhbj48YnI+XCI7XG4gICAgICAgIGlmIChlbWl0dGVyKSBzdHIgKz0gXCJiZWhhdmlvdXJzOlwiICsgZW1pdHRlci5iZWhhdmlvdXJzLmxlbmd0aCArIFwiPGJyPlwiO1xuICAgICAgICBpZiAoZW1pdHRlcikgc3RyICs9ICc8c3BhbiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrO1wiPicgKyB0aGlzLmNvbmNhdEFycihlbWl0dGVyLmJlaGF2aW91cnMpICsgXCI8L3NwYW4+PGJyPlwiO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSA0OlxuICAgICAgICBpZiAocmVuZGVyZXIpIHN0ciArPSByZW5kZXJlci5uYW1lICsgXCI8YnI+XCI7XG4gICAgICAgIGlmIChyZW5kZXJlcikgc3RyICs9IFwiYm9keTpcIiArIHRoaXMuZ2V0Q3JlYXRlZE51bWJlcihyZW5kZXJlcikgKyBcIjxicj5cIjtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHN0ciArPSBcInBhcnRpY2xlczpcIiArIHRoaXMucHJvdG9uLmdldENvdW50KCkgKyBcIjxicj5cIjtcbiAgICAgICAgc3RyICs9IFwicG9vbDpcIiArIHRoaXMucHJvdG9uLnBvb2wuZ2V0Q291bnQoKSArIFwiPGJyPlwiO1xuICAgICAgICBzdHIgKz0gXCJ0b3RhbDpcIiArIHRoaXMucHJvdG9uLnBvb2wudG90YWw7XG4gICAgfVxuXG4gICAgdGhpcy5jb250YWluZXIuaW5uZXJIVE1MID0gc3RyO1xuICB9XG5cbiAgYWRkKHN0eWxlLCBib2R5KSB7XG4gICAgaWYgKCF0aGlzLmNvbnRhaW5lcikge1xuICAgICAgdGhpcy50eXBlID0gMTtcblxuICAgICAgdGhpcy5jb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUuY3NzVGV4dCA9IFtcbiAgICAgICAgXCJwb3NpdGlvbjphYnNvbHV0ZTtib3R0b206MHB4O2xlZnQ6MDtjdXJzb3I6cG9pbnRlcjtcIixcbiAgICAgICAgXCJvcGFjaXR5OjAuOTt6LWluZGV4OjEwMDAwO3BhZGRpbmc6MTBweDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpIZWx2ZXRpY2EsQXJpYWwsc2Fucy1zZXJpZjtcIixcbiAgICAgICAgXCJ3aWR0aDoxMjBweDtoZWlnaHQ6NTBweDtiYWNrZ3JvdW5kLWNvbG9yOiMwMDI7Y29sb3I6IzBmZjtcIlxuICAgICAgXS5qb2luKFwiXCIpO1xuXG4gICAgICB0aGlzLmNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICBcImNsaWNrXCIsXG4gICAgICAgIGUgPT4ge1xuICAgICAgICAgIHRoaXMudHlwZSsrO1xuICAgICAgICAgIGlmICh0aGlzLnR5cGUgPiA0KSB0aGlzLnR5cGUgPSAxO1xuICAgICAgICB9LFxuICAgICAgICBmYWxzZVxuICAgICAgKTtcblxuICAgICAgbGV0IGJnLCBjb2xvcjtcbiAgICAgIHN3aXRjaCAoc3R5bGUpIHtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIGJnID0gXCIjMjAxXCI7XG4gICAgICAgICAgY29sb3IgPSBcIiNmMDhcIjtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgYmcgPSBcIiMwMjBcIjtcbiAgICAgICAgICBjb2xvciA9IFwiIzBmMFwiO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYmcgPSBcIiMwMDJcIjtcbiAgICAgICAgICBjb2xvciA9IFwiIzBmZlwiO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZVtcImJhY2tncm91bmQtY29sb3JcIl0gPSBiZztcbiAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlW1wiY29sb3JcIl0gPSBjb2xvcjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY29udGFpbmVyLnBhcmVudE5vZGUpIHtcbiAgICAgIGJvZHkgPSBib2R5IHx8IHRoaXMuYm9keSB8fCBkb2N1bWVudC5ib2R5O1xuICAgICAgYm9keS5hcHBlbmRDaGlsZCh0aGlzLmNvbnRhaW5lcik7XG4gICAgfVxuICB9XG5cbiAgZ2V0RW1pdHRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5wcm90b24uZW1pdHRlcnNbdGhpcy5lbWl0dGVySW5kZXhdO1xuICB9XG5cbiAgZ2V0UmVuZGVyZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvdG9uLnJlbmRlcmVyc1t0aGlzLnJlbmRlcmVySW5kZXhdO1xuICB9XG5cbiAgY29uY2F0QXJyKGFycikge1xuICAgIGxldCByZXN1bHQgPSBcIlwiO1xuICAgIGlmICghYXJyIHx8ICFhcnIubGVuZ3RoKSByZXR1cm4gcmVzdWx0O1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3VsdCArPSAoYXJyW2ldLm5hbWUgfHwgXCJcIikuc3Vic3RyKDAsIDEpICsgXCIuXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGdldENyZWF0ZWROdW1iZXIocmVuZGVyZXIpIHtcbiAgICByZXR1cm4gcmVuZGVyZXIucG9vbC50b3RhbCB8fCAocmVuZGVyZXIuY3Bvb2wgJiYgcmVuZGVyZXIuY3Bvb2wudG90YWwpIHx8IDA7XG4gIH1cblxuICBnZXRFbWl0dGVyUG9zKGUpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChlLnAueCkgKyBcIixcIiArIE1hdGgucm91bmQoZS5wLnkpO1xuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5jb250YWluZXIgJiYgdGhpcy5jb250YWluZXIucGFyZW50Tm9kZSkge1xuICAgICAgY29uc3QgYm9keSA9IHRoaXMuYm9keSB8fCBkb2N1bWVudC5ib2R5O1xuICAgICAgYm9keS5yZW1vdmVDaGlsZCh0aGlzLmNvbnRhaW5lcik7XG4gICAgfVxuXG4gICAgdGhpcy5wcm90b24gPSBudWxsO1xuICAgIHRoaXMuY29udGFpbmVyID0gbnVsbDtcbiAgfVxufVxuIiwiLypcbiAqIEV2ZW50RGlzcGF0Y2hlclxuICogVGhpcyBjb2RlIHJlZmVyZW5jZSBzaW5jZSBodHRwOi8vY3JlYXRlanMuY29tLy5cbiAqXG4gKiovXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEV2ZW50RGlzcGF0Y2hlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX2xpc3RlbmVycyA9IG51bGw7XG4gIH1cblxuICBzdGF0aWMgYmluZCh0YXJnZXQpIHtcbiAgICB0YXJnZXQucHJvdG90eXBlLmRpc3BhdGNoRXZlbnQgPSBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlLmRpc3BhdGNoRXZlbnQ7XG4gICAgdGFyZ2V0LnByb3RvdHlwZS5oYXNFdmVudExpc3RlbmVyID0gRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZS5oYXNFdmVudExpc3RlbmVyO1xuICAgIHRhcmdldC5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lciA9IEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lcjtcbiAgICB0YXJnZXQucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXIgPSBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI7XG4gICAgdGFyZ2V0LnByb3RvdHlwZS5yZW1vdmVBbGxFdmVudExpc3RlbmVycyA9IEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUucmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnM7XG4gIH1cblxuICBhZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgaWYgKCF0aGlzLl9saXN0ZW5lcnMpIHtcbiAgICAgIHRoaXMuX2xpc3RlbmVycyA9IHt9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fbGlzdGVuZXJzW3R5cGVdKSB0aGlzLl9saXN0ZW5lcnNbdHlwZV0gPSBbXTtcbiAgICB0aGlzLl9saXN0ZW5lcnNbdHlwZV0ucHVzaChsaXN0ZW5lcik7XG5cbiAgICByZXR1cm4gbGlzdGVuZXI7XG4gIH1cblxuICByZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgaWYgKCF0aGlzLl9saXN0ZW5lcnMpIHJldHVybjtcbiAgICBpZiAoIXRoaXMuX2xpc3RlbmVyc1t0eXBlXSkgcmV0dXJuO1xuXG4gICAgY29uc3QgYXJyID0gdGhpcy5fbGlzdGVuZXJzW3R5cGVdO1xuICAgIGNvbnN0IGxlbmd0aCA9IGFyci5sZW5ndGg7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYXJyW2ldID09PSBsaXN0ZW5lcikge1xuICAgICAgICBpZiAobGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuX2xpc3RlbmVyc1t0eXBlXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFsbG93cyBmb3IgZmFzdGVyIGNoZWNrcy5cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgYXJyLnNwbGljZShpLCAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzKHR5cGUpIHtcbiAgICBpZiAoIXR5cGUpIHRoaXMuX2xpc3RlbmVycyA9IG51bGw7XG4gICAgZWxzZSBpZiAodGhpcy5fbGlzdGVuZXJzKSBkZWxldGUgdGhpcy5fbGlzdGVuZXJzW3R5cGVdO1xuICB9XG5cbiAgZGlzcGF0Y2hFdmVudCh0eXBlLCBhcmdzKSB7XG4gICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xuICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycztcblxuICAgIGlmICh0eXBlICYmIGxpc3RlbmVycykge1xuICAgICAgbGV0IGFyciA9IGxpc3RlbmVyc1t0eXBlXTtcbiAgICAgIGlmICghYXJyKSByZXR1cm4gcmVzdWx0O1xuXG4gICAgICAvLyBhcnIgPSBhcnIuc2xpY2UoKTtcbiAgICAgIC8vIHRvIGF2b2lkIGlzc3VlcyB3aXRoIGl0ZW1zIGJlaW5nIHJlbW92ZWQgb3IgYWRkZWQgZHVyaW5nIHRoZSBkaXNwYXRjaFxuXG4gICAgICBsZXQgaGFuZGxlcjtcbiAgICAgIGxldCBpID0gYXJyLmxlbmd0aDtcbiAgICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgaGFuZGxlciA9IGFycltpXTtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0IHx8IGhhbmRsZXIoYXJncyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuICEhcmVzdWx0O1xuICB9XG5cbiAgaGFzRXZlbnRMaXN0ZW5lcih0eXBlKSB7XG4gICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzO1xuICAgIHJldHVybiAhIShsaXN0ZW5lcnMgJiYgbGlzdGVuZXJzW3R5cGVdKTtcbiAgfVxufVxuIiwiY29uc3QgUEkgPSAzLjE0MTU5MjY7XG5jb25zdCBJTkZJTklUWSA9IEluZmluaXR5O1xuXG5jb25zdCBNYXRoVXRpbCA9IHtcbiAgUEk6IFBJLFxuICBQSXgyOiBQSSAqIDIsXG4gIFBJXzI6IFBJIC8gMixcbiAgUElfMTgwOiBQSSAvIDE4MCxcbiAgTjE4MF9QSTogMTgwIC8gUEksXG4gIEluZmluaXR5OiAtOTk5LFxuXG4gIGlzSW5maW5pdHkobnVtKSB7XG4gICAgcmV0dXJuIG51bSA9PT0gdGhpcy5JbmZpbml0eSB8fCBudW0gPT09IElORklOSVRZO1xuICB9LFxuXG4gIHJhbmRvbUFUb0IoYSwgYiwgaXNJbnQgPSBmYWxzZSkge1xuICAgIGlmICghaXNJbnQpIHJldHVybiBhICsgTWF0aC5yYW5kb20oKSAqIChiIC0gYSk7XG4gICAgZWxzZSByZXR1cm4gKChNYXRoLnJhbmRvbSgpICogKGIgLSBhKSkgPj4gMCkgKyBhO1xuICB9LFxuXG4gIHJhbmRvbUZsb2F0aW5nKGNlbnRlciwgZiwgaXNJbnQpIHtcbiAgICByZXR1cm4gdGhpcy5yYW5kb21BVG9CKGNlbnRlciAtIGYsIGNlbnRlciArIGYsIGlzSW50KTtcbiAgfSxcblxuICByYW5kb21Db2xvcigpIHtcbiAgICByZXR1cm4gXCIjXCIgKyAoXCIwMDAwMFwiICsgKChNYXRoLnJhbmRvbSgpICogMHgxMDAwMDAwKSA8PCAwKS50b1N0cmluZygxNikpLnNsaWNlKC02KTtcbiAgfSxcblxuICByYW5kb21ab25lKGRpc3BsYXkpIHt9LFxuXG4gIGZsb29yKG51bSwgayA9IDQpIHtcbiAgICBjb25zdCBkaWdpdHMgPSBNYXRoLnBvdygxMCwgayk7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IobnVtICogZGlnaXRzKSAvIGRpZ2l0cztcbiAgfSxcblxuICBkZWdyZWVUcmFuc2Zvcm0oYSkge1xuICAgIHJldHVybiAoYSAqIFBJKSAvIDE4MDtcbiAgfSxcblxuICB0b0NvbG9yMTYobnVtKSB7XG4gICAgcmV0dXJuIGAjJHtudW0udG9TdHJpbmcoMTYpfWA7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IE1hdGhVdGlsO1xuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW50ZWdyYXRpb24ge1xuICBjb25zdHJ1Y3Rvcih0eXBlKSB7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgfVxuXG4gIGNhbGN1bGF0ZShwYXJ0aWNsZXMsIHRpbWUsIGRhbXBpbmcpIHtcbiAgICB0aGlzLmV1bGVySW50ZWdyYXRlKHBhcnRpY2xlcywgdGltZSwgZGFtcGluZyk7XG4gIH1cblxuICAvLyBFdWxlciBJbnRlZ3JhdGVcbiAgLy8gaHR0cHM6Ly9yb3NldHRhY29kZS5vcmcvd2lraS9FdWxlcl9tZXRob2RcbiAgZXVsZXJJbnRlZ3JhdGUocGFydGljbGUsIHRpbWUsIGRhbXBpbmcpIHtcbiAgICBpZiAoIXBhcnRpY2xlLnNsZWVwKSB7XG4gICAgICBwYXJ0aWNsZS5vbGQucC5jb3B5KHBhcnRpY2xlLnApO1xuICAgICAgcGFydGljbGUub2xkLnYuY29weShwYXJ0aWNsZS52KTtcblxuICAgICAgcGFydGljbGUuYS5tdWx0aXBseVNjYWxhcigxIC8gcGFydGljbGUubWFzcyk7XG4gICAgICBwYXJ0aWNsZS52LmFkZChwYXJ0aWNsZS5hLm11bHRpcGx5U2NhbGFyKHRpbWUpKTtcbiAgICAgIHBhcnRpY2xlLnAuYWRkKHBhcnRpY2xlLm9sZC52Lm11bHRpcGx5U2NhbGFyKHRpbWUpKTtcblxuICAgICAgaWYgKGRhbXBpbmcpIHBhcnRpY2xlLnYubXVsdGlwbHlTY2FsYXIoZGFtcGluZyk7XG5cbiAgICAgIHBhcnRpY2xlLmEuY2xlYXIoKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBQb29sIGZyb20gXCIuL1Bvb2xcIjtcbmltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgU3RhdHMgZnJvbSBcIi4uL2RlYnVnL1N0YXRzXCI7XG5pbXBvcnQgRXZlbnREaXNwYXRjaGVyIGZyb20gXCIuLi9ldmVudHMvRXZlbnREaXNwYXRjaGVyXCI7XG5pbXBvcnQgTWF0aFV0aWwgZnJvbSBcIi4uL21hdGgvTWF0aFV0aWxcIjtcbmltcG9ydCBJbnRlZ3JhdGlvbiBmcm9tIFwiLi4vbWF0aC9JbnRlZ3JhdGlvblwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQcm90b24ge1xuICBzdGF0aWMgVVNFX0NMT0NLID0gZmFsc2U7XG5cbiAgLy8gbWVhc3VyZSAxOjEwMFxuICBzdGF0aWMgTUVBU1VSRSA9IDEwMDtcbiAgc3RhdGljIEVVTEVSID0gXCJldWxlclwiO1xuICBzdGF0aWMgUksyID0gXCJydW5nZS1rdXR0YTJcIjtcblxuICAvLyBldmVudCBuYW1lXG4gIHN0YXRpYyBQQVJUSUNMRV9DUkVBVEVEID0gXCJQQVJUSUNMRV9DUkVBVEVEXCI7XG4gIHN0YXRpYyBQQVJUSUNMRV9VUERBVEUgPSBcIlBBUlRJQ0xFX1VQREFURVwiO1xuICBzdGF0aWMgUEFSVElDTEVfU0xFRVAgPSBcIlBBUlRJQ0xFX1NMRUVQXCI7XG4gIHN0YXRpYyBQQVJUSUNMRV9ERUFEID0gXCJQQVJUSUNMRV9ERUFEXCI7XG5cbiAgc3RhdGljIEVNSVRURVJfQURERUQgPSBcIkVNSVRURVJfQURERURcIjtcbiAgc3RhdGljIEVNSVRURVJfUkVNT1ZFRCA9IFwiRU1JVFRFUl9SRU1PVkVEXCI7XG5cbiAgc3RhdGljIFBST1RPTl9VUERBVEUgPSBcIlBST1RPTl9VUERBVEVcIjtcbiAgc3RhdGljIFBST1RPTl9VUERBVEVfQUZURVIgPSBcIlBST1RPTl9VUERBVEVfQUZURVJcIjtcbiAgc3RhdGljIERFRkFVTFRfSU5URVJWQUwgPSAwLjAxNjc7XG5cbiAgc3RhdGljIGFtZW5kQ2hhbmdlVGFic0J1ZyA9IHRydWU7XG5cbiAgLyoqXG4gICAqIFRoZSBjb25zdHJ1Y3RvciB0byBhZGQgZW1pdHRlcnNcbiAgICpcbiAgICogQGNvbnN0cnVjdG9yIFByb3RvblxuICAgKlxuICAgKiBAdG9kbyBwcm9QYXJ0aWNsZUNvdW50IGlzIG5vdCBpbiB1c2VcbiAgICogQHRvZG8gYWRkIG1vcmUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgc2luZ2xlIHByb3BlcnRpZXMgYW5kIHBhcmFtZXRlcnNcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtwcm9QYXJ0aWNsZUNvdW50XSBub3QgaW4gdXNlP1xuICAgKiBAcGFyYW0ge051bWJlcn0gW2ludGVncmF0aW9uVHlwZT1Qcm90b24uRVVMRVJdXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbaW50ZWdyYXRpb25UeXBlPVByb3Rvbi5FVUxFUl1cbiAgICogQHByb3BlcnR5IHtBcnJheX0gZW1pdHRlcnMgICBBbGwgYWRkZWQgZW1pdHRlclxuICAgKiBAcHJvcGVydHkge0FycmF5fSByZW5kZXJlcnMgIEFsbCBhZGRlZCByZW5kZXJlclxuICAgKiBAcHJvcGVydHkge051bWJlcn0gdGltZSAgICAgIFRoZSBhY3RpdmUgdGltZVxuICAgKiBAcHJvcGVydHkge051bWJlcn0gb2xkdGltZSAgIFRoZSBvbGQgdGltZVxuICAgKi9cbiAgY29uc3RydWN0b3IoaW50ZWdyYXRpb25UeXBlKSB7XG4gICAgdGhpcy5lbWl0dGVycyA9IFtdO1xuICAgIHRoaXMucmVuZGVyZXJzID0gW107XG5cbiAgICB0aGlzLnRpbWUgPSAwO1xuICAgIHRoaXMubm93ID0gMDtcbiAgICB0aGlzLnRoZW4gPSAwO1xuICAgIHRoaXMuZWxhcHNlZCA9IDA7XG5cbiAgICB0aGlzLnN0YXRzID0gbmV3IFN0YXRzKHRoaXMpO1xuICAgIHRoaXMucG9vbCA9IG5ldyBQb29sKDgwKTtcblxuICAgIHRoaXMuaW50ZWdyYXRpb25UeXBlID0gVXRpbC5pbml0VmFsdWUoaW50ZWdyYXRpb25UeXBlLCBQcm90b24uRVVMRVIpO1xuICAgIHRoaXMuaW50ZWdyYXRvciA9IG5ldyBJbnRlZ3JhdGlvbih0aGlzLmludGVncmF0aW9uVHlwZSk7XG5cbiAgICB0aGlzLl9mcHMgPSBcImF1dG9cIjtcbiAgICB0aGlzLl9pbnRlcnZhbCA9IFByb3Rvbi5ERUZBVUxUX0lOVEVSVkFMO1xuICB9XG5cbiAgc2V0IGZwcyhmcHMpIHtcbiAgICB0aGlzLl9mcHMgPSBmcHM7XG4gICAgdGhpcy5faW50ZXJ2YWwgPSBmcHMgPT09IFwiYXV0b1wiID8gUHJvdG9uLkRFRkFVTFRfSU5URVJWQUwgOiBNYXRoVXRpbC5mbG9vcigxIC8gZnBzLCA3KTtcbiAgfVxuXG4gIGdldCBmcHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZwcztcbiAgfVxuXG4gIC8qKlxuICAgKiBhZGQgYSB0eXBlIG9mIFJlbmRlcmVyXG4gICAqXG4gICAqIEBtZXRob2QgYWRkUmVuZGVyZXJcbiAgICogQG1lbWJlcm9mIFByb3RvblxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtSZW5kZXJlcn0gcmVuZGVyXG4gICAqL1xuICBhZGRSZW5kZXJlcihyZW5kZXIpIHtcbiAgICByZW5kZXIuaW5pdCh0aGlzKTtcbiAgICB0aGlzLnJlbmRlcmVycy5wdXNoKHJlbmRlcik7XG4gIH1cblxuICAvKipcbiAgICogQG5hbWUgYWRkIGEgdHlwZSBvZiBSZW5kZXJlclxuICAgKlxuICAgKiBAbWV0aG9kIGFkZFJlbmRlcmVyXG4gICAqIEBwYXJhbSB7UmVuZGVyZXJ9IHJlbmRlclxuICAgKi9cbiAgcmVtb3ZlUmVuZGVyZXIocmVuZGVyKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnJlbmRlcmVycy5pbmRleE9mKHJlbmRlcik7XG4gICAgdGhpcy5yZW5kZXJlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICByZW5kZXIucmVtb3ZlKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIGFkZCB0aGUgRW1pdHRlclxuICAgKlxuICAgKiBAbWV0aG9kIGFkZEVtaXR0ZXJcbiAgICogQG1lbWJlcm9mIFByb3RvblxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtFbWl0dGVyfSBlbWl0dGVyXG4gICAqL1xuICBhZGRFbWl0dGVyKGVtaXR0ZXIpIHtcbiAgICB0aGlzLmVtaXR0ZXJzLnB1c2goZW1pdHRlcik7XG4gICAgZW1pdHRlci5wYXJlbnQgPSB0aGlzO1xuXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFByb3Rvbi5FTUlUVEVSX0FEREVELCBlbWl0dGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIEVtaXR0ZXJcbiAgICpcbiAgICogQG1ldGhvZCByZW1vdmVFbWl0dGVyXG4gICAqIEBtZW1iZXJvZiBQcm90b25cbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLkVtaXR0ZXJ9IGVtaXR0ZXJcbiAgICovXG4gIHJlbW92ZUVtaXR0ZXIoZW1pdHRlcikge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5lbWl0dGVycy5pbmRleE9mKGVtaXR0ZXIpO1xuICAgIHRoaXMuZW1pdHRlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBlbWl0dGVyLnBhcmVudCA9IG51bGw7XG5cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoUHJvdG9uLkVNSVRURVJfUkVNT1ZFRCwgZW1pdHRlcik7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyBhbGwgYWRkZWQgZW1pdHRlcnNcbiAgICpcbiAgICogQG1ldGhvZCB1cGRhdGVcbiAgICogQG1lbWJlcm9mIFByb3RvblxuICAgKiBAaW5zdGFuY2VcbiAgICovXG4gIHVwZGF0ZSgpIHtcbiAgICAvLyAnYXV0bycgaXMgdGhlIGRlZmF1bHQgYnJvd3NlciByZWZyZXNoIHJhdGUsIHRoZSB2YXN0IG1ham9yaXR5IGlzIDYwZnBzXG4gICAgaWYgKHRoaXMuX2ZwcyA9PT0gXCJhdXRvXCIpIHtcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChQcm90b24uUFJPVE9OX1VQREFURSk7XG5cbiAgICAgIGlmIChQcm90b24uVVNFX0NMT0NLKSB7XG4gICAgICAgIGlmICghdGhpcy50aGVuKSB0aGlzLnRoZW4gPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgdGhpcy5ub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgdGhpcy5lbGFwc2VkID0gKHRoaXMubm93IC0gdGhpcy50aGVuKSAqIDAuMDAxO1xuICAgICAgICAvLyBGaXggYnVncyBzdWNoIGFzIGNocm9tZSBicm93c2VyIHN3aXRjaGluZyB0YWJzIGNhdXNpbmcgZXhjZXNzaXZlIHRpbWUgZGlmZmVyZW5jZVxuICAgICAgICB0aGlzLmFtZW5kQ2hhbmdlVGFic0J1ZygpO1xuXG4gICAgICAgIGlmICh0aGlzLmVsYXBzZWQgPiAwKSB0aGlzLmVtaXR0ZXJzVXBkYXRlKHRoaXMuZWxhcHNlZCk7XG4gICAgICAgIHRoaXMudGhlbiA9IHRoaXMubm93O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lbWl0dGVyc1VwZGF0ZShQcm90b24uREVGQVVMVF9JTlRFUlZBTCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChQcm90b24uUFJPVE9OX1VQREFURV9BRlRFUik7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGZwcyBmcmFtZSByYXRlIGlzIHNldFxuICAgIGVsc2Uge1xuICAgICAgaWYgKCF0aGlzLnRoZW4pIHRoaXMudGhlbiA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgdGhpcy5ub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgIHRoaXMuZWxhcHNlZCA9ICh0aGlzLm5vdyAtIHRoaXMudGhlbikgKiAwLjAwMTtcblxuICAgICAgaWYgKHRoaXMuZWxhcHNlZCA+IHRoaXMuX2ludGVydmFsKSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChQcm90b24uUFJPVE9OX1VQREFURSk7XG4gICAgICAgIHRoaXMuZW1pdHRlcnNVcGRhdGUodGhpcy5faW50ZXJ2YWwpO1xuICAgICAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xOTc2NDAxOC9jb250cm9sbGluZy1mcHMtd2l0aC1yZXF1ZXN0YW5pbWF0aW9uZnJhbWVcbiAgICAgICAgdGhpcy50aGVuID0gdGhpcy5ub3cgLSAodGhpcy5lbGFwc2VkICUgdGhpcy5faW50ZXJ2YWwpICogMTAwMDtcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFByb3Rvbi5QUk9UT05fVVBEQVRFX0FGVEVSKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBlbWl0dGVyc1VwZGF0ZShlbGFwc2VkKSB7XG4gICAgbGV0IGkgPSB0aGlzLmVtaXR0ZXJzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB0aGlzLmVtaXR0ZXJzW2ldLnVwZGF0ZShlbGFwc2VkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb25cbiAgICpcbiAgICogQG1ldGhvZCBhbWVuZENoYW5nZVRhYnNCdWdcbiAgICogQG1lbWJlcm9mIFByb3RvblxuICAgKiBAaW5zdGFuY2VcbiAgICovXG4gIGFtZW5kQ2hhbmdlVGFic0J1ZygpIHtcbiAgICBpZiAoIVByb3Rvbi5hbWVuZENoYW5nZVRhYnNCdWcpIHJldHVybjtcbiAgICBpZiAodGhpcy5lbGFwc2VkID4gMC41KSB7XG4gICAgICB0aGlzLnRoZW4gPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgIHRoaXMuZWxhcHNlZCA9IDA7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvdW50cyBhbGwgcGFydGljbGVzIGZyb20gYWxsIGVtaXR0ZXJzXG4gICAqXG4gICAqIEBtZXRob2QgZ2V0Q291bnRcbiAgICogQG1lbWJlcm9mIFByb3RvblxuICAgKiBAaW5zdGFuY2VcbiAgICovXG4gIGdldENvdW50KCkge1xuICAgIGxldCB0b3RhbCA9IDA7XG4gICAgbGV0IGkgPSB0aGlzLmVtaXR0ZXJzLmxlbmd0aDtcblxuICAgIHdoaWxlIChpLS0pIHRvdGFsICs9IHRoaXMuZW1pdHRlcnNbaV0ucGFydGljbGVzLmxlbmd0aDtcbiAgICByZXR1cm4gdG90YWw7XG4gIH1cblxuICBnZXRBbGxQYXJ0aWNsZXMoKSB7XG4gICAgbGV0IHBhcnRpY2xlcyA9IFtdO1xuICAgIGxldCBpID0gdGhpcy5lbWl0dGVycy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoaS0tKSBwYXJ0aWNsZXMgPSBwYXJ0aWNsZXMuY29uY2F0KHRoaXMuZW1pdHRlcnNbaV0ucGFydGljbGVzKTtcbiAgICByZXR1cm4gcGFydGljbGVzO1xuICB9XG5cbiAgZGVzdHJveUFsbEVtaXR0ZXJzKCkge1xuICAgIFV0aWwuZGVzdHJveUFsbCh0aGlzLmVtaXR0ZXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95cyBldmVyeXRoaW5nIHJlbGF0ZWQgdG8gdGhpcyBQcm90b24gaW5zdGFuY2UuIFRoaXMgaW5jbHVkZXMgYWxsIGVtaXR0ZXJzLCBhbmQgYWxsIHByb3BlcnRpZXNcbiAgICpcbiAgICogQG1ldGhvZCBkZXN0cm95XG4gICAqIEBtZW1iZXJvZiBQcm90b25cbiAgICogQGluc3RhbmNlXG4gICAqL1xuICBkZXN0cm95KHJlbW92ZSA9IGZhbHNlKSB7XG4gICAgY29uc3QgZGVzdHJveU90aGVyID0gKCkgPT4ge1xuICAgICAgdGhpcy50aW1lID0gMDtcbiAgICAgIHRoaXMudGhlbiA9IDA7XG4gICAgICB0aGlzLnBvb2wuZGVzdHJveSgpO1xuICAgICAgdGhpcy5zdGF0cy5kZXN0cm95KCk7XG5cbiAgICAgIFV0aWwuZGVzdHJveUFsbCh0aGlzLmVtaXR0ZXJzKTtcbiAgICAgIFV0aWwuZGVzdHJveUFsbCh0aGlzLnJlbmRlcmVycywgdGhpcy5nZXRBbGxQYXJ0aWNsZXMoKSk7XG5cbiAgICAgIHRoaXMuaW50ZWdyYXRvciA9IG51bGw7XG4gICAgICB0aGlzLnJlbmRlcmVycyA9IG51bGw7XG4gICAgICB0aGlzLmVtaXR0ZXJzID0gbnVsbDtcbiAgICAgIHRoaXMuc3RhdHMgPSBudWxsO1xuICAgICAgdGhpcy5wb29sID0gbnVsbDtcbiAgICB9O1xuXG4gICAgaWYgKHJlbW92ZSkge1xuICAgICAgc2V0VGltZW91dChkZXN0cm95T3RoZXIsIDIwMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlc3Ryb3lPdGhlcigpO1xuICAgIH1cbiAgfVxufVxuXG5FdmVudERpc3BhdGNoZXIuYmluZChQcm90b24pO1xuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmdiIHtcbiAgY29uc3RydWN0b3IociA9IDI1NSwgZyA9IDI1NSwgYiA9IDI1NSkge1xuICAgIHRoaXMuciA9IHI7XG4gICAgdGhpcy5nID0gZztcbiAgICB0aGlzLmIgPSBiO1xuICB9XG5cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5yID0gMjU1O1xuICAgIHRoaXMuZyA9IDI1NTtcbiAgICB0aGlzLmIgPSAyNTU7XG4gIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IHtcbiAgaGFzUHJvcCh0YXJnZXQsIGtleSkge1xuICAgIGlmICghdGFyZ2V0KSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRhcmdldFtrZXldICE9PSB1bmRlZmluZWQ7XG4gICAgLy8gcmV0dXJuIG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBzZXQgdGhlIHByb3RvdHlwZSBpbiBhIGdpdmVuIHByb3RvdHlwZU9iamVjdFxuICAgKlxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5VdGlsXG4gICAqIEBtZXRob2Qgc2V0UHJvcFxuICAgKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb24gZm9yIHBhcmFtIGB0YXJnZXRgXG4gICAqIEB0b2RvIHRyYW5zbGF0ZSBkZXNyaXB0aW9uIGZyb20gY2hpbmVzZSB0byBlbmdsaXNoXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXRcbiAgICogQHBhcmFtIHtPYmplY3R9IHByb3RvdHlwZU9iamVjdCBBbiBvYmplY3Qgb2Ygc2luZ2xlIHByb3RvdHlwZXNcbiAgICpcbiAgICogQHJldHVybiB7T2JqZWN0fSB0YXJnZXRcbiAgICovXG4gIHNldFByb3AodGFyZ2V0LCBwcm9wcykge1xuICAgIGZvciAobGV0IHByb3AgaW4gcHJvcHMpIHtcbiAgICAgIGlmICh0YXJnZXQuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgdGFyZ2V0W3Byb3BdID0gU3Bhbi5nZXRTcGFuVmFsdWUocHJvcHNbcHJvcF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlV0aWxcbiAgICogQG1ldGhvZCBzZXRWZWN0b3JWYWxcbiAgICpcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uIGZvciBwYXJhbSBgdGFyZ2V0YFxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb24gZm9yIHBhcmFtIGBjb25mYFxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb24gZm9yIGZ1bmN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXRcbiAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZcbiAgICovXG4gIHNldFZlY3RvclZhbChwYXJ0aWNsZSwgY29uZiA9IG51bGwpIHtcbiAgICBpZiAoIWNvbmYpIHJldHVybjtcblxuICAgIGlmICh0aGlzLmhhc1Byb3AoY29uZiwgXCJ4XCIpKSBwYXJ0aWNsZS5wLnggPSBjb25mW1wieFwiXTtcbiAgICBpZiAodGhpcy5oYXNQcm9wKGNvbmYsIFwieVwiKSkgcGFydGljbGUucC55ID0gY29uZltcInlcIl07XG5cbiAgICBpZiAodGhpcy5oYXNQcm9wKGNvbmYsIFwidnhcIikpIHBhcnRpY2xlLnYueCA9IGNvbmZbXCJ2eFwiXTtcbiAgICBpZiAodGhpcy5oYXNQcm9wKGNvbmYsIFwidnlcIikpIHBhcnRpY2xlLnYueSA9IGNvbmZbXCJ2eVwiXTtcblxuICAgIGlmICh0aGlzLmhhc1Byb3AoY29uZiwgXCJheFwiKSkgcGFydGljbGUuYS54ID0gY29uZltcImF4XCJdO1xuICAgIGlmICh0aGlzLmhhc1Byb3AoY29uZiwgXCJheVwiKSkgcGFydGljbGUuYS55ID0gY29uZltcImF5XCJdO1xuXG4gICAgaWYgKHRoaXMuaGFzUHJvcChjb25mLCBcInBcIikpIHBhcnRpY2xlLnAuY29weShjb25mW1wicFwiXSk7XG4gICAgaWYgKHRoaXMuaGFzUHJvcChjb25mLCBcInZcIikpIHBhcnRpY2xlLnYuY29weShjb25mW1widlwiXSk7XG4gICAgaWYgKHRoaXMuaGFzUHJvcChjb25mLCBcImFcIikpIHBhcnRpY2xlLmEuY29weShjb25mW1wiYVwiXSk7XG5cbiAgICBpZiAodGhpcy5oYXNQcm9wKGNvbmYsIFwicG9zaXRpb25cIikpIHBhcnRpY2xlLnAuY29weShjb25mW1wicG9zaXRpb25cIl0pO1xuICAgIGlmICh0aGlzLmhhc1Byb3AoY29uZiwgXCJ2ZWxvY2l0eVwiKSkgcGFydGljbGUudi5jb3B5KGNvbmZbXCJ2ZWxvY2l0eVwiXSk7XG4gICAgaWYgKHRoaXMuaGFzUHJvcChjb25mLCBcImFjY2VsZXJhdGVcIikpIHBhcnRpY2xlLmEuY29weShjb25mW1wiYWNjZWxlcmF0ZVwiXSk7XG4gIH1cbn07XG4iLCJpbXBvcnQgTWF0aFV0aWwgZnJvbSBcIi4vTWF0aFV0aWxcIjtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBlYXNlTGluZWFyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9LFxuXG4gIGVhc2VJblF1YWQodmFsdWUpIHtcbiAgICByZXR1cm4gTWF0aC5wb3codmFsdWUsIDIpO1xuICB9LFxuXG4gIGVhc2VPdXRRdWFkKHZhbHVlKSB7XG4gICAgcmV0dXJuIC0oTWF0aC5wb3codmFsdWUgLSAxLCAyKSAtIDEpO1xuICB9LFxuXG4gIGVhc2VJbk91dFF1YWQodmFsdWUpIHtcbiAgICBpZiAoKHZhbHVlIC89IDAuNSkgPCAxKSByZXR1cm4gMC41ICogTWF0aC5wb3codmFsdWUsIDIpO1xuXG4gICAgcmV0dXJuIC0wLjUgKiAoKHZhbHVlIC09IDIpICogdmFsdWUgLSAyKTtcbiAgfSxcblxuICBlYXNlSW5DdWJpYyh2YWx1ZSkge1xuICAgIHJldHVybiBNYXRoLnBvdyh2YWx1ZSwgMyk7XG4gIH0sXG5cbiAgZWFzZU91dEN1YmljKHZhbHVlKSB7XG4gICAgcmV0dXJuIE1hdGgucG93KHZhbHVlIC0gMSwgMykgKyAxO1xuICB9LFxuXG4gIGVhc2VJbk91dEN1YmljKHZhbHVlKSB7XG4gICAgaWYgKCh2YWx1ZSAvPSAwLjUpIDwgMSkgcmV0dXJuIDAuNSAqIE1hdGgucG93KHZhbHVlLCAzKTtcblxuICAgIHJldHVybiAwLjUgKiAoTWF0aC5wb3codmFsdWUgLSAyLCAzKSArIDIpO1xuICB9LFxuXG4gIGVhc2VJblF1YXJ0KHZhbHVlKSB7XG4gICAgcmV0dXJuIE1hdGgucG93KHZhbHVlLCA0KTtcbiAgfSxcblxuICBlYXNlT3V0UXVhcnQodmFsdWUpIHtcbiAgICByZXR1cm4gLShNYXRoLnBvdyh2YWx1ZSAtIDEsIDQpIC0gMSk7XG4gIH0sXG5cbiAgZWFzZUluT3V0UXVhcnQodmFsdWUpIHtcbiAgICBpZiAoKHZhbHVlIC89IDAuNSkgPCAxKSByZXR1cm4gMC41ICogTWF0aC5wb3codmFsdWUsIDQpO1xuXG4gICAgcmV0dXJuIC0wLjUgKiAoKHZhbHVlIC09IDIpICogTWF0aC5wb3codmFsdWUsIDMpIC0gMik7XG4gIH0sXG5cbiAgZWFzZUluU2luZSh2YWx1ZSkge1xuICAgIHJldHVybiAtTWF0aC5jb3ModmFsdWUgKiBNYXRoVXRpbC5QSV8yKSArIDE7XG4gIH0sXG5cbiAgZWFzZU91dFNpbmUodmFsdWUpIHtcbiAgICByZXR1cm4gTWF0aC5zaW4odmFsdWUgKiBNYXRoVXRpbC5QSV8yKTtcbiAgfSxcblxuICBlYXNlSW5PdXRTaW5lKHZhbHVlKSB7XG4gICAgcmV0dXJuIC0wLjUgKiAoTWF0aC5jb3MoTWF0aC5QSSAqIHZhbHVlKSAtIDEpO1xuICB9LFxuXG4gIGVhc2VJbkV4cG8odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyAwIDogTWF0aC5wb3coMiwgMTAgKiAodmFsdWUgLSAxKSk7XG4gIH0sXG5cbiAgZWFzZU91dEV4cG8odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDEgPyAxIDogLU1hdGgucG93KDIsIC0xMCAqIHZhbHVlKSArIDE7XG4gIH0sXG5cbiAgZWFzZUluT3V0RXhwbyh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gMCkgcmV0dXJuIDA7XG5cbiAgICBpZiAodmFsdWUgPT09IDEpIHJldHVybiAxO1xuXG4gICAgaWYgKCh2YWx1ZSAvPSAwLjUpIDwgMSkgcmV0dXJuIDAuNSAqIE1hdGgucG93KDIsIDEwICogKHZhbHVlIC0gMSkpO1xuXG4gICAgcmV0dXJuIDAuNSAqICgtTWF0aC5wb3coMiwgLTEwICogLS12YWx1ZSkgKyAyKTtcbiAgfSxcblxuICBlYXNlSW5DaXJjKHZhbHVlKSB7XG4gICAgcmV0dXJuIC0oTWF0aC5zcXJ0KDEgLSB2YWx1ZSAqIHZhbHVlKSAtIDEpO1xuICB9LFxuXG4gIGVhc2VPdXRDaXJjKHZhbHVlKSB7XG4gICAgcmV0dXJuIE1hdGguc3FydCgxIC0gTWF0aC5wb3codmFsdWUgLSAxLCAyKSk7XG4gIH0sXG5cbiAgZWFzZUluT3V0Q2lyYyh2YWx1ZSkge1xuICAgIGlmICgodmFsdWUgLz0gMC41KSA8IDEpIHJldHVybiAtMC41ICogKE1hdGguc3FydCgxIC0gdmFsdWUgKiB2YWx1ZSkgLSAxKTtcbiAgICByZXR1cm4gMC41ICogKE1hdGguc3FydCgxIC0gKHZhbHVlIC09IDIpICogdmFsdWUpICsgMSk7XG4gIH0sXG5cbiAgZWFzZUluQmFjayh2YWx1ZSkge1xuICAgIGxldCBzID0gMS43MDE1ODtcbiAgICByZXR1cm4gdmFsdWUgKiB2YWx1ZSAqICgocyArIDEpICogdmFsdWUgLSBzKTtcbiAgfSxcblxuICBlYXNlT3V0QmFjayh2YWx1ZSkge1xuICAgIGxldCBzID0gMS43MDE1ODtcbiAgICByZXR1cm4gKHZhbHVlID0gdmFsdWUgLSAxKSAqIHZhbHVlICogKChzICsgMSkgKiB2YWx1ZSArIHMpICsgMTtcbiAgfSxcblxuICBlYXNlSW5PdXRCYWNrKHZhbHVlKSB7XG4gICAgbGV0IHMgPSAxLjcwMTU4O1xuICAgIGlmICgodmFsdWUgLz0gMC41KSA8IDEpIHJldHVybiAwLjUgKiAodmFsdWUgKiB2YWx1ZSAqICgoKHMgKj0gMS41MjUpICsgMSkgKiB2YWx1ZSAtIHMpKTtcbiAgICByZXR1cm4gMC41ICogKCh2YWx1ZSAtPSAyKSAqIHZhbHVlICogKCgocyAqPSAxLjUyNSkgKyAxKSAqIHZhbHVlICsgcykgKyAyKTtcbiAgfSxcblxuICBnZXRFYXNpbmcoZWFzZSkge1xuICAgIGlmICh0eXBlb2YgZWFzZSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gZWFzZTtcbiAgICBlbHNlIHJldHVybiB0aGlzW2Vhc2VdIHx8IHRoaXMuZWFzZUxpbmVhcjtcbiAgfVxufTtcbiIsImltcG9ydCBNYXRoVXRpbCBmcm9tIFwiLi4vbWF0aC9NYXRoVXRpbFwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWN0b3IyRCB7XG4gIGNvbnN0cnVjdG9yKHgsIHkpIHtcbiAgICB0aGlzLnggPSB4IHx8IDA7XG4gICAgdGhpcy55ID0geSB8fCAwO1xuICB9XG5cbiAgc2V0KHgsIHkpIHtcbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRYKHgpIHtcbiAgICB0aGlzLnggPSB4O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0WSh5KSB7XG4gICAgdGhpcy55ID0geTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGdldEdyYWRpZW50KCkge1xuICAgIGlmICh0aGlzLnggIT09IDApIHJldHVybiBNYXRoLmF0YW4yKHRoaXMueSwgdGhpcy54KTtcbiAgICBlbHNlIGlmICh0aGlzLnkgPiAwKSByZXR1cm4gTWF0aFV0aWwuUElfMjtcbiAgICBlbHNlIGlmICh0aGlzLnkgPCAwKSByZXR1cm4gLU1hdGhVdGlsLlBJXzI7XG4gIH1cblxuICBjb3B5KHYpIHtcbiAgICB0aGlzLnggPSB2Lng7XG4gICAgdGhpcy55ID0gdi55O1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGQodiwgdykge1xuICAgIGlmICh3ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmFkZFZlY3RvcnModiwgdyk7XG4gICAgfVxuXG4gICAgdGhpcy54ICs9IHYueDtcbiAgICB0aGlzLnkgKz0gdi55O1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRYWShhLCBiKSB7XG4gICAgdGhpcy54ICs9IGE7XG4gICAgdGhpcy55ICs9IGI7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZFZlY3RvcnMoYSwgYikge1xuICAgIHRoaXMueCA9IGEueCArIGIueDtcbiAgICB0aGlzLnkgPSBhLnkgKyBiLnk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHN1Yih2LCB3KSB7XG4gICAgaWYgKHcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuc3ViVmVjdG9ycyh2LCB3KTtcbiAgICB9XG5cbiAgICB0aGlzLnggLT0gdi54O1xuICAgIHRoaXMueSAtPSB2Lnk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHN1YlZlY3RvcnMoYSwgYikge1xuICAgIHRoaXMueCA9IGEueCAtIGIueDtcbiAgICB0aGlzLnkgPSBhLnkgLSBiLnk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGRpdmlkZVNjYWxhcihzKSB7XG4gICAgaWYgKHMgIT09IDApIHtcbiAgICAgIHRoaXMueCAvPSBzO1xuICAgICAgdGhpcy55IC89IHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0KDAsIDApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbXVsdGlwbHlTY2FsYXIocykge1xuICAgIHRoaXMueCAqPSBzO1xuICAgIHRoaXMueSAqPSBzO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBuZWdhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoLTEpO1xuICB9XG5cbiAgZG90KHYpIHtcbiAgICByZXR1cm4gdGhpcy54ICogdi54ICsgdGhpcy55ICogdi55O1xuICB9XG5cbiAgbGVuZ3RoU3EoKSB7XG4gICAgcmV0dXJuIHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueTtcbiAgfVxuXG4gIGxlbmd0aCgpIHtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSk7XG4gIH1cblxuICBub3JtYWxpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCkpO1xuICB9XG5cbiAgZGlzdGFuY2VUbyh2KSB7XG4gICAgcmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RhbmNlVG9TcXVhcmVkKHYpKTtcbiAgfVxuXG4gIHJvdGF0ZSh0aGEpIHtcbiAgICBjb25zdCB4ID0gdGhpcy54O1xuICAgIGNvbnN0IHkgPSB0aGlzLnk7XG5cbiAgICB0aGlzLnggPSB4ICogTWF0aC5jb3ModGhhKSArIHkgKiBNYXRoLnNpbih0aGEpO1xuICAgIHRoaXMueSA9IC14ICogTWF0aC5zaW4odGhhKSArIHkgKiBNYXRoLmNvcyh0aGEpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBkaXN0YW5jZVRvU3F1YXJlZCh2KSB7XG4gICAgY29uc3QgZHggPSB0aGlzLnggLSB2Lng7XG4gICAgY29uc3QgZHkgPSB0aGlzLnkgLSB2Lnk7XG5cbiAgICByZXR1cm4gZHggKiBkeCArIGR5ICogZHk7XG4gIH1cblxuICBsZXJwKHYsIGFscGhhKSB7XG4gICAgdGhpcy54ICs9ICh2LnggLSB0aGlzLngpICogYWxwaGE7XG4gICAgdGhpcy55ICs9ICh2LnkgLSB0aGlzLnkpICogYWxwaGE7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGVxdWFscyh2KSB7XG4gICAgcmV0dXJuIHYueCA9PT0gdGhpcy54ICYmIHYueSA9PT0gdGhpcy55O1xuICB9XG5cbiAgY2xlYXIoKSB7XG4gICAgdGhpcy54ID0gMC4wO1xuICAgIHRoaXMueSA9IDAuMDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGNsb25lKCkge1xuICAgIHJldHVybiBuZXcgVmVjdG9yMkQodGhpcy54LCB0aGlzLnkpO1xuICB9XG59XG4iLCIvKiogQHR5cGVkZWYge2ltcG9ydCgnLi4vYmVoYXZpb3VyL0JlaGF2aW91cicpfSBCZWhhdmlvdXIgKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi9tYXRoL1ZlY3RvcjJEJyl9IFZlY3RvcjJEICovXG4vKiogQHR5cGVkZWYge2ltcG9ydCgnLi4vdXRpbHMvUmdiJyl9IFJnYiAqL1xuaW1wb3J0IFJnYiBmcm9tIFwiLi4vdXRpbHMvUmdiXCI7XG5pbXBvcnQgUHVpZCBmcm9tIFwiLi4vdXRpbHMvUHVpZFwiO1xuaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBQcm9wVXRpbCBmcm9tIFwiLi4vdXRpbHMvUHJvcFV0aWxcIjtcbmltcG9ydCBlYXNlIGZyb20gXCIuLi9tYXRoL2Vhc2VcIjtcbmltcG9ydCBWZWN0b3IyRCBmcm9tIFwiLi4vbWF0aC9WZWN0b3IyRFwiO1xuaW1wb3J0IE1hdGhVdGlsIGZyb20gXCIuLi9tYXRoL01hdGhVdGlsXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhcnRpY2xlIHtcbiAgLyoqIEB0eXBlIHN0cmluZyAqL1xuICBpZCA9IFwiXCI7XG5cbiAgLyoqIEB0eXBlIHt7cDpWZWN0b3IyRCx2OlZlY3RvcjJELGE6VmVjdG9yMkR9fSAqL1xuICBvbGQgPSB7fTtcblxuICAvKiogQHR5cGUge29iamVjdH0gKi9cbiAgZGF0YSA9IHt9O1xuXG4gIC8qKiBAdHlwZSB7QmVoYXZpb3VyW119ICovXG4gIGJlaGF2aW91cnMgPSBbXTtcblxuICAvKiogQHR5cGUge1ZlY3RvcjJEfSAqL1xuICBwID0gW107XG5cbiAgLyoqIEB0eXBlIHtWZWN0b3IyRH0gKi9cbiAgdiA9IFtdO1xuXG4gIC8qKiBAdHlwZSB7VmVjdG9yMkR9ICovXG4gIGEgPSBbXTtcblxuICAvKiogQHR5cGUge1JnYn0gKi9cbiAgcmdiID0ge307XG5cbiAgLyoqXG4gICAqIHRoZSBQYXJ0aWNsZSBjbGFzc1xuICAgKlxuICAgKiBAY2xhc3MgUHJvdG9uLlBhcnRpY2xlXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge09iamVjdH0gcE9iaiB0aGUgcGFyYW1ldGVycyBvYmplY3Q7XG4gICAqIGZvciBleGFtcGxlIHtsaWZlOjMsZGVhZDpmYWxzZX1cbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmYpIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcGFydGljbGUncyBpZDtcbiAgICAgKiBAcHJvcGVydHkgaWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMubmFtZSA9IFwiUGFydGljbGVcIjtcbiAgICB0aGlzLmlkID0gUHVpZC5pZCh0aGlzLm5hbWUpO1xuICAgIHRoaXMub2xkID0ge307XG4gICAgdGhpcy5kYXRhID0ge307XG4gICAgdGhpcy5iZWhhdmlvdXJzID0gW107XG5cbiAgICB0aGlzLnAgPSBuZXcgVmVjdG9yMkQoKTtcbiAgICB0aGlzLnYgPSBuZXcgVmVjdG9yMkQoKTtcbiAgICB0aGlzLmEgPSBuZXcgVmVjdG9yMkQoKTtcbiAgICB0aGlzLm9sZC5wID0gbmV3IFZlY3RvcjJEKCk7XG4gICAgdGhpcy5vbGQudiA9IG5ldyBWZWN0b3IyRCgpO1xuICAgIHRoaXMub2xkLmEgPSBuZXcgVmVjdG9yMkQoKTtcblxuICAgIHRoaXMucmdiID0gbmV3IFJnYigpO1xuICAgIHRoaXMucmVzZXQoKTtcbiAgICBjb25mICYmIFByb3BVdGlsLnNldFByb3AodGhpcywgY29uZik7XG4gIH1cblxuICBnZXREaXJlY3Rpb24oKSB7XG4gICAgcmV0dXJuIE1hdGguYXRhbjIodGhpcy52LngsIC10aGlzLnYueSkgKiBNYXRoVXRpbC5OMTgwX1BJO1xuICB9XG5cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5saWZlID0gSW5maW5pdHk7XG4gICAgdGhpcy5hZ2UgPSAwO1xuXG4gICAgdGhpcy5kZWFkID0gZmFsc2U7XG4gICAgdGhpcy5zbGVlcCA9IGZhbHNlO1xuICAgIHRoaXMuYm9keSA9IG51bGw7XG4gICAgdGhpcy5zcHJpdGUgPSBudWxsO1xuICAgIHRoaXMucGFyZW50ID0gbnVsbDtcblxuICAgIHRoaXMuZW5lcmd5ID0gMTsgLy8gRW5lcmd5IExvc3NcbiAgICB0aGlzLm1hc3MgPSAxO1xuICAgIHRoaXMucmFkaXVzID0gMTA7XG4gICAgdGhpcy5hbHBoYSA9IDE7XG4gICAgdGhpcy5zY2FsZSA9IDE7XG4gICAgdGhpcy5yb3RhdGlvbiA9IDA7XG4gICAgdGhpcy5jb2xvciA9IG51bGw7XG5cbiAgICB0aGlzLnAuc2V0KDAsIDApO1xuICAgIHRoaXMudi5zZXQoMCwgMCk7XG4gICAgdGhpcy5hLnNldCgwLCAwKTtcbiAgICB0aGlzLm9sZC5wLnNldCgwLCAwKTtcbiAgICB0aGlzLm9sZC52LnNldCgwLCAwKTtcbiAgICB0aGlzLm9sZC5hLnNldCgwLCAwKTtcbiAgICB0aGlzLmVhc2luZyA9IGVhc2UuZWFzZUxpbmVhcjtcblxuICAgIHRoaXMucmdiLnJlc2V0KCk7XG4gICAgVXRpbC5lbXB0eU9iamVjdCh0aGlzLmRhdGEpO1xuICAgIHRoaXMucmVtb3ZlQWxsQmVoYXZpb3VycygpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB1cGRhdGUodGltZSwgaW5kZXgpIHtcbiAgICBpZiAoIXRoaXMuc2xlZXApIHtcbiAgICAgIHRoaXMuYWdlICs9IHRpbWU7XG4gICAgICB0aGlzLmFwcGx5QmVoYXZpb3Vycyh0aW1lLCBpbmRleCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWdlIDwgdGhpcy5saWZlKSB7XG4gICAgICBjb25zdCBzY2FsZSA9IHRoaXMuZWFzaW5nKHRoaXMuYWdlIC8gdGhpcy5saWZlKTtcbiAgICAgIHRoaXMuZW5lcmd5ID0gTWF0aC5tYXgoMSAtIHNjYWxlLCAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgYXBwbHlCZWhhdmlvdXJzKHRpbWUsIGluZGV4KSB7XG4gICAgY29uc3QgbGVuZ3RoID0gdGhpcy5iZWhhdmlvdXJzLmxlbmd0aDtcbiAgICBsZXQgaTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5iZWhhdmlvdXJzW2ldICYmIHRoaXMuYmVoYXZpb3Vyc1tpXS5hcHBseUJlaGF2aW91cih0aGlzLCB0aW1lLCBpbmRleCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7QmVoYXZpb3VyfSBiZWhhdmlvdXJcbiAgICovXG4gIGFkZEJlaGF2aW91cihiZWhhdmlvdXIpIHtcbiAgICB0aGlzLmJlaGF2aW91cnMucHVzaChiZWhhdmlvdXIpO1xuXG4gICAgaWYgKGJlaGF2aW91ci5oYXNPd25Qcm9wZXJ0eShcInBhcmVudHNcIikpIGJlaGF2aW91ci5wYXJlbnRzLnB1c2godGhpcyk7XG4gICAgYmVoYXZpb3VyLmluaXRpYWxpemUodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtCZWhhdmlvdXJbXX0gYmVoYXZpb3Vyc1xuICAgKi9cbiAgYWRkQmVoYXZpb3VycyhiZWhhdmlvdXJzKSB7XG4gICAgY29uc3QgbGVuZ3RoID0gYmVoYXZpb3Vycy5sZW5ndGg7XG4gICAgbGV0IGk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuYWRkQmVoYXZpb3VyKGJlaGF2aW91cnNbaV0pO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZUJlaGF2aW91cihiZWhhdmlvdXIpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuYmVoYXZpb3Vycy5pbmRleE9mKGJlaGF2aW91cik7XG5cbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgY29uc3QgYmVoYXZpb3VyID0gdGhpcy5iZWhhdmlvdXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICBiZWhhdmlvdXIucGFyZW50cyA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlQWxsQmVoYXZpb3VycygpIHtcbiAgICBVdGlsLmVtcHR5QXJyYXkodGhpcy5iZWhhdmlvdXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0b3J5IHRoaXMgcGFydGljbGVcbiAgICogQG1ldGhvZCBkZXN0cm95XG4gICAqL1xuICBkZXN0cm95KCkge1xuICAgIHRoaXMucmVtb3ZlQWxsQmVoYXZpb3VycygpO1xuICAgIHRoaXMuZW5lcmd5ID0gMDtcbiAgICB0aGlzLmRlYWQgPSB0cnVlO1xuICAgIHRoaXMucGFyZW50ID0gbnVsbDtcbiAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQge1xuICAvKipcbiAgICogQHR5cGVkZWYgIHtPYmplY3R9IHJnYk9iamVjdFxuICAgKiBAcHJvcGVydHkge051bWJlcn0gciByZWQgdmFsdWVcbiAgICogQHByb3BlcnR5IHtOdW1iZXJ9IGcgZ3JlZW4gdmFsdWVcbiAgICogQHByb3BlcnR5IHtOdW1iZXJ9IGIgYmx1ZSB2YWx1ZVxuICAgKi9cbiAgLyoqXG4gICAqIGNvbnZlcnRzIGEgaGV4IHZhbHVlIHRvIGEgcmdiIG9iamVjdFxuICAgKlxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5VdGlsXG4gICAqIEBtZXRob2QgaGV4VG9SZ2JcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGggYW55IGhleCB2YWx1ZSwgZS5nLiAjMDAwMDAwIG9yIDAwMDAwMCBmb3IgYmxhY2tcbiAgICpcbiAgICogQHJldHVybiB7cmdiT2JqZWN0fVxuICAgKi9cbiAgaGV4VG9SZ2IoaCkge1xuICAgIGNvbnN0IGhleDE2ID0gaC5jaGFyQXQoMCkgPT09IFwiI1wiID8gaC5zdWJzdHJpbmcoMSwgNykgOiBoO1xuICAgIGNvbnN0IHIgPSBwYXJzZUludChoZXgxNi5zdWJzdHJpbmcoMCwgMiksIDE2KTtcbiAgICBjb25zdCBnID0gcGFyc2VJbnQoaGV4MTYuc3Vic3RyaW5nKDIsIDQpLCAxNik7XG4gICAgY29uc3QgYiA9IHBhcnNlSW50KGhleDE2LnN1YnN0cmluZyg0LCA2KSwgMTYpO1xuXG4gICAgcmV0dXJuIHsgciwgZywgYiB9O1xuICB9LFxuXG4gIC8qKlxuICAgKiBjb252ZXJ0cyBhIHJnYiB2YWx1ZSB0byBhIHJnYiBzdHJpbmdcbiAgICpcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uVXRpbFxuICAgKiBAbWV0aG9kIHJnYlRvSGV4XG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0IHwgUHJvdG9uLmhleFRvUmdifSByZ2IgYSByZ2Igb2JqZWN0IGxpa2UgaW4ge0BsaW5rIFByb3RvbiNQcm90b24ufVxuICAgKlxuICAgKiBAcmV0dXJuIHtTdHJpbmd9IHJnYigpXG4gICAqL1xuICByZ2JUb0hleChyYmcpIHtcbiAgICByZXR1cm4gYHJnYigke3JiZy5yfSwgJHtyYmcuZ30sICR7cmJnLmJ9KWA7XG4gIH0sXG5cbiAgZ2V0SGV4MTZGcm9tUGFydGljbGUocCkge1xuICAgIHJldHVybiBOdW1iZXIocC5yZ2IucikgKiA2NTUzNiArIE51bWJlcihwLnJnYi5nKSAqIDI1NiArIE51bWJlcihwLnJnYi5iKTtcbiAgfVxufTtcbiIsImltcG9ydCBWZWN0b3IyRCBmcm9tIFwiLi9WZWN0b3IyRFwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQb2xhcjJEIHtcbiAgY29uc3RydWN0b3IociwgdGhhKSB7XG4gICAgdGhpcy5yID0gTWF0aC5hYnMocikgfHwgMDtcbiAgICB0aGlzLnRoYSA9IHRoYSB8fCAwO1xuICB9XG5cbiAgc2V0KHIsIHRoYSkge1xuICAgIHRoaXMuciA9IHI7XG4gICAgdGhpcy50aGEgPSB0aGE7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRSKHIpIHtcbiAgICB0aGlzLnIgPSByO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0VGhhKHRoYSkge1xuICAgIHRoaXMudGhhID0gdGhhO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgY29weShwKSB7XG4gICAgdGhpcy5yID0gcC5yO1xuICAgIHRoaXMudGhhID0gcC50aGE7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0b1ZlY3RvcigpIHtcbiAgICByZXR1cm4gbmV3IFZlY3RvcjJEKHRoaXMuZ2V0WCgpLCB0aGlzLmdldFkoKSk7XG4gIH1cblxuICBnZXRYKCkge1xuICAgIHJldHVybiB0aGlzLnIgKiBNYXRoLnNpbih0aGlzLnRoYSk7XG4gIH1cblxuICBnZXRZKCkge1xuICAgIHJldHVybiAtdGhpcy5yICogTWF0aC5jb3ModGhpcy50aGEpO1xuICB9XG5cbiAgbm9ybWFsaXplKCkge1xuICAgIHRoaXMuciA9IDE7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBlcXVhbHModikge1xuICAgIHJldHVybiB2LnIgPT09IHRoaXMuciAmJiB2LnRoYSA9PT0gdGhpcy50aGE7XG4gIH1cblxuICBjbGVhcigpIHtcbiAgICB0aGlzLnIgPSAwLjA7XG4gICAgdGhpcy50aGEgPSAwLjA7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBjbG9uZSgpIHtcbiAgICByZXR1cm4gbmV3IFBvbGFyMkQodGhpcy5yLCB0aGlzLnRoYSk7XG4gIH1cbn1cbiIsImNvbnN0IE1hdDMgPSB7XG4gIGNyZWF0ZShtYXQzKSB7XG4gICAgY29uc3QgbWF0ID0gbmV3IEZsb2F0MzJBcnJheSg5KTtcbiAgICBpZiAobWF0MykgdGhpcy5zZXQobWF0MywgbWF0KTtcblxuICAgIHJldHVybiBtYXQ7XG4gIH0sXG5cbiAgc2V0KG1hdDEsIG1hdDIpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDk7IGkrKykgbWF0MltpXSA9IG1hdDFbaV07XG5cbiAgICByZXR1cm4gbWF0MjtcbiAgfSxcblxuICBtdWx0aXBseShtYXQsIG1hdDIsIG1hdDMpIHtcbiAgICBsZXQgYTAwID0gbWF0WzBdLFxuICAgICAgYTAxID0gbWF0WzFdLFxuICAgICAgYTAyID0gbWF0WzJdLFxuICAgICAgYTEwID0gbWF0WzNdLFxuICAgICAgYTExID0gbWF0WzRdLFxuICAgICAgYTIwID0gbWF0WzZdLFxuICAgICAgYTIxID0gbWF0WzddLFxuICAgICAgYjAwID0gbWF0MlswXSxcbiAgICAgIGIwMSA9IG1hdDJbMV0sXG4gICAgICBiMDIgPSBtYXQyWzJdLFxuICAgICAgYjEwID0gbWF0MlszXSxcbiAgICAgIGIxMSA9IG1hdDJbNF0sXG4gICAgICBiMjAgPSBtYXQyWzZdLFxuICAgICAgYjIxID0gbWF0Mls3XTtcblxuICAgIG1hdDNbMF0gPSBiMDAgKiBhMDAgKyBiMDEgKiBhMTA7XG4gICAgbWF0M1sxXSA9IGIwMCAqIGEwMSArIGIwMSAqIGExMTtcbiAgICBtYXQzWzJdID0gYTAyICogYjAyO1xuICAgIG1hdDNbM10gPSBiMTAgKiBhMDAgKyBiMTEgKiBhMTA7XG4gICAgbWF0M1s0XSA9IGIxMCAqIGEwMSArIGIxMSAqIGExMTtcbiAgICBtYXQzWzZdID0gYjIwICogYTAwICsgYjIxICogYTEwICsgYTIwO1xuICAgIG1hdDNbN10gPSBiMjAgKiBhMDEgKyBiMjEgKiBhMTEgKyBhMjE7XG5cbiAgICByZXR1cm4gbWF0MztcbiAgfSxcblxuICBpbnZlcnNlKG1hdCwgbWF0Mykge1xuICAgIGxldCBhMDAgPSBtYXRbMF0sXG4gICAgICBhMDEgPSBtYXRbMV0sXG4gICAgICBhMTAgPSBtYXRbM10sXG4gICAgICBhMTEgPSBtYXRbNF0sXG4gICAgICBhMjAgPSBtYXRbNl0sXG4gICAgICBhMjEgPSBtYXRbN10sXG4gICAgICBiMDEgPSBhMTEsXG4gICAgICBiMTEgPSAtYTEwLFxuICAgICAgYjIxID0gYTIxICogYTEwIC0gYTExICogYTIwLFxuICAgICAgZCA9IGEwMCAqIGIwMSArIGEwMSAqIGIxMSxcbiAgICAgIGlkO1xuXG4gICAgaWQgPSAxIC8gZDtcbiAgICBtYXQzWzBdID0gYjAxICogaWQ7XG4gICAgbWF0M1sxXSA9IC1hMDEgKiBpZDtcbiAgICBtYXQzWzNdID0gYjExICogaWQ7XG4gICAgbWF0M1s0XSA9IGEwMCAqIGlkO1xuICAgIG1hdDNbNl0gPSBiMjEgKiBpZDtcbiAgICBtYXQzWzddID0gKC1hMjEgKiBhMDAgKyBhMDEgKiBhMjApICogaWQ7XG5cbiAgICByZXR1cm4gbWF0MztcbiAgfSxcblxuICBtdWx0aXBseVZlYzIobSwgdmVjLCBtYXQzKSB7XG4gICAgbGV0IHggPSB2ZWNbMF0sXG4gICAgICB5ID0gdmVjWzFdO1xuXG4gICAgbWF0M1swXSA9IHggKiBtWzBdICsgeSAqIG1bM10gKyBtWzZdO1xuICAgIG1hdDNbMV0gPSB4ICogbVsxXSArIHkgKiBtWzRdICsgbVs3XTtcblxuICAgIHJldHVybiBtYXQzO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBNYXQzO1xuIiwiaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBNYXRoVXRpbCBmcm9tIFwiLi4vbWF0aC9NYXRoVXRpbFwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTcGFuIHtcbiAgY29uc3RydWN0b3IoYSwgYiwgY2VudGVyKSB7XG4gICAgaWYgKFV0aWwuaXNBcnJheShhKSkge1xuICAgICAgdGhpcy5pc0FycmF5ID0gdHJ1ZTtcbiAgICAgIHRoaXMuYSA9IGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNBcnJheSA9IGZhbHNlO1xuICAgICAgdGhpcy5hID0gVXRpbC5pbml0VmFsdWUoYSwgMSk7XG4gICAgICB0aGlzLmIgPSBVdGlsLmluaXRWYWx1ZShiLCB0aGlzLmEpO1xuICAgICAgdGhpcy5jZW50ZXIgPSBVdGlsLmluaXRWYWx1ZShjZW50ZXIsIGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBnZXRWYWx1ZShpc0ludCA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuaXNBcnJheSkge1xuICAgICAgcmV0dXJuIFV0aWwuZ2V0UmFuZEZyb21BcnJheSh0aGlzLmEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXRoaXMuY2VudGVyKSB7XG4gICAgICAgIHJldHVybiBNYXRoVXRpbC5yYW5kb21BVG9CKHRoaXMuYSwgdGhpcy5iLCBpc0ludCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gTWF0aFV0aWwucmFuZG9tRmxvYXRpbmcodGhpcy5hLCB0aGlzLmIsIGlzSW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIG5ldyBTcGFuIG9iamVjdFxuICAgKlxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5VdGlsXG4gICAqIEBtZXRob2Qgc2V0U3BhblZhbHVlXG4gICAqXG4gICAqIEB0b2RvIGEsIGIgYW5kIGMgc2hvdWxkIGJlICdNaXhlZCcgb3IgJ051bWJlcic/XG4gICAqXG4gICAqIEBwYXJhbSB7TWl4ZWQgfCBTcGFufSBhXG4gICAqIEBwYXJhbSB7TWl4ZWR9ICAgICAgICAgICAgICAgYlxuICAgKiBAcGFyYW0ge01peGVkfSAgICAgICAgICAgICAgIGNcbiAgICpcbiAgICogQHJldHVybiB7U3Bhbn1cbiAgICovXG4gIHN0YXRpYyBzZXRTcGFuVmFsdWUoYSwgYiwgYykge1xuICAgIGlmIChhIGluc3RhbmNlb2YgU3Bhbikge1xuICAgICAgcmV0dXJuIGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChiID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTcGFuKGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG5ldyBTcGFuKGEsIGIpO1xuICAgICAgICBlbHNlIHJldHVybiBuZXcgU3BhbihhLCBiLCBjKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdmFsdWUgZnJvbSBhIFNwYW4sIGlmIHRoZSBwYXJhbSBpcyBub3QgYSBTcGFuIGl0IHdpbGwgcmV0dXJuIHRoZSBnaXZlbiBwYXJhbWV0ZXJcbiAgICpcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uVXRpbFxuICAgKiBAbWV0aG9kIGdldFZhbHVlXG4gICAqXG4gICAqIEBwYXJhbSB7TWl4ZWQgfCBTcGFufSBwYW5cbiAgICpcbiAgICogQHJldHVybiB7TWl4ZWR9IHRoZSB2YWx1ZSBvZiBTcGFuIE9SIHRoZSBwYXJhbWV0ZXIgaWYgaXQgaXMgbm90IGEgU3BhblxuICAgKi9cbiAgc3RhdGljIGdldFNwYW5WYWx1ZShwYW4pIHtcbiAgICByZXR1cm4gcGFuIGluc3RhbmNlb2YgU3BhbiA/IHBhbi5nZXRWYWx1ZSgpIDogcGFuO1xuICB9XG59XG4iLCJpbXBvcnQgU3BhbiBmcm9tIFwiLi9TcGFuXCI7XG5pbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IE1hdGhVdGlsIGZyb20gXCIuL01hdGhVdGlsXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFycmF5U3BhbiBleHRlbmRzIFNwYW4ge1xuICBjb25zdHJ1Y3Rvcihjb2xvcikge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fYXJyID0gVXRpbC50b0FycmF5KGNvbG9yKTtcbiAgfVxuXG4gIGdldFZhbHVlKCkge1xuICAgIGNvbnN0IHZhbCA9IFV0aWwuZ2V0UmFuZEZyb21BcnJheSh0aGlzLl9hcnIpO1xuICAgIHJldHVybiB2YWwgPT09IFwicmFuZG9tXCIgfHwgdmFsID09PSBcIlJhbmRvbVwiID8gTWF0aFV0aWwucmFuZG9tQ29sb3IoKSA6IHZhbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIHN1cmUgdGhhdCB0aGUgY29sb3IgaXMgYW4gaW5zdGFuY2Ugb2YgUHJvdG9uLkFycmF5U3BhbiwgaWYgbm90IGl0IG1ha2VzIGEgbmV3IGluc3RhbmNlXG4gICAqXG4gICAqIEBtZXRob2Qgc2V0U3BhblZhbHVlXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkNvbG9yXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5QYXJ0aWNsZX0gcGFydGljbGVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHRoZSBpbnRlZ3JhdGUgdGltZSAxL21zXG4gICAqIEBwYXJhbSB7SW50fSB0aGUgcGFydGljbGUgaW5kZXhcbiAgICovXG4gIHN0YXRpYyBjcmVhdGVBcnJheVNwYW4oYXJyKSB7XG4gICAgaWYgKCFhcnIpIHJldHVybiBudWxsO1xuXG4gICAgaWYgKGFyciBpbnN0YW5jZW9mIEFycmF5U3BhbikgcmV0dXJuIGFycjtcbiAgICBlbHNlIHJldHVybiBuZXcgQXJyYXlTcGFuKGFycik7XG4gIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlY3RhbmdsZSB7XG4gIGNvbnN0cnVjdG9yKHgsIHksIHcsIGgpIHtcbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG5cbiAgICB0aGlzLndpZHRoID0gdztcbiAgICB0aGlzLmhlaWdodCA9IGg7XG5cbiAgICB0aGlzLmJvdHRvbSA9IHRoaXMueSArIHRoaXMuaGVpZ2h0O1xuICAgIHRoaXMucmlnaHQgPSB0aGlzLnggKyB0aGlzLndpZHRoO1xuICB9XG5cbiAgY29udGFpbnMoeCwgeSkge1xuICAgIGlmICh4IDw9IHRoaXMucmlnaHQgJiYgeCA+PSB0aGlzLnggJiYgeSA8PSB0aGlzLmJvdHRvbSAmJiB5ID49IHRoaXMueSkgcmV0dXJuIHRydWU7XG4gICAgZWxzZSByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiIsImltcG9ydCBTcGFuIGZyb20gXCIuLi9tYXRoL1NwYW5cIjtcbmltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJhdGUge1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBwYXJ0aWNsZXMgcGVyIHNlY29uZCBlbWlzc2lvbiAoYSBbcGFydGljbGVdL2IgW3NdKTtcbiAgICogQG5hbWVzcGFjZVxuICAgKiBAbWVtYmVyb2YhIFByb3RvbiNcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBhbGlhcyBSYXRlXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXkgfCBOdW1iZXIgfCBTcGFufSBudW1wYW4gdGhlIG51bWJlciBvZiBlYWNoIGVtaXNzaW9uO1xuICAgKiBAcGFyYW0ge0FycmF5IHwgTnVtYmVyIHwgU3Bhbn0gdGltZXBhbiB0aGUgdGltZSBvZiBlYWNoIGVtaXNzaW9uO1xuICAgKiBmb3IgZXhhbXBsZTogbmV3IFJhdGUobmV3IFNwYW4oMTAsIDIwKSwgbmV3IFNwYW4oLjEsIC4yNSkpO1xuICAgKi9cbiAgY29uc3RydWN0b3IobnVtcGFuLCB0aW1lcGFuKSB7XG4gICAgdGhpcy5udW1QYW4gPSBTcGFuLnNldFNwYW5WYWx1ZShVdGlsLmluaXRWYWx1ZShudW1wYW4sIDEpKTtcbiAgICB0aGlzLnRpbWVQYW4gPSBTcGFuLnNldFNwYW5WYWx1ZShVdGlsLmluaXRWYWx1ZSh0aW1lcGFuLCAxKSk7XG5cbiAgICB0aGlzLnN0YXJ0VGltZSA9IDA7XG4gICAgdGhpcy5uZXh0VGltZSA9IDA7XG4gICAgdGhpcy5pbml0KCk7XG4gIH1cblxuICBpbml0KCkge1xuICAgIHRoaXMuc3RhcnRUaW1lID0gMDtcbiAgICB0aGlzLm5leHRUaW1lID0gdGhpcy50aW1lUGFuLmdldFZhbHVlKCk7XG4gIH1cblxuICBnZXRWYWx1ZSh0aW1lKSB7XG4gICAgdGhpcy5zdGFydFRpbWUgKz0gdGltZTtcblxuICAgIGlmICh0aGlzLnN0YXJ0VGltZSA+PSB0aGlzLm5leHRUaW1lKSB7XG4gICAgICB0aGlzLnN0YXJ0VGltZSA9IDA7XG4gICAgICB0aGlzLm5leHRUaW1lID0gdGhpcy50aW1lUGFuLmdldFZhbHVlKCk7XG5cbiAgICAgIGlmICh0aGlzLm51bVBhbi5iID09PSAxKSB7XG4gICAgICAgIGlmICh0aGlzLm51bVBhbi5nZXRWYWx1ZShmYWxzZSkgPiAwLjUpIHJldHVybiAxO1xuICAgICAgICBlbHNlIHJldHVybiAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubnVtUGFuLmdldFZhbHVlKHRydWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBJbml0aWFsaXplIHtcbiAgcmVzZXQoKSB7fVxuXG4gIGluaXQoZW1pdHRlciwgcGFydGljbGUpIHtcbiAgICBpZiAocGFydGljbGUpIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZShwYXJ0aWNsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZShlbWl0dGVyKTtcbiAgICB9XG4gIH1cblxuICAvLyBzdWIgY2xhc3MgaW5pdFxuICBpbml0aWFsaXplKHRhcmdldCkge31cbn1cbiIsImltcG9ydCBTcGFuIGZyb20gXCIuLi9tYXRoL1NwYW5cIjtcbmltcG9ydCBJbml0aWFsaXplIGZyb20gXCIuL0luaXRpYWxpemVcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlmZSBleHRlbmRzIEluaXRpYWxpemUge1xuICBjb25zdHJ1Y3RvcihhLCBiLCBjKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMubGlmZVBhbiA9IFNwYW4uc2V0U3BhblZhbHVlKGEsIGIsIGMpO1xuICAgIHRoaXMubmFtZSA9IFwiTGlmZVwiO1xuICB9XG5cbiAgaW5pdGlhbGl6ZSh0YXJnZXQpIHtcbiAgICBpZiAodGhpcy5saWZlUGFuLmEgPT09IEluZmluaXR5KSB0YXJnZXQubGlmZSA9IEluZmluaXR5O1xuICAgIGVsc2UgdGFyZ2V0LmxpZmUgPSB0aGlzLmxpZmVQYW4uZ2V0VmFsdWUoKTtcbiAgfVxufVxuIiwiaW1wb3J0IFZlY3RvcjJEIGZyb20gXCIuLi9tYXRoL1ZlY3RvcjJEXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFpvbmUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnZlY3RvciA9IG5ldyBWZWN0b3IyRCgwLCAwKTtcbiAgICB0aGlzLnJhbmRvbSA9IDA7XG4gICAgdGhpcy5jcm9zc1R5cGUgPSBcImRlYWRcIjtcbiAgICB0aGlzLmFsZXJ0ID0gdHJ1ZTtcbiAgfVxuXG4gIGdldFBvc2l0aW9uKCkge31cblxuICBjcm9zc2luZyhwYXJ0aWNsZSkge31cblxuICBkZXN0cm95KCkge1xuICAgIHRoaXMudmVjdG9yID0gbnVsbDtcbiAgfVxufVxuIiwiaW1wb3J0IFpvbmUgZnJvbSBcIi4vWm9uZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQb2ludFpvbmUgZXh0ZW5kcyBab25lIHtcbiAgY29uc3RydWN0b3IoeCwgeSkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG4gIH1cblxuICBnZXRQb3NpdGlvbigpIHtcbiAgICB0aGlzLnZlY3Rvci54ID0gdGhpcy54O1xuICAgIHRoaXMudmVjdG9yLnkgPSB0aGlzLnk7XG5cbiAgICByZXR1cm4gdGhpcy52ZWN0b3I7XG4gIH1cblxuICBjcm9zc2luZyhwYXJ0aWNsZSkge1xuICAgIGlmICh0aGlzLmFsZXJ0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiU29ycnksIFBvaW50Wm9uZSBkb2VzIG5vdCBzdXBwb3J0IGNyb3NzaW5nIG1ldGhvZCFcIik7XG4gICAgICB0aGlzLmFsZXJ0ID0gZmFsc2U7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IFBvaW50Wm9uZSBmcm9tIFwiLi4vem9uZS9Qb2ludFpvbmVcIjtcbmltcG9ydCBJbml0aWFsaXplIGZyb20gXCIuL0luaXRpYWxpemVcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUG9zaXRpb24gZXh0ZW5kcyBJbml0aWFsaXplIHtcbiAgY29uc3RydWN0b3Ioem9uZSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy56b25lID0gVXRpbC5pbml0VmFsdWUoem9uZSwgbmV3IFBvaW50Wm9uZSgpKTtcbiAgICB0aGlzLm5hbWUgPSBcIlBvc2l0aW9uXCI7XG4gIH1cblxuICByZXNldCh6b25lKSB7XG4gICAgdGhpcy56b25lID0gVXRpbC5pbml0VmFsdWUoem9uZSwgbmV3IFBvaW50Wm9uZSgpKTtcbiAgfVxuXG4gIGluaXRpYWxpemUodGFyZ2V0KSB7XG4gICAgdGhpcy56b25lLmdldFBvc2l0aW9uKCk7XG5cbiAgICB0YXJnZXQucC54ID0gdGhpcy56b25lLnZlY3Rvci54O1xuICAgIHRhcmdldC5wLnkgPSB0aGlzLnpvbmUudmVjdG9yLnk7XG4gIH1cbn1cbiIsImltcG9ydCBQcm90b24gZnJvbSBcIi4uL2NvcmUvUHJvdG9uXCI7XG5pbXBvcnQgU3BhbiBmcm9tIFwiLi4vbWF0aC9TcGFuXCI7XG5pbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IEluaXRpYWxpemUgZnJvbSBcIi4vSW5pdGlhbGl6ZVwiO1xuaW1wb3J0IFBvbGFyMkQgZnJvbSBcIi4uL21hdGgvUG9sYXIyRFwiO1xuaW1wb3J0IE1hdGhVdGlsIGZyb20gXCIuLi9tYXRoL01hdGhVdGlsXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaXR5IGV4dGVuZHMgSW5pdGlhbGl6ZSB7XG4gIGNvbnN0cnVjdG9yKHJwYW4sIHRoYXBhbiwgdHlwZSkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLnJQYW4gPSBTcGFuLnNldFNwYW5WYWx1ZShycGFuKTtcbiAgICB0aGlzLnRoYVBhbiA9IFNwYW4uc2V0U3BhblZhbHVlKHRoYXBhbik7XG4gICAgdGhpcy50eXBlID0gVXRpbC5pbml0VmFsdWUodHlwZSwgXCJ2ZWN0b3JcIik7XG5cbiAgICB0aGlzLm5hbWUgPSBcIlZlbG9jaXR5XCI7XG4gIH1cblxuICByZXNldChycGFuLCB0aGFwYW4sIHR5cGUpIHtcbiAgICB0aGlzLnJQYW4gPSBTcGFuLnNldFNwYW5WYWx1ZShycGFuKTtcbiAgICB0aGlzLnRoYVBhbiA9IFNwYW4uc2V0U3BhblZhbHVlKHRoYXBhbik7XG4gICAgdGhpcy50eXBlID0gVXRpbC5pbml0VmFsdWUodHlwZSwgXCJ2ZWN0b3JcIik7XG4gIH1cblxuICBub3JtYWxpemVWZWxvY2l0eSh2cikge1xuICAgIHJldHVybiB2ciAqIFByb3Rvbi5NRUFTVVJFO1xuICB9XG5cbiAgaW5pdGlhbGl6ZSh0YXJnZXQpIHtcbiAgICBpZiAodGhpcy50eXBlID09PSBcInBcIiB8fCB0aGlzLnR5cGUgPT09IFwiUFwiIHx8IHRoaXMudHlwZSA9PT0gXCJwb2xhclwiKSB7XG4gICAgICBjb25zdCBwb2xhcjJkID0gbmV3IFBvbGFyMkQoXG4gICAgICAgIHRoaXMubm9ybWFsaXplVmVsb2NpdHkodGhpcy5yUGFuLmdldFZhbHVlKCkpLFxuICAgICAgICB0aGlzLnRoYVBhbi5nZXRWYWx1ZSgpICogTWF0aFV0aWwuUElfMTgwXG4gICAgICApO1xuXG4gICAgICB0YXJnZXQudi54ID0gcG9sYXIyZC5nZXRYKCk7XG4gICAgICB0YXJnZXQudi55ID0gcG9sYXIyZC5nZXRZKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldC52LnggPSB0aGlzLm5vcm1hbGl6ZVZlbG9jaXR5KHRoaXMuclBhbi5nZXRWYWx1ZSgpKTtcbiAgICAgIHRhcmdldC52LnkgPSB0aGlzLm5vcm1hbGl6ZVZlbG9jaXR5KHRoaXMudGhhUGFuLmdldFZhbHVlKCkpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IFNwYW4gZnJvbSBcIi4uL21hdGgvU3BhblwiO1xuaW1wb3J0IEluaXRpYWxpemUgZnJvbSBcIi4vSW5pdGlhbGl6ZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNYXNzIGV4dGVuZHMgSW5pdGlhbGl6ZSB7XG4gIGNvbnN0cnVjdG9yKGEsIGIsIGMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubWFzc1BhbiA9IFNwYW4uc2V0U3BhblZhbHVlKGEsIGIsIGMpO1xuICAgIHRoaXMubmFtZSA9IFwiTWFzc1wiO1xuICB9XG5cbiAgaW5pdGlhbGl6ZSh0YXJnZXQpIHtcbiAgICB0YXJnZXQubWFzcyA9IHRoaXMubWFzc1Bhbi5nZXRWYWx1ZSgpO1xuICB9XG59XG4iLCJpbXBvcnQgU3BhbiBmcm9tIFwiLi4vbWF0aC9TcGFuXCI7XG5pbXBvcnQgSW5pdGlhbGl6ZSBmcm9tIFwiLi9Jbml0aWFsaXplXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJhZGl1cyBleHRlbmRzIEluaXRpYWxpemUge1xuICBjb25zdHJ1Y3RvcihhLCBiLCBjKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnJhZGl1cyA9IFNwYW4uc2V0U3BhblZhbHVlKGEsIGIsIGMpO1xuXG4gICAgdGhpcy5uYW1lID0gXCJSYWRpdXNcIjtcbiAgfVxuXG4gIHJlc2V0KGEsIGIsIGMpIHtcbiAgICB0aGlzLnJhZGl1cyA9IFNwYW4uc2V0U3BhblZhbHVlKGEsIGIsIGMpO1xuICB9XG5cbiAgaW5pdGlhbGl6ZShwYXJ0aWNsZSkge1xuICAgIHBhcnRpY2xlLnJhZGl1cyA9IHRoaXMucmFkaXVzLmdldFZhbHVlKCk7XG4gICAgcGFydGljbGUuZGF0YS5vbGRSYWRpdXMgPSBwYXJ0aWNsZS5yYWRpdXM7XG4gIH1cbn1cbiIsImltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgQXJyYXlTcGFuIGZyb20gXCIuLi9tYXRoL0FycmF5U3BhblwiO1xuaW1wb3J0IEluaXRpYWxpemUgZnJvbSBcIi4vSW5pdGlhbGl6ZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCb2R5IGV4dGVuZHMgSW5pdGlhbGl6ZSB7XG4gIGNvbnN0cnVjdG9yKGltYWdlLCB3LCBoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuaW1hZ2UgPSB0aGlzLnNldFNwYW5WYWx1ZShpbWFnZSk7XG4gICAgdGhpcy53ID0gVXRpbC5pbml0VmFsdWUodywgMjApO1xuICAgIHRoaXMuaCA9IFV0aWwuaW5pdFZhbHVlKGgsIHRoaXMudyk7XG4gICAgdGhpcy5uYW1lID0gXCJCb2R5XCI7XG4gIH1cblxuICBpbml0aWFsaXplKHBhcnRpY2xlKSB7XG4gICAgY29uc3QgaW1hZ2VUYXJnZXQgPSB0aGlzLmltYWdlLmdldFZhbHVlKCk7XG5cbiAgICBpZiAodHlwZW9mIGltYWdlVGFyZ2V0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBwYXJ0aWNsZS5ib2R5ID0ge1xuICAgICAgICB3aWR0aDogdGhpcy53LFxuICAgICAgICBoZWlnaHQ6IHRoaXMuaCxcbiAgICAgICAgc3JjOiBpbWFnZVRhcmdldCxcbiAgICAgICAgaXNJbm5lcjogdHJ1ZSxcbiAgICAgICAgaW5uZXI6IHRydWVcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcnRpY2xlLmJvZHkgPSBpbWFnZVRhcmdldDtcbiAgICB9XG4gIH1cblxuICBzZXRTcGFuVmFsdWUoaW1hZ2UpIHtcbiAgICByZXR1cm4gaW1hZ2UgaW5zdGFuY2VvZiBBcnJheVNwYW4gPyBpbWFnZSA6IG5ldyBBcnJheVNwYW4oaW1hZ2UpO1xuICB9XG59XG4iLCJpbXBvcnQgUHJvdG9uIGZyb20gXCIuLi9jb3JlL1Byb3RvblwiO1xuaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBlYXNlIGZyb20gXCIuLi9tYXRoL2Vhc2VcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmVoYXZpb3VyIHtcbiAgc3RhdGljIGlkID0gMDtcblxuICAvKipcbiAgICogVGhlIEJlaGF2aW91ciBjbGFzcyBpcyB0aGUgYmFzZSBmb3IgdGhlIG90aGVyIEJlaGF2aW91clxuICAgKlxuICAgKiBAbWVtYmVyb2YhIC1cbiAgICogQGludGVyZmFjZVxuICAgKiBAYWxpYXMgUHJvdG9uLkJlaGF2aW91clxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gbGlmZSBcdHRoZSBiZWhhdmlvdXJzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IGVhc2luZyBcdFRoZSBiZWhhdmlvdXIncyBkZWNheWluZyB0cmVuZCwgZm9yIGV4YW1wbGUgZWFzZS5lYXNlT3V0UXVhcnRcbiAgICpcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9ICBpZCBcdFx0VGhlIGJlaGF2aW91cnMgaWRcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XSBcdFx0XHRcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlLmVhc2VMaW5lYXJdIFx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICogQHByb3BlcnR5IHtOdW1iZXJ9ICBhZ2U9MCBcdEhvdyBsb25nIHRoZSBwYXJ0aWNsZSBzaG91bGQgYmUgJ2FsaWZlJ1xuICAgKiBAcHJvcGVydHkge051bWJlcn0gIGVuZXJneT0xXG4gICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZGVhZD1mYWxzZSBUaGUgcGFydGljbGUgaXMgZGVhZCBhdCBmaXJzdFxuICAgKiBAcHJvcGVydHkge0FycmF5fSAgIHBhcmVudHMgXHRUaGUgYmVoYXZpb3VyJ3MgcGFyZW50cyBhcnJheVxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gIG5hbWUgXHRUaGUgYmVoYXZpb3VyIG5hbWVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGxpZmUsIGVhc2luZykge1xuICAgIHRoaXMubGlmZSA9IFV0aWwuaW5pdFZhbHVlKGxpZmUsIEluZmluaXR5KTtcbiAgICB0aGlzLmVhc2luZyA9IGVhc2UuZ2V0RWFzaW5nKGVhc2luZyk7XG5cbiAgICB0aGlzLmFnZSA9IDA7XG4gICAgdGhpcy5lbmVyZ3kgPSAxO1xuICAgIHRoaXMuZGVhZCA9IGZhbHNlO1xuICAgIHRoaXMucGFyZW50cyA9IFtdO1xuXG4gICAgdGhpcy5pZCA9IGBCZWhhdmlvdXJfJHtCZWhhdmlvdXIuaWQrK31gO1xuICAgIHRoaXMubmFtZSA9IFwiQmVoYXZpb3VyXCI7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhpcyBiZWhhdmlvdXIncyBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIEBtZXRob2QgcmVzZXRcbiAgICogQG1lbWJlcm9mIFByb3Rvbi5CZWhhdmlvdXJcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gXHRcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqL1xuICByZXNldChsaWZlLCBlYXNpbmcpIHtcbiAgICB0aGlzLmxpZmUgPSBVdGlsLmluaXRWYWx1ZShsaWZlLCBJbmZpbml0eSk7XG4gICAgdGhpcy5lYXNpbmcgPSBlYXNlLmdldEVhc2luZyhlYXNpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZSBhIGZvcmNlIGJ5IDE6MTAwO1xuICAgKlxuICAgKiBAbWV0aG9kIG5vcm1hbGl6ZUZvcmNlXG4gICAqIEBtZW1iZXJvZiBQcm90b24uQmVoYXZpb3VyXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5WZWN0b3IyRH0gZm9yY2VcbiAgICovXG4gIG5vcm1hbGl6ZUZvcmNlKGZvcmNlKSB7XG4gICAgcmV0dXJuIGZvcmNlLm11bHRpcGx5U2NhbGFyKFByb3Rvbi5NRUFTVVJFKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemUgYSB2YWx1ZSBieSAxOjEwMDtcbiAgICpcbiAgICogQG1ldGhvZCBub3JtYWxpemVWYWx1ZVxuICAgKiBAbWVtYmVyb2YgUHJvdG9uLkJlaGF2aW91clxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHZhbHVlXG4gICAqL1xuICBub3JtYWxpemVWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAqIFByb3Rvbi5NRUFTVVJFO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGJlaGF2aW91cidzIHBhcmFtZXRlcnMgZm9yIGFsbCBwYXJ0aWNsZXNcbiAgICpcbiAgICogQG1ldGhvZCBpbml0aWFsaXplXG4gICAqIEBtZW1iZXJvZiBQcm90b24uQmVoYXZpb3VyXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5QYXJ0aWNsZX0gcGFydGljbGVcbiAgICovXG4gIGluaXRpYWxpemUocGFydGljbGUpIHt9XG5cbiAgLyoqXG4gICAqIEFwcGx5IHRoaXMgYmVoYXZpb3VyIGZvciBhbGwgcGFydGljbGVzIGV2ZXJ5IHRpbWVcbiAgICpcbiAgICogQG1ldGhvZCBhcHBseUJlaGF2aW91clxuICAgKiBAbWVtYmVyb2YgUHJvdG9uLkJlaGF2aW91clxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uUGFydGljbGV9IHBhcnRpY2xlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBcdFx0XHR0aW1lIHRoZSBpbnRlZ3JhdGUgdGltZSAxL21zXG4gICAqIEBwYXJhbSB7SW50fSBcdFx0XHRpbmRleCB0aGUgcGFydGljbGUgaW5kZXhcbiAgICovXG4gIGNhbGN1bGF0ZShwYXJ0aWNsZSwgdGltZSwgaW5kZXgpIHtcbiAgICB0aGlzLmFnZSArPSB0aW1lO1xuXG4gICAgaWYgKHRoaXMuYWdlID49IHRoaXMubGlmZSB8fCB0aGlzLmRlYWQpIHtcbiAgICAgIHRoaXMuZW5lcmd5ID0gMDtcbiAgICAgIHRoaXMuZGVhZCA9IHRydWU7XG4gICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc2NhbGUgPSB0aGlzLmVhc2luZyhwYXJ0aWNsZS5hZ2UgLyBwYXJ0aWNsZS5saWZlKTtcbiAgICAgIHRoaXMuZW5lcmd5ID0gTWF0aC5tYXgoMSAtIHNjYWxlLCAwKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVzdG9yeSB0aGlzIGJlaGF2aW91clxuICAgKlxuICAgKiBAbWV0aG9kIGRlc3Ryb3lcbiAgICogQG1lbWJlcm9mIFByb3Rvbi5CZWhhdmlvdXJcbiAgICogQGluc3RhbmNlXG4gICAqL1xuICBkZXN0cm95KCkge1xuICAgIGxldCBpID0gdGhpcy5wYXJlbnRzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICB0aGlzLnBhcmVudHNbaV0ucmVtb3ZlQmVoYXZpb3VyKHRoaXMpO1xuICAgIH1cblxuICAgIHRoaXMucGFyZW50cy5sZW5ndGggPSAwO1xuICB9XG59XG4iLCJpbXBvcnQgVmVjdG9yMkQgZnJvbSBcIi4uL21hdGgvVmVjdG9yMkRcIjtcbmltcG9ydCBCZWhhdmlvdXIgZnJvbSBcIi4vQmVoYXZpb3VyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZvcmNlIGV4dGVuZHMgQmVoYXZpb3VyIHtcbiAgLyoqXG4gICAqIEBtZW1iZXJvZiEgUHJvdG9uI1xuICAgKiBAYXVnbWVudHMgUHJvdG9uLkJlaGF2aW91clxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGFsaWFzIFByb3Rvbi5Gb3JjZVxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gZnhcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGZ5XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gXHRcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2UuZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gbmFtZSBUaGUgQmVoYXZpb3VyIG5hbWVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGZ4LCBmeSwgbGlmZSwgZWFzaW5nKSB7XG4gICAgc3VwZXIobGlmZSwgZWFzaW5nKTtcblxuICAgIHRoaXMuZm9yY2UgPSB0aGlzLm5vcm1hbGl6ZUZvcmNlKG5ldyBWZWN0b3IyRChmeCwgZnkpKTtcbiAgICB0aGlzLm5hbWUgPSBcIkZvcmNlXCI7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhpcyBiZWhhdmlvdXIncyBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIEBtZXRob2QgcmVzZXRcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uRm9yY2VcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBmeFxuICAgKiBAcGFyYW0ge051bWJlcn0gZnlcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XSBcdFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZS5lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqL1xuICByZXNldChmeCwgZnksIGxpZmUsIGVhc2luZykge1xuICAgIHRoaXMuZm9yY2UgPSB0aGlzLm5vcm1hbGl6ZUZvcmNlKG5ldyBWZWN0b3IyRChmeCwgZnkpKTtcblxuICAgIGxpZmUgJiYgc3VwZXIucmVzZXQobGlmZSwgZWFzaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSB0aGlzIGJlaGF2aW91ciBmb3IgYWxsIHBhcnRpY2xlcyBldmVyeSB0aW1lXG4gICAqXG4gICAqIEBtZXRob2QgYXBwbHlCZWhhdmlvdXJcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uRm9yY2VcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlBhcnRpY2xlfSBwYXJ0aWNsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gdGhlIGludGVncmF0ZSB0aW1lIDEvbXNcbiAgICogQHBhcmFtIHtJbnR9IHRoZSBwYXJ0aWNsZSBpbmRleFxuICAgKi9cbiAgYXBwbHlCZWhhdmlvdXIocGFydGljbGUsIHRpbWUsIGluZGV4KSB7XG4gICAgdGhpcy5jYWxjdWxhdGUocGFydGljbGUsIHRpbWUsIGluZGV4KTtcbiAgICBwYXJ0aWNsZS5hLmFkZCh0aGlzLmZvcmNlKTtcbiAgfVxufVxuIiwiaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBWZWN0b3IyRCBmcm9tIFwiLi4vbWF0aC9WZWN0b3IyRFwiO1xuaW1wb3J0IEJlaGF2aW91ciBmcm9tIFwiLi9CZWhhdmlvdXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXR0cmFjdGlvbiBleHRlbmRzIEJlaGF2aW91ciB7XG4gIC8qKlxuICAgKiBUaGlzIGJlaGF2aW91ciBsZXQgdGhlIHBhcnRpY2xlcyBmb2xsb3cgb25lIHNwZWNpZmljIFByb3Rvbi5WZWN0b3IyRFxuICAgKlxuICAgKiBAbWVtYmVyb2YhIFByb3RvbiNcbiAgICogQGF1Z21lbnRzIFByb3Rvbi5CZWhhdmlvdXJcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBhbGlhcyBQcm90b24uQXR0cmFjdGlvblxuICAgKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb24gZm9yICdmb3JjZScgYW5kICdyYWRpdXMnXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlZlY3RvcjJEfSB0YXJnZXRQb3NpdGlvbiB0aGUgYXR0cmFjdGlvbiBwb2ludCBjb29yZGluYXRlc1xuICAgKiBAcGFyYW0ge051bWJlcn0gW2ZvcmNlPTEwMF1cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtyYWRpdXM9MTAwMF1cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XSBcdFx0XHRcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlLmVhc2VMaW5lYXJdIFx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICpcbiAgICogQHByb3BlcnR5IHtQcm90b24uVmVjdG9yMkR9IHRhcmdldFBvc2l0aW9uXG4gICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSByYWRpdXNcbiAgICogQHByb3BlcnR5IHtOdW1iZXJ9IGZvcmNlXG4gICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSByYWRpdXNTcVxuICAgKiBAcHJvcGVydHkge1Byb3Rvbi5WZWN0b3IyRH0gYXR0cmFjdGlvbkZvcmNlXG4gICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBsZW5ndGhTcVxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gbmFtZSBUaGUgQmVoYXZpb3VyIG5hbWVcbiAgICovXG4gIGNvbnN0cnVjdG9yKHRhcmdldFBvc2l0aW9uLCBmb3JjZSwgcmFkaXVzLCBsaWZlLCBlYXNpbmcpIHtcbiAgICBzdXBlcihsaWZlLCBlYXNpbmcpO1xuXG4gICAgdGhpcy50YXJnZXRQb3NpdGlvbiA9IFV0aWwuaW5pdFZhbHVlKHRhcmdldFBvc2l0aW9uLCBuZXcgVmVjdG9yMkQoKSk7XG4gICAgdGhpcy5yYWRpdXMgPSBVdGlsLmluaXRWYWx1ZShyYWRpdXMsIDEwMDApO1xuICAgIHRoaXMuZm9yY2UgPSBVdGlsLmluaXRWYWx1ZSh0aGlzLm5vcm1hbGl6ZVZhbHVlKGZvcmNlKSwgMTAwKTtcblxuICAgIHRoaXMucmFkaXVzU3EgPSB0aGlzLnJhZGl1cyAqIHRoaXMucmFkaXVzO1xuICAgIHRoaXMuYXR0cmFjdGlvbkZvcmNlID0gbmV3IFZlY3RvcjJEKCk7XG4gICAgdGhpcy5sZW5ndGhTcSA9IDA7XG5cbiAgICB0aGlzLm5hbWUgPSBcIkF0dHJhY3Rpb25cIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGlzIGJlaGF2aW91cidzIHBhcmFtZXRlcnNcbiAgICpcbiAgICogQG1ldGhvZCByZXNldFxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5BdHRyYWN0aW9uXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb24gZm9yICdmb3JjZScgYW5kICdyYWRpdXMnXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlZlY3RvcjJEfSB0YXJnZXRQb3NpdGlvbiB0aGUgYXR0cmFjdGlvbiBwb2ludCBjb29yZGluYXRlc1xuICAgKiBAcGFyYW0ge051bWJlcn0gW2ZvcmNlPTEwMF1cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtyYWRpdXM9MTAwMF1cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XSBcdFx0XHRcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlLmVhc2VMaW5lYXJdIFx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICovXG4gIHJlc2V0KHRhcmdldFBvc2l0aW9uLCBmb3JjZSwgcmFkaXVzLCBsaWZlLCBlYXNpbmcpIHtcbiAgICB0aGlzLnRhcmdldFBvc2l0aW9uID0gVXRpbC5pbml0VmFsdWUodGFyZ2V0UG9zaXRpb24sIG5ldyBWZWN0b3IyRCgpKTtcbiAgICB0aGlzLnJhZGl1cyA9IFV0aWwuaW5pdFZhbHVlKHJhZGl1cywgMTAwMCk7XG4gICAgdGhpcy5mb3JjZSA9IFV0aWwuaW5pdFZhbHVlKHRoaXMubm9ybWFsaXplVmFsdWUoZm9yY2UpLCAxMDApO1xuXG4gICAgdGhpcy5yYWRpdXNTcSA9IHRoaXMucmFkaXVzICogdGhpcy5yYWRpdXM7XG4gICAgdGhpcy5hdHRyYWN0aW9uRm9yY2UgPSBuZXcgVmVjdG9yMkQoKTtcbiAgICB0aGlzLmxlbmd0aFNxID0gMDtcblxuICAgIGxpZmUgJiYgc3VwZXIucmVzZXQobGlmZSwgZWFzaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSB0aGlzIGJlaGF2aW91ciBmb3IgYWxsIHBhcnRpY2xlcyBldmVyeSB0aW1lXG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkF0dHJhY3Rpb25cbiAgICogQG1ldGhvZCBhcHBseUJlaGF2aW91clxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uUGFydGljbGV9IHBhcnRpY2xlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBcdFx0XHR0aW1lIHRoZSBpbnRlZ3JhdGUgdGltZSAxL21zXG4gICAqIEBwYXJhbSB7SW50fSBcdFx0XHRpbmRleCB0aGUgcGFydGljbGUgaW5kZXhcbiAgICovXG4gIGFwcGx5QmVoYXZpb3VyKHBhcnRpY2xlLCB0aW1lLCBpbmRleCkge1xuICAgIHRoaXMuY2FsY3VsYXRlKHBhcnRpY2xlLCB0aW1lLCBpbmRleCk7XG5cbiAgICB0aGlzLmF0dHJhY3Rpb25Gb3JjZS5jb3B5KHRoaXMudGFyZ2V0UG9zaXRpb24pO1xuICAgIHRoaXMuYXR0cmFjdGlvbkZvcmNlLnN1YihwYXJ0aWNsZS5wKTtcbiAgICB0aGlzLmxlbmd0aFNxID0gdGhpcy5hdHRyYWN0aW9uRm9yY2UubGVuZ3RoU3EoKTtcblxuICAgIGlmICh0aGlzLmxlbmd0aFNxID4gMC4wMDAwNCAmJiB0aGlzLmxlbmd0aFNxIDwgdGhpcy5yYWRpdXNTcSkge1xuICAgICAgdGhpcy5hdHRyYWN0aW9uRm9yY2Uubm9ybWFsaXplKCk7XG4gICAgICB0aGlzLmF0dHJhY3Rpb25Gb3JjZS5tdWx0aXBseVNjYWxhcigxIC0gdGhpcy5sZW5ndGhTcSAvIHRoaXMucmFkaXVzU3EpO1xuICAgICAgdGhpcy5hdHRyYWN0aW9uRm9yY2UubXVsdGlwbHlTY2FsYXIodGhpcy5mb3JjZSk7XG5cbiAgICAgIHBhcnRpY2xlLmEuYWRkKHRoaXMuYXR0cmFjdGlvbkZvcmNlKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBWZWN0b3IyRCBmcm9tIFwiLi4vbWF0aC9WZWN0b3IyRFwiO1xuaW1wb3J0IE1hdGhVdGlsIGZyb20gXCIuLi9tYXRoL01hdGhVdGlsXCI7XG5pbXBvcnQgQmVoYXZpb3VyIGZyb20gXCIuL0JlaGF2aW91clwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSYW5kb21EcmlmdCBleHRlbmRzIEJlaGF2aW91ciB7XG4gIC8qKlxuICAgKiBAbWVtYmVyb2YhIFByb3RvbiNcbiAgICogQGF1Z21lbnRzIEJlaGF2aW91clxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGFsaWFzIFJhbmRvbURyaWZ0XG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBkcmlmdFggXHRcdFx0XHRYIHZhbHVlIG9mIHRoZSBuZXcgVmVjdG9yMkRcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGRyaWZ0WSAgXHRcdFx0XHRZIHZhbHVlIG9mIHRoZSBuZXcgVmVjdG9yMkRcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGRlbGF5IFx0XHRcdFx0SG93IG11Y2ggZGVsYXkgdGhlIGRyaWZ0IHNob3VsZCBoYXZlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gXHRcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSB0aW1lIFRoZSB0aW1lIG9mIHRoZSBkcmlmdFxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gbmFtZSBUaGUgQmVoYXZpb3VyIG5hbWVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGRyaWZ0WCwgZHJpZnRZLCBkZWxheSwgbGlmZSwgZWFzaW5nKSB7XG4gICAgc3VwZXIobGlmZSwgZWFzaW5nKTtcblxuICAgIHRoaXMucmVzZXQoZHJpZnRYLCBkcmlmdFksIGRlbGF5KTtcbiAgICB0aGlzLnRpbWUgPSAwO1xuICAgIHRoaXMubmFtZSA9IFwiUmFuZG9tRHJpZnRcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGlzIGJlaGF2aW91cidzIHBhcmFtZXRlcnNcbiAgICpcbiAgICogQG1ldGhvZCByZXNldFxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1JhbmRvbURyaWZ0XG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gZHJpZnRYIFx0XHRcdFx0WCB2YWx1ZSBvZiB0aGUgbmV3IFZlY3RvcjJEXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBkcmlmdFkgIFx0XHRcdFx0WSB2YWx1ZSBvZiB0aGUgbmV3IFZlY3RvcjJEXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBkZWxheSBcdFx0XHRcdEhvdyBtdWNoIGRlbGF5IHRoZSBkcmlmdCBzaG91bGQgaGF2ZVxuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldIFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKi9cbiAgcmVzZXQoZHJpZnRYLCBkcmlmdFksIGRlbGF5LCBsaWZlLCBlYXNpbmcpIHtcbiAgICB0aGlzLnBhbkZvY2UgPSBuZXcgVmVjdG9yMkQoZHJpZnRYLCBkcmlmdFkpO1xuICAgIHRoaXMucGFuRm9jZSA9IHRoaXMubm9ybWFsaXplRm9yY2UodGhpcy5wYW5Gb2NlKTtcbiAgICB0aGlzLmRlbGF5ID0gZGVsYXk7XG5cbiAgICBsaWZlICYmIHN1cGVyLnJlc2V0KGxpZmUsIGVhc2luZyk7XG4gIH1cblxuICBpbml0aWFsaXplKHBhcnRpY2xlKSB7XG4gICAgcGFydGljbGUuZGF0YS50aW1lID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSB0aGlzIGJlaGF2aW91ciBmb3IgYWxsIHBhcnRpY2xlcyBldmVyeSB0aW1lXG4gICAqXG4gICAqIEBtZXRob2QgYXBwbHlCZWhhdmlvdXJcbiAgICogQG1lbWJlcm9mIFByb3RvbiNSYW5kb21EcmlmdFxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtQYXJ0aWNsZX0gcGFydGljbGVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFx0XHRcdHRpbWUgdGhlIGludGVncmF0ZSB0aW1lIDEvbXNcbiAgICogQHBhcmFtIHtJbnR9IFx0XHRcdGluZGV4IHRoZSBwYXJ0aWNsZSBpbmRleFxuICAgKi9cbiAgYXBwbHlCZWhhdmlvdXIocGFydGljbGUsIHRpbWUsIGluZGV4KSB7XG4gICAgdGhpcy5jYWxjdWxhdGUocGFydGljbGUsIHRpbWUsIGluZGV4KTtcbiAgICBwYXJ0aWNsZS5kYXRhLnRpbWUgKz0gdGltZTtcblxuICAgIGlmIChwYXJ0aWNsZS5kYXRhLnRpbWUgPj0gdGhpcy5kZWxheSkge1xuICAgICAgcGFydGljbGUuYS5hZGRYWShcbiAgICAgICAgTWF0aFV0aWwucmFuZG9tQVRvQigtdGhpcy5wYW5Gb2NlLngsIHRoaXMucGFuRm9jZS54KSxcbiAgICAgICAgTWF0aFV0aWwucmFuZG9tQVRvQigtdGhpcy5wYW5Gb2NlLnksIHRoaXMucGFuRm9jZS55KVxuICAgICAgKTtcblxuICAgICAgcGFydGljbGUuZGF0YS50aW1lID0gMDtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBGb3JjZSBmcm9tIFwiLi9Gb3JjZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHcmF2aXR5IGV4dGVuZHMgRm9yY2Uge1xuICAvKipcbiAgICogQG1lbWJlcm9mISBQcm90b24jXG4gICAqIEBhdWdtZW50cyBQcm90b24jUHJvdG9uLkZvcmNlXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAYWxpYXMgUHJvdG9uLkdyYXZpdHlcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGcgXHRcdFx0XHRcdFx0XHRHcmF2aXR5XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gXHRcdFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZS5lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBuYW1lIFRoZSBCZWhhdmlvdXIgbmFtZVxuICAgKi9cbiAgY29uc3RydWN0b3IoZywgbGlmZSwgZWFzaW5nKSB7XG4gICAgc3VwZXIoMCwgZywgbGlmZSwgZWFzaW5nKTtcbiAgICB0aGlzLm5hbWUgPSBcIkdyYXZpdHlcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGlzIGJlaGF2aW91cidzIHBhcmFtZXRlcnNcbiAgICpcbiAgICogQG1ldGhvZCByZXNldFxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5HcmF2aXR5XG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gZyBcdFx0XHRcdFx0XHRcdEdyYXZpdHlcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XSBcdFx0XHRcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlLmVhc2VMaW5lYXJdIFx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICovXG4gIHJlc2V0KGcsIGxpZmUsIGVhc2luZykge1xuICAgIHN1cGVyLnJlc2V0KDAsIGcsIGxpZmUsIGVhc2luZyk7XG4gIH1cbn1cbiIsImltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgVmVjdG9yMkQgZnJvbSBcIi4uL21hdGgvVmVjdG9yMkRcIjtcbmltcG9ydCBCZWhhdmlvdXIgZnJvbSBcIi4vQmVoYXZpb3VyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbGxpc2lvbiBleHRlbmRzIEJlaGF2aW91ciB7XG4gIC8qKlxuICAgKiBUaGUgY2FsbGJhY2sgYWZ0ZXIgY29sbGlzaW9uXG4gICAqXG4gICAqIEBjYWxsYmFjayBDYWxsYmFja1xuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5QYXJ0aWNsZX0gcGFydGljbGVcbiAgICogQHBhcmFtIHtQcm90b24uUGFyaXRjbGV9IG90aGVyUGFydGljbGVcbiAgICovXG4gIC8qKlxuICAgKiBAbWVtYmVyb2YhIFByb3RvbiNcbiAgICogQGF1Z21lbnRzIFByb3Rvbi5CZWhhdmlvdXJcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBhbGlhcyBQcm90b24uQ29sbGlzaW9uXG4gICAqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvbiB0byBtYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLkVtaXR0ZXJ9IFx0W2VtaXR0ZXI9bnVsbF0gXHRcdHRoZSBhdHRyYWN0aW9uIHBvaW50IGNvb3JkaW5hdGVzXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gXHRcdFttYXNzPXRydWVdXG4gICAqIEBwYXJhbSB7Q2FsbGJhY2t9XHQgXHRbY2FsbGJhY2s9bnVsbF1cdFx0dGhlIGNhbGxiYWNrIGFmdGVyIHRoZSBjb2xsaXNpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XSBcdFx0XHRcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlLmVhc2VMaW5lYXJdIFx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICpcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IG5hbWUgVGhlIEJlaGF2aW91ciBuYW1lXG4gICAqL1xuICBjb25zdHJ1Y3RvcihlbWl0dGVyLCBtYXNzLCBjYWxsYmFjaywgbGlmZSwgZWFzaW5nKSB7XG4gICAgc3VwZXIobGlmZSwgZWFzaW5nKTtcblxuICAgIHRoaXMucmVzZXQoZW1pdHRlciwgbWFzcywgY2FsbGJhY2spO1xuICAgIHRoaXMubmFtZSA9IFwiQ29sbGlzaW9uXCI7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhpcyBiZWhhdmlvdXIncyBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkNvbGxpc2lvblxuICAgKiBAbWV0aG9kIHJlc2V0XG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb24gdG8gbWFzc1xuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5FbWl0dGVyfSBcdFtlbWl0dGVyPW51bGxdIFx0XHR0aGUgYXR0cmFjdGlvbiBwb2ludCBjb29yZGluYXRlc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFx0XHRbbWFzcz10cnVlXVxuICAgKiBAcGFyYW0ge0NhbGxiYWNrfVx0IFx0W2NhbGxiYWNrPW51bGxdXHRcdHRoZSBjYWxsYmFjayBhZnRlciB0aGUgY29sbGlzaW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBcdFx0XHRbbGlmZT1JbmZpbml0eV0gXHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZS5lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqL1xuICByZXNldChlbWl0dGVyLCBtYXNzLCBjYWxsYmFjaywgbGlmZSwgZWFzaW5nKSB7XG4gICAgdGhpcy5lbWl0dGVyID0gVXRpbC5pbml0VmFsdWUoZW1pdHRlciwgbnVsbCk7XG4gICAgdGhpcy5tYXNzID0gVXRpbC5pbml0VmFsdWUobWFzcywgdHJ1ZSk7XG4gICAgdGhpcy5jYWxsYmFjayA9IFV0aWwuaW5pdFZhbHVlKGNhbGxiYWNrLCBudWxsKTtcblxuICAgIHRoaXMuY29sbGlzaW9uUG9vbCA9IFtdO1xuICAgIHRoaXMuZGVsdGEgPSBuZXcgVmVjdG9yMkQoKTtcblxuICAgIGxpZmUgJiYgc3VwZXIucmVzZXQobGlmZSwgZWFzaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSB0aGlzIGJlaGF2aW91ciBmb3IgYWxsIHBhcnRpY2xlcyBldmVyeSB0aW1lXG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkNvbGxpc2lvblxuICAgKiBAbWV0aG9kIGFwcGx5QmVoYXZpb3VyXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5QYXJ0aWNsZX0gcGFydGljbGVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFx0XHRcdHRpbWUgdGhlIGludGVncmF0ZSB0aW1lIDEvbXNcbiAgICogQHBhcmFtIHtJbnR9IFx0XHRcdGluZGV4IHRoZSBwYXJ0aWNsZSBpbmRleFxuICAgKi9cbiAgYXBwbHlCZWhhdmlvdXIocGFydGljbGUsIHRpbWUsIGluZGV4KSB7XG4gICAgY29uc3QgbmV3UG9vbCA9IHRoaXMuZW1pdHRlciA/IHRoaXMuZW1pdHRlci5wYXJ0aWNsZXMuc2xpY2UoaW5kZXgpIDogdGhpcy5wb29sLnNsaWNlKGluZGV4KTtcbiAgICBjb25zdCBsZW5ndGggPSBuZXdQb29sLmxlbmd0aDtcblxuICAgIGxldCBvdGhlclBhcnRpY2xlO1xuICAgIGxldCBsZW5ndGhTcTtcbiAgICBsZXQgb3ZlcmxhcDtcbiAgICBsZXQgdG90YWxNYXNzO1xuICAgIGxldCBhdmVyYWdlTWFzczEsIGF2ZXJhZ2VNYXNzMjtcbiAgICBsZXQgaTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgb3RoZXJQYXJ0aWNsZSA9IG5ld1Bvb2xbaV07XG5cbiAgICAgIGlmIChvdGhlclBhcnRpY2xlICE9PSBwYXJ0aWNsZSkge1xuICAgICAgICB0aGlzLmRlbHRhLmNvcHkob3RoZXJQYXJ0aWNsZS5wKTtcbiAgICAgICAgdGhpcy5kZWx0YS5zdWIocGFydGljbGUucCk7XG5cbiAgICAgICAgbGVuZ3RoU3EgPSB0aGlzLmRlbHRhLmxlbmd0aFNxKCk7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlID0gcGFydGljbGUucmFkaXVzICsgb3RoZXJQYXJ0aWNsZS5yYWRpdXM7XG5cbiAgICAgICAgaWYgKGxlbmd0aFNxIDw9IGRpc3RhbmNlICogZGlzdGFuY2UpIHtcbiAgICAgICAgICBvdmVybGFwID0gZGlzdGFuY2UgLSBNYXRoLnNxcnQobGVuZ3RoU3EpO1xuICAgICAgICAgIG92ZXJsYXAgKz0gMC41O1xuXG4gICAgICAgICAgdG90YWxNYXNzID0gcGFydGljbGUubWFzcyArIG90aGVyUGFydGljbGUubWFzcztcbiAgICAgICAgICBhdmVyYWdlTWFzczEgPSB0aGlzLm1hc3MgPyBvdGhlclBhcnRpY2xlLm1hc3MgLyB0b3RhbE1hc3MgOiAwLjU7XG4gICAgICAgICAgYXZlcmFnZU1hc3MyID0gdGhpcy5tYXNzID8gcGFydGljbGUubWFzcyAvIHRvdGFsTWFzcyA6IDAuNTtcblxuICAgICAgICAgIHBhcnRpY2xlLnAuYWRkKFxuICAgICAgICAgICAgdGhpcy5kZWx0YVxuICAgICAgICAgICAgICAuY2xvbmUoKVxuICAgICAgICAgICAgICAubm9ybWFsaXplKClcbiAgICAgICAgICAgICAgLm11bHRpcGx5U2NhbGFyKG92ZXJsYXAgKiAtYXZlcmFnZU1hc3MxKVxuICAgICAgICAgICk7XG4gICAgICAgICAgb3RoZXJQYXJ0aWNsZS5wLmFkZCh0aGlzLmRlbHRhLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKG92ZXJsYXAgKiBhdmVyYWdlTWFzczIpKTtcblxuICAgICAgICAgIHRoaXMuY2FsbGJhY2sgJiYgdGhpcy5jYWxsYmFjayhwYXJ0aWNsZSwgb3RoZXJQYXJ0aWNsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgQmVoYXZpb3VyIGZyb20gXCIuL0JlaGF2aW91clwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDcm9zc1pvbmUgZXh0ZW5kcyBCZWhhdmlvdXIge1xuICAvKipcbiAgICogRGVmaW5lcyB3aGF0IGhhcHBlbnMgaWYgdGhlIHBhcnRpY2xlcyBjb21lIHRvIHRoZSBlbmQgb2YgdGhlIHNwZWNpZmllZCB6b25lXG4gICAqXG4gICAqIEBtZW1iZXJvZiEgUHJvdG9uI1xuICAgKiBAYXVnbWVudHMgUHJvdG9uLkJlaGF2aW91clxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGFsaWFzIFByb3Rvbi5Dcm9zc1pvbmVcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uWm9uZX0gem9uZSBcdFx0XHRcdFx0XHRjYW4gYmUgYW55IFByb3Rvbi5ab25lIC0gZS5nLiBQcm90b24uUmVjdFpvbmUoKVxuICAgKiBAcGFyYW0ge1N0cmluZ30gXHRcdFtjcm9zc1R5cGU9ZGVhZF0gXHRcdFx0d2hhdCBoYXBwZW5zIGlmIHRoZSBwYXJ0aWNsZXMgcGFzcyB0aGUgem9uZSAtIGFsbG93ZWQgc3RyaW5nczogZGVhZCB8IGJvdW5kIHwgY3Jvc3NcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFx0XHRbbGlmZT1JbmZpbml0eV0gXHRcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBcdFx0W2Vhc2luZz1lYXNlLmVhc2VMaW5lYXJdIFx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICpcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IG5hbWUgVGhlIEJlaGF2aW91ciBuYW1lXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih6b25lLCBjcm9zc1R5cGUsIGxpZmUsIGVhc2luZykge1xuICAgIHN1cGVyKGxpZmUsIGVhc2luZyk7XG5cbiAgICB0aGlzLnJlc2V0KHpvbmUsIGNyb3NzVHlwZSk7XG4gICAgdGhpcy5uYW1lID0gXCJDcm9zc1pvbmVcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGlzIGJlaGF2aW91cidzIHBhcmFtZXRlcnNcbiAgICpcbiAgICogQG1ldGhvZCByZXNldFxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5Dcm9zc1pvbmVcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlpvbmV9IHpvbmUgXHRcdFx0XHRjYW4gYmUgYW55IFByb3Rvbi5ab25lIC0gZS5nLiBQcm90b24uUmVjdFpvbmUoKVxuICAgKiBAcGFyYW0ge1N0cmluZ30gXHRcdFtjcm9zc1R5cGU9ZGVhZF0gXHR3aGF0IGhhcHBlbnMgaWYgdGhlIHBhcnRpY2xlcyBwYXNzIHRoZSB6b25lIC0gYWxsb3dlZCBzdHJpbmdzOiBkZWFkIHwgYm91bmQgfCBjcm9zc1xuICAgKiBAcGFyYW0ge051bWJlcn0gXHRcdFtsaWZlPUluZmluaXR5XSBcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gXHRcdFtlYXNpbmc9ZWFzZUxpbmVhcl1cdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqL1xuICByZXNldCh6b25lLCBjcm9zc1R5cGUsIGxpZmUsIGVhc2luZykge1xuICAgIHRoaXMuem9uZSA9IHpvbmU7XG4gICAgdGhpcy56b25lLmNyb3NzVHlwZSA9IFV0aWwuaW5pdFZhbHVlKGNyb3NzVHlwZSwgXCJkZWFkXCIpO1xuXG4gICAgbGlmZSAmJiBzdXBlci5yZXNldChsaWZlLCBlYXNpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IHRoaXMgYmVoYXZpb3VyIGZvciBhbGwgcGFydGljbGVzIGV2ZXJ5IHRpbWVcbiAgICpcbiAgICogQG1ldGhvZCBhcHBseUJlaGF2aW91clxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5Dcm9zc1pvbmVcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlBhcnRpY2xlfSBwYXJ0aWNsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gdGhlIGludGVncmF0ZSB0aW1lIDEvbXNcbiAgICogQHBhcmFtIHtJbnR9IHRoZSBwYXJ0aWNsZSBpbmRleFxuICAgKi9cbiAgYXBwbHlCZWhhdmlvdXIocGFydGljbGUsIHRpbWUsIGluZGV4KSB7XG4gICAgdGhpcy5jYWxjdWxhdGUocGFydGljbGUsIHRpbWUsIGluZGV4KTtcbiAgICB0aGlzLnpvbmUuY3Jvc3NpbmcocGFydGljbGUpO1xuICB9XG59XG4iLCJpbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IFNwYW4gZnJvbSBcIi4uL21hdGgvU3BhblwiO1xuaW1wb3J0IEJlaGF2aW91ciBmcm9tIFwiLi9CZWhhdmlvdXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWxwaGEgZXh0ZW5kcyBCZWhhdmlvdXIge1xuICAvKipcbiAgICogQG1lbWJlcm9mISBQcm90b24jXG4gICAqIEBhdWdtZW50cyBQcm90b24uQmVoYXZpb3VyXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAYWxpYXMgUHJvdG9uLkFscGhhXG4gICAqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvbiBmb3IgJ2EnIGFuZCAnYidcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGFcbiAgICogQHBhcmFtIHtTdHJpbmd9IGJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XSBcdFx0XHRcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlLmVhc2VMaW5lYXJdIFx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICpcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IG5hbWUgVGhlIEJlaGF2aW91ciBuYW1lXG4gICAqL1xuICBjb25zdHJ1Y3RvcihhLCBiLCBsaWZlLCBlYXNpbmcpIHtcbiAgICBzdXBlcihsaWZlLCBlYXNpbmcpO1xuXG4gICAgdGhpcy5yZXNldChhLCBiKTtcbiAgICB0aGlzLm5hbWUgPSBcIkFscGhhXCI7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhpcyBiZWhhdmlvdXIncyBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIEBtZXRob2QgcmVzZXRcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uQWxwaGFcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvbiBmb3IgJ2EnIGFuZCAnYidcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGFcbiAgICogQHBhcmFtIHtTdHJpbmd9IGJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XSBcdFx0XHRcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlLmVhc2VMaW5lYXJdIFx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICovXG4gIHJlc2V0KGEsIGIsIGxpZmUsIGVhc2luZykge1xuICAgIHRoaXMuc2FtZSA9IGIgPT09IG51bGwgfHwgYiA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IGZhbHNlO1xuICAgIHRoaXMuYSA9IFNwYW4uc2V0U3BhblZhbHVlKFV0aWwuaW5pdFZhbHVlKGEsIDEpKTtcbiAgICB0aGlzLmIgPSBTcGFuLnNldFNwYW5WYWx1ZShiKTtcblxuICAgIGxpZmUgJiYgc3VwZXIucmVzZXQobGlmZSwgZWFzaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBuZXcgYWxwaGEgdmFsdWUgb2YgdGhlIHBhcnRpY2xlXG4gICAqXG4gICAqIEBtZXRob2QgaW5pdGlhbGl6ZVxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5BbHBoYVxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uUGFydGljbGV9IHBhcnRpY2xlIEEgc2luZ2xlIFByb3RvbiBnZW5lcmF0ZWQgcGFydGljbGVcbiAgICovXG4gIGluaXRpYWxpemUocGFydGljbGUpIHtcbiAgICBwYXJ0aWNsZS5kYXRhLmFscGhhQSA9IHRoaXMuYS5nZXRWYWx1ZSgpO1xuXG4gICAgaWYgKHRoaXMuc2FtZSkgcGFydGljbGUuZGF0YS5hbHBoYUIgPSBwYXJ0aWNsZS5kYXRhLmFscGhhQTtcbiAgICBlbHNlIHBhcnRpY2xlLmRhdGEuYWxwaGFCID0gdGhpcy5iLmdldFZhbHVlKCk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBhcHBseUJlaGF2aW91clxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5BbHBoYVxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uUGFydGljbGV9IHBhcnRpY2xlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBcdFx0XHR0aW1lIHRoZSBpbnRlZ3JhdGUgdGltZSAxL21zXG4gICAqIEBwYXJhbSB7SW50fSBcdFx0XHRpbmRleCB0aGUgcGFydGljbGUgaW5kZXhcbiAgICovXG4gIGFwcGx5QmVoYXZpb3VyKHBhcnRpY2xlLCB0aW1lLCBpbmRleCkge1xuICAgIHRoaXMuY2FsY3VsYXRlKHBhcnRpY2xlLCB0aW1lLCBpbmRleCk7XG5cbiAgICBwYXJ0aWNsZS5hbHBoYSA9IHBhcnRpY2xlLmRhdGEuYWxwaGFCICsgKHBhcnRpY2xlLmRhdGEuYWxwaGFBIC0gcGFydGljbGUuZGF0YS5hbHBoYUIpICogdGhpcy5lbmVyZ3k7XG5cbiAgICBpZiAocGFydGljbGUuYWxwaGEgPCAwLjAwMSkgcGFydGljbGUuYWxwaGEgPSAwO1xuICB9XG59XG4iLCJpbXBvcnQgU3BhbiBmcm9tIFwiLi4vbWF0aC9TcGFuXCI7XG5pbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IEJlaGF2aW91ciBmcm9tIFwiLi9CZWhhdmlvdXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2NhbGUgZXh0ZW5kcyBCZWhhdmlvdXIge1xuICAvKipcbiAgICogQG1lbWJlcm9mISBQcm90b24jXG4gICAqIEBhdWdtZW50cyBQcm90b24uQmVoYXZpb3VyXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAYWxpYXMgUHJvdG9uLlNjYWxlXG4gICAqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvbiBmb3IgJ2EnIGFuZCAnYidcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGFcbiAgICogQHBhcmFtIHtTdHJpbmd9IGJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XSBcdFx0XHRcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlLmVhc2VMaW5lYXJdIFx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICpcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IG5hbWUgVGhlIEJlaGF2aW91ciBuYW1lXG4gICAqL1xuICBjb25zdHJ1Y3RvcihhLCBiLCBsaWZlLCBlYXNpbmcpIHtcbiAgICBzdXBlcihsaWZlLCBlYXNpbmcpO1xuXG4gICAgdGhpcy5yZXNldChhLCBiKTtcbiAgICB0aGlzLm5hbWUgPSBcIlNjYWxlXCI7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhpcyBiZWhhdmlvdXIncyBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIEBtZXRob2QgcmVzZXRcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uU2NhbGVcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBhXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBiXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gXHRcdFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZS5lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqL1xuICByZXNldChhLCBiLCBsaWZlLCBlYXNpbmcpIHtcbiAgICB0aGlzLnNhbWUgPSBiID09PSBudWxsIHx8IGIgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBmYWxzZTtcbiAgICB0aGlzLmEgPSBTcGFuLnNldFNwYW5WYWx1ZShVdGlsLmluaXRWYWx1ZShhLCAxKSk7XG4gICAgdGhpcy5iID0gU3Bhbi5zZXRTcGFuVmFsdWUoYik7XG5cbiAgICBsaWZlICYmIHN1cGVyLnJlc2V0KGxpZmUsIGVhc2luZyk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgYmVoYXZpb3VyJ3MgcGFyYW1ldGVycyBmb3IgYWxsIHBhcnRpY2xlc1xuICAgKlxuICAgKiBAbWV0aG9kIGluaXRpYWxpemVcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uU2NhbGVcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlBhcnRpY2xlfSBwYXJ0aWNsZVxuICAgKi9cbiAgaW5pdGlhbGl6ZShwYXJ0aWNsZSkge1xuICAgIHBhcnRpY2xlLmRhdGEuc2NhbGVBID0gdGhpcy5hLmdldFZhbHVlKCk7XG4gICAgcGFydGljbGUuZGF0YS5vbGRSYWRpdXMgPSBwYXJ0aWNsZS5yYWRpdXM7XG4gICAgcGFydGljbGUuZGF0YS5zY2FsZUIgPSB0aGlzLnNhbWUgPyBwYXJ0aWNsZS5kYXRhLnNjYWxlQSA6IHRoaXMuYi5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IHRoaXMgYmVoYXZpb3VyIGZvciBhbGwgcGFydGljbGVzIGV2ZXJ5IHRpbWVcbiAgICpcbiAgICogQG1ldGhvZCBhcHBseUJlaGF2aW91clxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5TY2FsZVxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uUGFydGljbGV9IHBhcnRpY2xlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBcdFx0XHR0aW1lIHRoZSBpbnRlZ3JhdGUgdGltZSAxL21zXG4gICAqIEBwYXJhbSB7SW50fSBcdFx0XHRpbmRleCB0aGUgcGFydGljbGUgaW5kZXhcbiAgICovXG4gIGFwcGx5QmVoYXZpb3VyKHBhcnRpY2xlLCB0aW1lLCBpbmRleCkge1xuICAgIHRoaXMuY2FsY3VsYXRlKHBhcnRpY2xlLCB0aW1lLCBpbmRleCk7XG4gICAgcGFydGljbGUuc2NhbGUgPSBwYXJ0aWNsZS5kYXRhLnNjYWxlQiArIChwYXJ0aWNsZS5kYXRhLnNjYWxlQSAtIHBhcnRpY2xlLmRhdGEuc2NhbGVCKSAqIHRoaXMuZW5lcmd5O1xuXG4gICAgaWYgKHBhcnRpY2xlLnNjYWxlIDwgMC4wMDAxKSBwYXJ0aWNsZS5zY2FsZSA9IDA7XG4gICAgcGFydGljbGUucmFkaXVzID0gcGFydGljbGUuZGF0YS5vbGRSYWRpdXMgKiBwYXJ0aWNsZS5zY2FsZTtcbiAgfVxufVxuIiwiaW1wb3J0IFNwYW4gZnJvbSBcIi4uL21hdGgvU3BhblwiO1xuaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBCZWhhdmlvdXIgZnJvbSBcIi4vQmVoYXZpb3VyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJvdGF0ZSBleHRlbmRzIEJlaGF2aW91ciB7XG4gIC8qKlxuICAgKiBAbWVtYmVyb2YhIFByb3RvbiNcbiAgICogQGF1Z21lbnRzIFByb3Rvbi5CZWhhdmlvdXJcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBhbGlhcyBQcm90b24uUm90YXRlXG4gICAqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvbiBmb3IgJ2EnLCAnYicgYW5kICdzdHlsZSdcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtpbmZsdWVuY2U9VmVsb2NpdHldIFRoZSByb3RhdGlvbidzIGluZmx1ZW5jZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gYlxuICAgKiBAcGFyYW0ge1N0cmluZ30gW3N0eWxlPXRvXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldIFx0XHRcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2UuZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gbmFtZSBUaGUgQmVoYXZpb3VyIG5hbWVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGluZmx1ZW5jZSwgYiwgc3R5bGUsIGxpZmUsIGVhc2luZykge1xuICAgIHN1cGVyKGxpZmUsIGVhc2luZyk7XG5cbiAgICB0aGlzLnJlc2V0KGluZmx1ZW5jZSwgYiwgc3R5bGUpO1xuICAgIHRoaXMubmFtZSA9IFwiUm90YXRlXCI7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhpcyBiZWhhdmlvdXIncyBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIEBtZXRob2QgcmVzZXRcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uUm90YXRlXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb24gZm9yICdhJywgJ2InIGFuZCAnc3R5bGUnXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBhXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBiXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbc3R5bGU9dG9dXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gXHRcdFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZS5lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqL1xuICByZXNldChhLCBiLCBzdHlsZSwgbGlmZSwgZWFzaW5nKSB7XG4gICAgdGhpcy5zYW1lID0gYiA9PT0gbnVsbCB8fCBiID09PSB1bmRlZmluZWQgPyB0cnVlIDogZmFsc2U7XG5cbiAgICB0aGlzLmEgPSBTcGFuLnNldFNwYW5WYWx1ZShVdGlsLmluaXRWYWx1ZShhLCBcIlZlbG9jaXR5XCIpKTtcbiAgICB0aGlzLmIgPSBTcGFuLnNldFNwYW5WYWx1ZShVdGlsLmluaXRWYWx1ZShiLCAwKSk7XG4gICAgdGhpcy5zdHlsZSA9IFV0aWwuaW5pdFZhbHVlKHN0eWxlLCBcInRvXCIpO1xuXG4gICAgbGlmZSAmJiBzdXBlci5yZXNldChsaWZlLCBlYXNpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGJlaGF2aW91cidzIHBhcmFtZXRlcnMgZm9yIGFsbCBwYXJ0aWNsZXNcbiAgICpcbiAgICogQG1ldGhvZCBpbml0aWFsaXplXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlJvdGF0ZVxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uUGFydGljbGV9IHBhcnRpY2xlXG4gICAqL1xuICBpbml0aWFsaXplKHBhcnRpY2xlKSB7XG4gICAgcGFydGljbGUucm90YXRpb24gPSB0aGlzLmEuZ2V0VmFsdWUoKTtcbiAgICBwYXJ0aWNsZS5kYXRhLnJvdGF0aW9uQSA9IHRoaXMuYS5nZXRWYWx1ZSgpO1xuXG4gICAgaWYgKCF0aGlzLnNhbWUpIHBhcnRpY2xlLmRhdGEucm90YXRpb25CID0gdGhpcy5iLmdldFZhbHVlKCk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgdGhpcyBiZWhhdmlvdXIgZm9yIGFsbCBwYXJ0aWNsZXMgZXZlcnkgdGltZVxuICAgKlxuICAgKiBAbWV0aG9kIGFwcGx5QmVoYXZpb3VyXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlJvdGF0ZVxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uUGFydGljbGV9IHBhcnRpY2xlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBcdFx0XHR0aW1lIHRoZSBpbnRlZ3JhdGUgdGltZSAxL21zXG4gICAqIEBwYXJhbSB7SW50fSBcdFx0XHRpbmRleCB0aGUgcGFydGljbGUgaW5kZXhcbiAgICovXG4gIGFwcGx5QmVoYXZpb3VyKHBhcnRpY2xlLCB0aW1lLCBpbmRleCkge1xuICAgIHRoaXMuY2FsY3VsYXRlKHBhcnRpY2xlLCB0aW1lLCBpbmRleCk7XG5cbiAgICBpZiAoIXRoaXMuc2FtZSkge1xuICAgICAgaWYgKHRoaXMuc3R5bGUgPT09IFwidG9cIiB8fCB0aGlzLnN0eWxlID09PSBcIlRPXCIgfHwgdGhpcy5zdHlsZSA9PT0gXCJfXCIpIHtcbiAgICAgICAgcGFydGljbGUucm90YXRpb24gKz1cbiAgICAgICAgICBwYXJ0aWNsZS5kYXRhLnJvdGF0aW9uQiArIChwYXJ0aWNsZS5kYXRhLnJvdGF0aW9uQSAtIHBhcnRpY2xlLmRhdGEucm90YXRpb25CKSAqIHRoaXMuZW5lcmd5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFydGljbGUucm90YXRpb24gKz0gcGFydGljbGUuZGF0YS5yb3RhdGlvbkI7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmEuYSA9PT0gXCJWXCIgfHwgdGhpcy5hLmEgPT09IFwiVmVsb2NpdHlcIiB8fCB0aGlzLmEuYSA9PT0gXCJ2XCIpIHtcbiAgICAgIC8vIGJldGEuLi5cbiAgICAgIHBhcnRpY2xlLnJvdGF0aW9uID0gcGFydGljbGUuZ2V0RGlyZWN0aW9uKCk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgQ29sb3JVdGlsIGZyb20gXCIuLi91dGlscy9Db2xvclV0aWxcIjtcbmltcG9ydCBBcnJheVNwYW4gZnJvbSBcIi4uL21hdGgvQXJyYXlTcGFuXCI7XG5pbXBvcnQgQmVoYXZpb3VyIGZyb20gXCIuL0JlaGF2aW91clwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb2xvciBleHRlbmRzIEJlaGF2aW91ciB7XG4gIC8qKlxuICAgKiBAbWVtYmVyb2YhIFByb3RvbiNcbiAgICogQGF1Z21lbnRzIFByb3Rvbi5CZWhhdmlvdXJcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBhbGlhcyBQcm90b24uQ29sb3JcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uQXJyYXlTcGFuIHwgU3RyaW5nfSBhIHRoZSBzdHJpbmcgc2hvdWxkIGJlIGEgaGV4IGUuZy4gIzAwMDAwMCBmb3IgYmxhY2tcbiAgICogQHBhcmFtIHtQcm90b24uQXJyYXlTcGFuIHwgU3RyaW5nfSBiIHRoZSBzdHJpbmcgc2hvdWxkIGJlIGEgaGV4IGUuZy4gIzAwMDAwMCBmb3IgYmxhY2tcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XSBcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBuYW1lIFRoZSBCZWhhdmlvdXIgbmFtZVxuICAgKi9cbiAgY29uc3RydWN0b3IoYSwgYiwgbGlmZSwgZWFzaW5nKSB7XG4gICAgc3VwZXIobGlmZSwgZWFzaW5nKTtcblxuICAgIHRoaXMucmVzZXQoYSwgYik7XG4gICAgdGhpcy5uYW1lID0gXCJDb2xvclwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoaXMgYmVoYXZpb3VyJ3MgcGFyYW1ldGVyc1xuICAgKlxuICAgKiBAbWV0aG9kIHJlc2V0XG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkNvbG9yXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5BcnJheVNwYW4gfCBTdHJpbmd9IGEgdGhlIHN0cmluZyBzaG91bGQgYmUgYSBoZXggZS5nLiAjMDAwMDAwIGZvciBibGFja1xuICAgKiBAcGFyYW0ge1Byb3Rvbi5BcnJheVNwYW4gfCBTdHJpbmd9IGIgdGhlIHN0cmluZyBzaG91bGQgYmUgYSBoZXggZS5nLiAjMDAwMDAwIGZvciBibGFja1xuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldIFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2VMaW5lYXJdIFx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICovXG4gIHJlc2V0KGEsIGIsIGxpZmUsIGVhc2luZykge1xuICAgIHRoaXMuYSA9IEFycmF5U3Bhbi5jcmVhdGVBcnJheVNwYW4oYSk7XG4gICAgdGhpcy5iID0gQXJyYXlTcGFuLmNyZWF0ZUFycmF5U3BhbihiKTtcbiAgICBsaWZlICYmIHN1cGVyLnJlc2V0KGxpZmUsIGVhc2luZyk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgYmVoYXZpb3VyJ3MgcGFyYW1ldGVycyBmb3IgYWxsIHBhcnRpY2xlc1xuICAgKlxuICAgKiBAbWV0aG9kIGluaXRpYWxpemVcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uQ29sb3JcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlBhcnRpY2xlfSBwYXJ0aWNsZVxuICAgKi9cbiAgaW5pdGlhbGl6ZShwYXJ0aWNsZSkge1xuICAgIHBhcnRpY2xlLmNvbG9yID0gdGhpcy5hLmdldFZhbHVlKCk7XG4gICAgcGFydGljbGUuZGF0YS5jb2xvckEgPSBDb2xvclV0aWwuaGV4VG9SZ2IocGFydGljbGUuY29sb3IpO1xuXG4gICAgaWYgKHRoaXMuYikgcGFydGljbGUuZGF0YS5jb2xvckIgPSBDb2xvclV0aWwuaGV4VG9SZ2IodGhpcy5iLmdldFZhbHVlKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IHRoaXMgYmVoYXZpb3VyIGZvciBhbGwgcGFydGljbGVzIGV2ZXJ5IHRpbWVcbiAgICpcbiAgICogQG1ldGhvZCBhcHBseUJlaGF2aW91clxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5Db2xvclxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uUGFydGljbGV9IHBhcnRpY2xlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB0aGUgaW50ZWdyYXRlIHRpbWUgMS9tc1xuICAgKiBAcGFyYW0ge0ludH0gdGhlIHBhcnRpY2xlIGluZGV4XG4gICAqL1xuICBhcHBseUJlaGF2aW91cihwYXJ0aWNsZSwgdGltZSwgaW5kZXgpIHtcbiAgICBpZiAodGhpcy5iKSB7XG4gICAgICB0aGlzLmNhbGN1bGF0ZShwYXJ0aWNsZSwgdGltZSwgaW5kZXgpO1xuXG4gICAgICBwYXJ0aWNsZS5yZ2IuciA9IHBhcnRpY2xlLmRhdGEuY29sb3JCLnIgKyAocGFydGljbGUuZGF0YS5jb2xvckEuciAtIHBhcnRpY2xlLmRhdGEuY29sb3JCLnIpICogdGhpcy5lbmVyZ3k7XG4gICAgICBwYXJ0aWNsZS5yZ2IuZyA9IHBhcnRpY2xlLmRhdGEuY29sb3JCLmcgKyAocGFydGljbGUuZGF0YS5jb2xvckEuZyAtIHBhcnRpY2xlLmRhdGEuY29sb3JCLmcpICogdGhpcy5lbmVyZ3k7XG4gICAgICBwYXJ0aWNsZS5yZ2IuYiA9IHBhcnRpY2xlLmRhdGEuY29sb3JCLmIgKyAocGFydGljbGUuZGF0YS5jb2xvckEuYiAtIHBhcnRpY2xlLmRhdGEuY29sb3JCLmIpICogdGhpcy5lbmVyZ3k7XG5cbiAgICAgIHBhcnRpY2xlLnJnYi5yID0gcGFydGljbGUucmdiLnIgPDwgMDtcbiAgICAgIHBhcnRpY2xlLnJnYi5nID0gcGFydGljbGUucmdiLmcgPDwgMDtcbiAgICAgIHBhcnRpY2xlLnJnYi5iID0gcGFydGljbGUucmdiLmIgPDwgMDtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFydGljbGUucmdiLnIgPSBwYXJ0aWNsZS5kYXRhLmNvbG9yQS5yO1xuICAgICAgcGFydGljbGUucmdiLmcgPSBwYXJ0aWNsZS5kYXRhLmNvbG9yQS5nO1xuICAgICAgcGFydGljbGUucmdiLmIgPSBwYXJ0aWNsZS5kYXRhLmNvbG9yQS5iO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IE1hdGhVdGlsIGZyb20gXCIuLi9tYXRoL01hdGhVdGlsXCI7XG5pbXBvcnQgVmVjdG9yMkQgZnJvbSBcIi4uL21hdGgvVmVjdG9yMkRcIjtcbmltcG9ydCBTcGFuIGZyb20gXCIuLi9tYXRoL1NwYW5cIjtcbmltcG9ydCBCZWhhdmlvdXIgZnJvbSBcIi4vQmVoYXZpb3VyXCI7XG5cbmNvbnN0IENIQU5HSU5HID0gXCJjaGFuZ2luZ1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDeWNsb25lIGV4dGVuZHMgQmVoYXZpb3VyIHtcbiAgLyoqXG4gICAqIEBtZW1iZXJvZiEgUHJvdG9uI1xuICAgKiBAYXVnbWVudHMgUHJvdG9uLkJlaGF2aW91clxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGFsaWFzIFByb3Rvbi5DeWNsb25lXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBhbmdsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gZm9yY2VcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XSBcdFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZS5lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBuYW1lIFRoZSBCZWhhdmlvdXIgbmFtZVxuICAgKi9cbiAgY29uc3RydWN0b3IoYW5nbGUsIGZvcmNlLCBsaWZlLCBlYXNpbmcpIHtcbiAgICBzdXBlcihsaWZlLCBlYXNpbmcpO1xuICAgIHRoaXMuc2V0QW5nbGVBbmRGb3JjZShhbmdsZSwgZm9yY2UpO1xuICAgIHRoaXMubmFtZSA9IFwiQ3ljbG9uZVwiO1xuICB9XG5cbiAgc2V0QW5nbGVBbmRGb3JjZShhbmdsZSwgZm9yY2UpIHtcbiAgICB0aGlzLmZvcmNlID0gQ0hBTkdJTkc7XG4gICAgdGhpcy5hbmdsZSA9IE1hdGhVdGlsLlBJIC8gMjtcblxuICAgIGlmIChhbmdsZSA9PT0gXCJyaWdodFwiKSB7XG4gICAgICB0aGlzLmFuZ2xlID0gTWF0aFV0aWwuUEkgLyAyO1xuICAgIH0gZWxzZSBpZiAoYW5nbGUgPT09IFwibGVmdFwiKSB7XG4gICAgICB0aGlzLmFuZ2xlID0gLU1hdGhVdGlsLlBJIC8gMjtcbiAgICB9IGVsc2UgaWYgKGFuZ2xlID09PSBcInJhbmRvbVwiKSB7XG4gICAgICB0aGlzLmFuZ2xlID0gXCJyYW5kb21cIjtcbiAgICB9IGVsc2UgaWYgKGFuZ2xlIGluc3RhbmNlb2YgU3Bhbikge1xuICAgICAgdGhpcy5hbmdsZSA9IFwic3BhblwiO1xuICAgICAgdGhpcy5zcGFuID0gYW5nbGU7XG4gICAgfSBlbHNlIGlmIChhbmdsZSkge1xuICAgICAgdGhpcy5hbmdsZSA9IGFuZ2xlO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIFN0cmluZyhmb3JjZSkudG9Mb3dlckNhc2UoKSA9PT0gXCJjaGFuZ2luZ1wiIHx8XG4gICAgICBTdHJpbmcoZm9yY2UpLnRvTG93ZXJDYXNlKCkgPT09IFwiY2hhbmdcIiB8fFxuICAgICAgU3RyaW5nKGZvcmNlKS50b0xvd2VyQ2FzZSgpID09PSBcImF1dG9cIlxuICAgICkge1xuICAgICAgdGhpcy5mb3JjZSA9IENIQU5HSU5HO1xuICAgIH0gZWxzZSBpZiAoZm9yY2UpIHtcbiAgICAgIHRoaXMuZm9yY2UgPSBmb3JjZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhpcyBiZWhhdmlvdXIncyBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIEBtZXRob2QgcmVzZXRcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uQ3ljbG9uZVxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGFuZ2xlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBmb3JjZVxuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldIFx0XHRcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlLmVhc2VMaW5lYXJdIFx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICovXG4gIHJlc2V0KGFuZ2xlLCBmb3JjZSwgbGlmZSwgZWFzaW5nKSB7XG4gICAgdGhpcy5hbmdsZSA9IE1hdGhVdGlsLlBJIC8gMjtcbiAgICB0aGlzLnNldEFuZ2xlQW5kRm9yY2UoYW5nbGUsIGZvcmNlKTtcbiAgICBsaWZlICYmIHN1cGVyLnJlc2V0KGxpZmUsIGVhc2luZyk7XG4gIH1cblxuICBpbml0aWFsaXplKHBhcnRpY2xlKSB7XG4gICAgaWYgKHRoaXMuYW5nbGUgPT09IFwicmFuZG9tXCIpIHtcbiAgICAgIHBhcnRpY2xlLmRhdGEuY2FuZ2xlID0gTWF0aFV0aWwucmFuZG9tQVRvQigtTWF0aFV0aWwuUEksIE1hdGhVdGlsLlBJKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYW5nbGUgPT09IFwic3BhblwiKSB7XG4gICAgICBwYXJ0aWNsZS5kYXRhLmNhbmdsZSA9IHRoaXMuc3Bhbi5nZXRWYWx1ZSgpO1xuICAgIH1cblxuICAgIHBhcnRpY2xlLmRhdGEuY3ljbG9uZSA9IG5ldyBWZWN0b3IyRCgwLCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSB0aGlzIGJlaGF2aW91ciBmb3IgYWxsIHBhcnRpY2xlcyBldmVyeSB0aW1lXG4gICAqXG4gICAqIEBtZXRob2QgYXBwbHlCZWhhdmlvdXJcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uQ3ljbG9uZVxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uUGFydGljbGV9IHBhcnRpY2xlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB0aGUgaW50ZWdyYXRlIHRpbWUgMS9tc1xuICAgKiBAcGFyYW0ge0ludH0gdGhlIHBhcnRpY2xlIGluZGV4XG4gICAqL1xuICBhcHBseUJlaGF2aW91cihwYXJ0aWNsZSwgdGltZSwgaW5kZXgpIHtcbiAgICB0aGlzLmNhbGN1bGF0ZShwYXJ0aWNsZSwgdGltZSwgaW5kZXgpO1xuXG4gICAgbGV0IGxlbmd0aDtcbiAgICBsZXQgZ3JhZGllbnQgPSBwYXJ0aWNsZS52LmdldEdyYWRpZW50KCk7XG4gICAgaWYgKHRoaXMuYW5nbGUgPT09IFwicmFuZG9tXCIgfHwgdGhpcy5hbmdsZSA9PT0gXCJzcGFuXCIpIHtcbiAgICAgIGdyYWRpZW50ICs9IHBhcnRpY2xlLmRhdGEuY2FuZ2xlO1xuICAgIH0gZWxzZSB7XG4gICAgICBncmFkaWVudCArPSB0aGlzLmFuZ2xlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmZvcmNlID09PSBDSEFOR0lORykge1xuICAgICAgbGVuZ3RoID0gcGFydGljbGUudi5sZW5ndGgoKSAvIDEwMDtcbiAgICB9IGVsc2Uge1xuICAgICAgbGVuZ3RoID0gdGhpcy5mb3JjZTtcbiAgICB9XG5cbiAgICBwYXJ0aWNsZS5kYXRhLmN5Y2xvbmUueCA9IGxlbmd0aCAqIE1hdGguY29zKGdyYWRpZW50KTtcbiAgICBwYXJ0aWNsZS5kYXRhLmN5Y2xvbmUueSA9IGxlbmd0aCAqIE1hdGguc2luKGdyYWRpZW50KTtcbiAgICBwYXJ0aWNsZS5kYXRhLmN5Y2xvbmUgPSB0aGlzLm5vcm1hbGl6ZUZvcmNlKHBhcnRpY2xlLmRhdGEuY3ljbG9uZSk7XG4gICAgcGFydGljbGUuYS5hZGQocGFydGljbGUuZGF0YS5jeWNsb25lKTtcbiAgfVxufVxuIiwiaW1wb3J0IEF0dHJhY3Rpb24gZnJvbSBcIi4vQXR0cmFjdGlvblwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXB1bHNpb24gZXh0ZW5kcyBBdHRyYWN0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSBvcHBpc2l0ZSBvZiBQcm90b24uQXR0cmFjdGlvbiAtIHR1cm5zIHRoZSBmb3JjZVxuICAgKlxuICAgKiBAbWVtYmVyb2YhIFByb3RvbiNcbiAgICogQGF1Z21lbnRzIFByb3RvbiNQcm90b24uQXR0cmFjdGlvblxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGFsaWFzIFByb3Rvbi5SZXB1bHNpb25cbiAgICpcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uIGZvciAnZm9yY2UnIGFuZCAncmFkaXVzJ1xuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5WZWN0b3IyRH0gdGFyZ2V0UG9zaXRpb24gdGhlIGF0dHJhY3Rpb24gcG9pbnQgY29vcmRpbmF0ZXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtmb3JjZT0xMDBdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbcmFkaXVzPTEwMDBdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gXHRcdFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZS5lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBmb3JjZVxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gbmFtZSBUaGUgQmVoYXZpb3VyIG5hbWVcbiAgICovXG4gIGNvbnN0cnVjdG9yKHRhcmdldFBvc2l0aW9uLCBmb3JjZSwgcmFkaXVzLCBsaWZlLCBlYXNpbmcpIHtcbiAgICBzdXBlcih0YXJnZXRQb3NpdGlvbiwgZm9yY2UsIHJhZGl1cywgbGlmZSwgZWFzaW5nKTtcblxuICAgIHRoaXMuZm9yY2UgKj0gLTE7XG4gICAgdGhpcy5uYW1lID0gXCJSZXB1bHNpb25cIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGlzIGJlaGF2aW91cidzIHBhcmFtZXRlcnNcbiAgICpcbiAgICogQG1ldGhvZCByZXNldFxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5SZXB1bHNpb25cbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvbiBmb3IgJ2ZvcmNlJyBhbmQgJ3JhZGl1cydcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uVmVjdG9yMkR9IHRhcmdldFBvc2l0aW9uIHRoZSBhdHRyYWN0aW9uIHBvaW50IGNvb3JkaW5hdGVzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbZm9yY2U9MTAwXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW3JhZGl1cz0xMDAwXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldIFx0XHRcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2UuZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKi9cbiAgcmVzZXQodGFyZ2V0UG9zaXRpb24sIGZvcmNlLCByYWRpdXMsIGxpZmUsIGVhc2luZykge1xuICAgIHN1cGVyLnJlc2V0KHRhcmdldFBvc2l0aW9uLCBmb3JjZSwgcmFkaXVzLCBsaWZlLCBlYXNpbmcpO1xuICAgIHRoaXMuZm9yY2UgKj0gLTE7XG4gIH1cbn1cbiIsImltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgVmVjdG9yMkQgZnJvbSBcIi4uL21hdGgvVmVjdG9yMkRcIjtcbmltcG9ydCBCZWhhdmlvdXIgZnJvbSBcIi4vQmVoYXZpb3VyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdyYXZpdHlXZWxsIGV4dGVuZHMgQmVoYXZpb3VyIHtcbiAgLyoqXG4gICAqIEBtZW1iZXJvZiEgUHJvdG9uI1xuICAgKiBAYXVnbWVudHMgQmVoYXZpb3VyXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAYWxpYXMgR3Jhdml0eVdlbGxcbiAgICpcbiAgICogQHBhcmFtIHtWZWN0b3IyRH0gW2NlbnRlclBvaW50PW5ldyBWZWN0b3IyRF0gVGhlIHBvaW50IGluIHRoZSBjZW50ZXJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtmb3JjZT0xMDBdXHRcdFx0XHRcdFRoZSBmb3JjZVxuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldXHRcdFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZUxpbmVhcl1cdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBuYW1lIFRoZSBCZWhhdmlvdXIgbmFtZVxuICAgKi9cbiAgY29uc3RydWN0b3IoY2VudGVyUG9pbnQsIGZvcmNlLCBsaWZlLCBlYXNpbmcpIHtcbiAgICBzdXBlcihsaWZlLCBlYXNpbmcpO1xuXG4gICAgdGhpcy5kaXN0YW5jZVZlYyA9IG5ldyBWZWN0b3IyRCgpO1xuICAgIHRoaXMuY2VudGVyUG9pbnQgPSBVdGlsLmluaXRWYWx1ZShjZW50ZXJQb2ludCwgbmV3IFZlY3RvcjJEKCkpO1xuICAgIHRoaXMuZm9yY2UgPSBVdGlsLmluaXRWYWx1ZSh0aGlzLm5vcm1hbGl6ZVZhbHVlKGZvcmNlKSwgMTAwKTtcblxuICAgIHRoaXMubmFtZSA9IFwiR3Jhdml0eVdlbGxcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGlzIGJlaGF2aW91cidzIHBhcmFtZXRlcnNcbiAgICpcbiAgICogQG1ldGhvZCByZXNldFxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI0dyYXZpdHlXZWxsXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1ZlY3RvcjJEfSBbY2VudGVyUG9pbnQ9bmV3IFZlY3RvcjJEXSBUaGUgcG9pbnQgaW4gdGhlIGNlbnRlclxuICAgKiBAcGFyYW0ge051bWJlcn0gW2ZvcmNlPTEwMF1cdFx0XHRcdFx0VGhlIGZvcmNlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV1cdFx0XHRcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlTGluZWFyXVx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICovXG4gIHJlc2V0KGNlbnRlclBvaW50LCBmb3JjZSwgbGlmZSwgZWFzaW5nKSB7XG4gICAgdGhpcy5kaXN0YW5jZVZlYyA9IG5ldyBWZWN0b3IyRCgpO1xuICAgIHRoaXMuY2VudGVyUG9pbnQgPSBVdGlsLmluaXRWYWx1ZShjZW50ZXJQb2ludCwgbmV3IFZlY3RvcjJEKCkpO1xuICAgIHRoaXMuZm9yY2UgPSBVdGlsLmluaXRWYWx1ZSh0aGlzLm5vcm1hbGl6ZVZhbHVlKGZvcmNlKSwgMTAwKTtcblxuICAgIGxpZmUgJiYgc3VwZXIucmVzZXQobGlmZSwgZWFzaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdGRvY1xuICAgKi9cbiAgaW5pdGlhbGl6ZShwYXJ0aWNsZSkge31cblxuICAvKipcbiAgICogQXBwbHkgdGhpcyBiZWhhdmlvdXIgZm9yIGFsbCBwYXJ0aWNsZXMgZXZlcnkgdGltZVxuICAgKlxuICAgKiBAbWV0aG9kIGFwcGx5QmVoYXZpb3VyXG4gICAqIEBtZW1iZXJvZiBQcm90b24jR3Jhdml0eVdlbGxcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UGFydGljbGV9IHBhcnRpY2xlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB0aGUgaW50ZWdyYXRlIHRpbWUgMS9tc1xuICAgKiBAcGFyYW0ge0ludH0gdGhlIHBhcnRpY2xlIGluZGV4XG4gICAqL1xuICBhcHBseUJlaGF2aW91cihwYXJ0aWNsZSwgdGltZSwgaW5kZXgpIHtcbiAgICB0aGlzLmRpc3RhbmNlVmVjLnNldCh0aGlzLmNlbnRlclBvaW50LnggLSBwYXJ0aWNsZS5wLngsIHRoaXMuY2VudGVyUG9pbnQueSAtIHBhcnRpY2xlLnAueSk7XG4gICAgY29uc3QgZGlzdGFuY2VTcSA9IHRoaXMuZGlzdGFuY2VWZWMubGVuZ3RoU3EoKTtcblxuICAgIGlmIChkaXN0YW5jZVNxICE9PSAwKSB7XG4gICAgICBjb25zdCBkaXN0YW5jZSA9IHRoaXMuZGlzdGFuY2VWZWMubGVuZ3RoKCk7XG4gICAgICBjb25zdCBmYWN0b3IgPSAodGhpcy5mb3JjZSAqIHRpbWUpIC8gKGRpc3RhbmNlU3EgKiBkaXN0YW5jZSk7XG5cbiAgICAgIHBhcnRpY2xlLnYueCArPSBmYWN0b3IgKiB0aGlzLmRpc3RhbmNlVmVjLng7XG4gICAgICBwYXJ0aWNsZS52LnkgKz0gZmFjdG9yICogdGhpcy5kaXN0YW5jZVZlYy55O1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IFByb3BVdGlsIGZyb20gXCIuLi91dGlscy9Qcm9wVXRpbFwiO1xuaW1wb3J0IEluaXRpYWxpemUgZnJvbSBcIi4vSW5pdGlhbGl6ZVwiO1xuaW1wb3J0IE1hdGhVdGlsIGZyb20gXCIuLi9tYXRoL01hdGhVdGlsXCI7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdGlhbGl6ZShlbWl0dGVyLCBwYXJ0aWNsZSwgaW5pdGlhbGl6ZXMpIHtcbiAgICBjb25zdCBsZW5ndGggPSBpbml0aWFsaXplcy5sZW5ndGg7XG4gICAgbGV0IGk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChpbml0aWFsaXplc1tpXSBpbnN0YW5jZW9mIEluaXRpYWxpemUpIHtcbiAgICAgICAgaW5pdGlhbGl6ZXNbaV0uaW5pdChlbWl0dGVyLCBwYXJ0aWNsZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmluaXQoZW1pdHRlciwgcGFydGljbGUsIGluaXRpYWxpemVzW2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmJpbmRFbWl0dGVyKGVtaXR0ZXIsIHBhcnRpY2xlKTtcbiAgfSxcblxuICAvLyBpbml0XG4gIGluaXQoZW1pdHRlciwgcGFydGljbGUsIGluaXRpYWxpemUpIHtcbiAgICBQcm9wVXRpbC5zZXRQcm9wKHBhcnRpY2xlLCBpbml0aWFsaXplKTtcbiAgICBQcm9wVXRpbC5zZXRWZWN0b3JWYWwocGFydGljbGUsIGluaXRpYWxpemUpO1xuICB9LFxuXG4gIGJpbmRFbWl0dGVyKGVtaXR0ZXIsIHBhcnRpY2xlKSB7XG4gICAgaWYgKGVtaXR0ZXIuYmluZEVtaXR0ZXIpIHtcbiAgICAgIHBhcnRpY2xlLnAuYWRkKGVtaXR0ZXIucCk7XG4gICAgICBwYXJ0aWNsZS52LmFkZChlbWl0dGVyLnYpO1xuICAgICAgcGFydGljbGUuYS5hZGQoZW1pdHRlci5hKTtcblxuICAgICAgcGFydGljbGUudi5yb3RhdGUoTWF0aFV0aWwuZGVncmVlVHJhbnNmb3JtKGVtaXR0ZXIucm90YXRpb24pKTtcbiAgICB9XG4gIH1cbn07XG4iLCJpbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IFB1aWQgZnJvbSBcIi4uL3V0aWxzL1B1aWRcIjtcbmltcG9ydCBQYXJ0aWNsZSBmcm9tIFwiLi4vY29yZS9QYXJ0aWNsZVwiO1xuaW1wb3J0IEV2ZW50RGlzcGF0Y2hlciBmcm9tIFwiLi4vZXZlbnRzL0V2ZW50RGlzcGF0Y2hlclwiO1xuXG5pbXBvcnQgUmF0ZSBmcm9tIFwiLi4vaW5pdGlhbGl6ZS9SYXRlXCI7XG5pbXBvcnQgSW5pdGlhbGl6ZVV0aWwgZnJvbSBcIi4uL2luaXRpYWxpemUvSW5pdGlhbGl6ZVV0aWxcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRW1pdHRlciBleHRlbmRzIFBhcnRpY2xlIHtcbiAgLyoqXG4gICAqIFlvdSBjYW4gdXNlIHRoaXMgZW1pdCBwYXJ0aWNsZXMuXG4gICAqXG4gICAqIEl0IHdpbGwgZGlzcGF0Y2ggZm9sbG93IGV2ZW50czpcbiAgICogUEFSVElDTEVfQ1JFQVRFRFxuICAgKiBQQVJUSUNMRV9VUERBVEFcbiAgICogUEFSVElDTEVfREVBRFxuICAgKlxuICAgKiBAY2xhc3MgRW1pdHRlclxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtPYmplY3R9IGNvbmYgdGhlIHBhcmFtZXRlcnMgb2JqZWN0O1xuICAgKiBmb3IgZXhhbXBsZSB7ZGFtcGluZzowLjAxLGJpbmRFbWl0dGVyOmZhbHNlfVxuICAgKi9cbiAgY29uc3RydWN0b3IoY29uZiA9IHt9KSB7XG4gICAgc3VwZXIoY29uZik7XG5cbiAgICB0aGlzLnBhcnRpY2xlcyA9IFtdO1xuICAgIHRoaXMuYmVoYXZpb3VycyA9IFtdO1xuICAgIHRoaXMuaW5pdGlhbGl6ZXMgPSBbXTtcblxuICAgIHRoaXMuZW1pdFRpbWUgPSAwO1xuICAgIHRoaXMuZW1pdFNwZWVkID0gMDtcbiAgICB0aGlzLnRvdGFsVGltZSA9IC0xO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZyaWN0aW9uIGNvZWZmaWNpZW50IGZvciBhbGwgcGFydGljbGUgZW1pdCBieSBUaGlzO1xuICAgICAqIEBwcm9wZXJ0eSBkYW1waW5nXG4gICAgICogQHR5cGUge051bWJlcn1cbiAgICAgKiBAZGVmYXVsdCAwLjAwNlxuICAgICAqL1xuICAgIHRoaXMuZGFtcGluZyA9IDAuMDA2O1xuXG4gICAgLyoqXG4gICAgICogSWYgYmluZEVtaXR0ZXIgdGhlIHBhcnRpY2xlcyBjYW4gYmluZCB0aGlzIGVtaXR0ZXIncyBwcm9wZXJ0eTtcbiAgICAgKiBAcHJvcGVydHkgYmluZEVtaXR0ZXJcbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICovXG4gICAgdGhpcy5iaW5kRW1pdHRlciA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHBhcnRpY2xlcyBwZXIgc2Vjb25kIGVtaXQgKGEgW3BhcnRpY2xlXS9iIFtzXSk7XG4gICAgICogQHByb3BlcnR5IHJhdGVcbiAgICAgKiBAdHlwZSB7UmF0ZX1cbiAgICAgKiBAZGVmYXVsdCBSYXRlKDEsIC4xKVxuICAgICAqL1xuICAgIHRoaXMucmF0ZSA9IG5ldyBSYXRlKDEsIDAuMSk7XG5cbiAgICB0aGlzLm5hbWUgPSBcIkVtaXR0ZXJcIjtcbiAgICB0aGlzLmlkID0gUHVpZC5pZCh0aGlzLm5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIHN0YXJ0IGVtaXQgcGFydGljbGVcbiAgICogQG1ldGhvZCBlbWl0XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBlbWl0VGltZSBiZWdpbiBlbWl0IHRpbWU7XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBsaWZlIHRoZSBsaWZlIG9mIHRoaXMgZW1pdHRlclxuICAgKi9cbiAgZW1pdCh0b3RhbFRpbWUsIGxpZmUpIHtcbiAgICB0aGlzLnN0b3BlZCA9IGZhbHNlO1xuICAgIHRoaXMuZW1pdFRpbWUgPSAwO1xuICAgIHRoaXMudG90YWxUaW1lID0gVXRpbC5pbml0VmFsdWUodG90YWxUaW1lLCBJbmZpbml0eSk7XG5cbiAgICBpZiAobGlmZSA9PT0gdHJ1ZSB8fCBsaWZlID09PSBcImxpZmVcIiB8fCBsaWZlID09PSBcImRlc3Ryb3lcIikge1xuICAgICAgdGhpcy5saWZlID0gdG90YWxUaW1lID09PSBcIm9uY2VcIiA/IDEgOiB0aGlzLnRvdGFsVGltZTtcbiAgICB9IGVsc2UgaWYgKCFpc05hTihsaWZlKSkge1xuICAgICAgdGhpcy5saWZlID0gbGlmZTtcbiAgICB9XG5cbiAgICB0aGlzLnJhdGUuaW5pdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIHN0b3AgZW1pdGluZ1xuICAgKiBAbWV0aG9kIHN0b3BcbiAgICovXG4gIHN0b3AoKSB7XG4gICAgdGhpcy50b3RhbFRpbWUgPSAtMTtcbiAgICB0aGlzLmVtaXRUaW1lID0gMDtcbiAgICB0aGlzLnN0b3BlZCA9IHRydWU7XG4gIH1cblxuICBwcmVFbWl0KHRpbWUpIHtcbiAgICBsZXQgb2xkU3RvcGVkID0gdGhpcy5zdG9wZWQ7XG4gICAgbGV0IG9sZEVtaXRUaW1lID0gdGhpcy5lbWl0VGltZTtcbiAgICBsZXQgb2xkVG90YWxUaW1lID0gdGhpcy50b3RhbFRpbWU7XG5cbiAgICB0aGlzLnN0b3BlZCA9IGZhbHNlO1xuICAgIHRoaXMuZW1pdFRpbWUgPSAwO1xuICAgIHRoaXMudG90YWxUaW1lID0gdGltZTtcbiAgICB0aGlzLnJhdGUuaW5pdCgpO1xuXG4gICAgY29uc3Qgc3RlcCA9IDAuMDE2NztcbiAgICB3aGlsZSAodGltZSA+IHN0ZXApIHtcbiAgICAgIHRpbWUgLT0gc3RlcDtcbiAgICAgIHRoaXMudXBkYXRlKHN0ZXApO1xuICAgIH1cblxuICAgIHRoaXMuc3RvcGVkID0gb2xkU3RvcGVkO1xuICAgIHRoaXMuZW1pdFRpbWUgPSBvbGRFbWl0VGltZSArIE1hdGgubWF4KHRpbWUsIDApO1xuICAgIHRoaXMudG90YWxUaW1lID0gb2xkVG90YWxUaW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIHJlbW92ZSBjdXJyZW50IGFsbCBwYXJ0aWNsZXNcbiAgICogQG1ldGhvZCByZW1vdmVBbGxQYXJ0aWNsZXNcbiAgICovXG4gIHJlbW92ZUFsbFBhcnRpY2xlcygpIHtcbiAgICBsZXQgaSA9IHRoaXMucGFydGljbGVzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB0aGlzLnBhcnRpY2xlc1tpXS5kZWFkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBhZGQgaW5pdGlhbGl6ZSB0byB0aGlzIGVtaXR0ZXJcbiAgICogQG1ldGhvZCBhZGRTZWxmSW5pdGlhbGl6ZVxuICAgKi9cbiAgYWRkU2VsZkluaXRpYWxpemUoaW5pdGlhbGl6ZSkge1xuICAgIGlmIChpbml0aWFsaXplW1wiaW5pdFwiXSkge1xuICAgICAgaW5pdGlhbGl6ZS5pbml0KHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmluaXRBbGwoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogYWRkIHRoZSBJbml0aWFsaXplIHRvIHBhcnRpY2xlcztcbiAgICpcbiAgICogeW91IGNhbiB1c2UgaW5pdGlhbGl6ZXMgYXJyYXk6Zm9yIGV4YW1wbGUgZW1pdHRlci5hZGRJbml0aWFsaXplKGluaXRpYWxpemUxLGluaXRpYWxpemUyLGluaXRpYWxpemUzKTtcbiAgICogQG1ldGhvZCBhZGRJbml0aWFsaXplXG4gICAqIEBwYXJhbSB7SW5pdGlhbGl6ZX0gaW5pdGlhbGl6ZSBsaWtlIHRoaXMgbmV3IFJhZGl1cygxLCAxMilcbiAgICovXG4gIGFkZEluaXRpYWxpemUoLi4ucmVzdCkge1xuICAgIGxldCBpID0gcmVzdC5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkgdGhpcy5pbml0aWFsaXplcy5wdXNoKHJlc3RbaV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIHJlbW92ZSB0aGUgSW5pdGlhbGl6ZVxuICAgKiBAbWV0aG9kIHJlbW92ZUluaXRpYWxpemVcbiAgICogQHBhcmFtIHtJbml0aWFsaXplfSBpbml0aWFsaXplIGEgaW5pdGlhbGl6ZVxuICAgKi9cbiAgcmVtb3ZlSW5pdGlhbGl6ZShpbml0aWFsaXplcikge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbml0aWFsaXplcy5pbmRleE9mKGluaXRpYWxpemVyKTtcbiAgICBpZiAoaW5kZXggPiAtMSkgdGhpcy5pbml0aWFsaXplcy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIHJlbW92ZSBhbGwgSW5pdGlhbGl6ZXNcbiAgICogQG1ldGhvZCByZW1vdmVJbml0aWFsaXplcnNcbiAgICovXG4gIHJlbW92ZUFsbEluaXRpYWxpemVycygpIHtcbiAgICBVdGlsLmVtcHR5QXJyYXkodGhpcy5pbml0aWFsaXplcyk7XG4gIH1cblxuICAvKipcbiAgICogYWRkIHRoZSBCZWhhdmlvdXIgdG8gcGFydGljbGVzO1xuICAgKlxuICAgKiB5b3UgY2FuIHVzZSBCZWhhdmlvdXJzIGFycmF5OmVtaXR0ZXIuYWRkQmVoYXZpb3VyKEJlaGF2aW91cjEsQmVoYXZpb3VyMixCZWhhdmlvdXIzKTtcbiAgICogQG1ldGhvZCBhZGRCZWhhdmlvdXJcbiAgICogQHBhcmFtIHtCZWhhdmlvdXJ9IGJlaGF2aW91ciBsaWtlIHRoaXMgbmV3IENvbG9yKCdyYW5kb20nKVxuICAgKi9cbiAgYWRkQmVoYXZpb3VyKC4uLnJlc3QpIHtcbiAgICBsZXQgaSA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgbGV0IGJlaGF2aW91ciA9IHJlc3RbaV07XG4gICAgICB0aGlzLmJlaGF2aW91cnMucHVzaChiZWhhdmlvdXIpO1xuICAgICAgaWYgKGJlaGF2aW91ci5wYXJlbnRzKSBiZWhhdmlvdXIucGFyZW50cy5wdXNoKHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiByZW1vdmUgdGhlIEJlaGF2aW91clxuICAgKiBAbWV0aG9kIHJlbW92ZUJlaGF2aW91clxuICAgKiBAcGFyYW0ge0JlaGF2aW91cn0gYmVoYXZpb3VyIGEgYmVoYXZpb3VyXG4gICAqL1xuICByZW1vdmVCZWhhdmlvdXIoYmVoYXZpb3VyKSB7XG4gICAgbGV0IGluZGV4ID0gdGhpcy5iZWhhdmlvdXJzLmluZGV4T2YoYmVoYXZpb3VyKTtcbiAgICB0aGlzLmJlaGF2aW91cnMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgIGlmIChiZWhhdmlvdXIucGFyZW50cykge1xuICAgICAgaW5kZXggPSBiZWhhdmlvdXIucGFyZW50cy5pbmRleE9mKGJlaGF2aW91cik7XG4gICAgICBiZWhhdmlvdXIucGFyZW50cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cblxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiByZW1vdmUgYWxsIGJlaGF2aW91cnNcbiAgICogQG1ldGhvZCByZW1vdmVBbGxCZWhhdmlvdXJzXG4gICAqL1xuICByZW1vdmVBbGxCZWhhdmlvdXJzKCkge1xuICAgIFV0aWwuZW1wdHlBcnJheSh0aGlzLmJlaGF2aW91cnMpO1xuICB9XG5cbiAgLy8gZW1pdHRlciB1cGRhdGVcbiAgdXBkYXRlKHRpbWUpIHtcbiAgICB0aGlzLmFnZSArPSB0aW1lO1xuICAgIGlmICh0aGlzLmFnZSA+PSB0aGlzLmxpZmUgfHwgdGhpcy5kZWFkKSB0aGlzLmRlc3Ryb3koKTtcblxuICAgIHRoaXMuZW1pdHRpbmcodGltZSk7XG4gICAgdGhpcy5pbnRlZ3JhdGUodGltZSk7XG4gIH1cblxuICBpbnRlZ3JhdGUodGltZSkge1xuICAgIGlmICghdGhpcy5wYXJlbnQpIHJldHVybjtcblxuICAgIGNvbnN0IGRhbXBpbmcgPSAxIC0gdGhpcy5kYW1waW5nO1xuICAgIHRoaXMucGFyZW50LmludGVncmF0b3IuY2FsY3VsYXRlKHRoaXMsIHRpbWUsIGRhbXBpbmcpO1xuXG4gICAgY29uc3QgbGVuZ3RoID0gdGhpcy5wYXJ0aWNsZXMubGVuZ3RoO1xuICAgIGxldCBpLCBwYXJ0aWNsZTtcblxuICAgIGZvciAoaSA9IGxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBwYXJ0aWNsZSA9IHRoaXMucGFydGljbGVzW2ldO1xuXG4gICAgICAvLyBwYXJ0aWNsZSB1cGRhdGVcbiAgICAgIHBhcnRpY2xlLnVwZGF0ZSh0aW1lLCBpKTtcbiAgICAgIHRoaXMucGFyZW50LmludGVncmF0b3IuY2FsY3VsYXRlKHBhcnRpY2xlLCB0aW1lLCBkYW1waW5nKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2goXCJQQVJUSUNMRV9VUERBVEVcIiwgcGFydGljbGUpO1xuXG4gICAgICAvLyBjaGVjayBkZWFkXG4gICAgICBpZiAocGFydGljbGUuZGVhZCkge1xuICAgICAgICB0aGlzLmRpc3BhdGNoKFwiUEFSVElDTEVfREVBRFwiLCBwYXJ0aWNsZSk7XG5cbiAgICAgICAgdGhpcy5wYXJlbnQucG9vbC5leHBpcmUocGFydGljbGUpO1xuICAgICAgICB0aGlzLnBhcnRpY2xlcy5zcGxpY2UoaSwgMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZGlzcGF0Y2goZXZlbnQsIHRhcmdldCkge1xuICAgIHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQsIHRhcmdldCk7XG4gICAgdGhpcy5iaW5kRXZlbnQgJiYgdGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50LCB0YXJnZXQpO1xuICB9XG5cbiAgZW1pdHRpbmcodGltZSkge1xuICAgIGlmICh0aGlzLnRvdGFsVGltZSA9PT0gXCJvbmNlXCIpIHtcbiAgICAgIGxldCBpO1xuICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5yYXRlLmdldFZhbHVlKDk5OTk5KTtcblxuICAgICAgaWYgKGxlbmd0aCA+IDApIHRoaXMuZW1pdFNwZWVkID0gbGVuZ3RoO1xuICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB0aGlzLmNyZWF0ZVBhcnRpY2xlKCk7XG4gICAgICB0aGlzLnRvdGFsVGltZSA9IFwibm9uZVwiO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVtaXRUaW1lICs9IHRpbWU7XG5cbiAgICAgIGlmICh0aGlzLmVtaXRUaW1lIDwgdGhpcy50b3RhbFRpbWUpIHtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5yYXRlLmdldFZhbHVlKHRpbWUpO1xuICAgICAgICBsZXQgaTtcblxuICAgICAgICBpZiAobGVuZ3RoID4gMCkgdGhpcy5lbWl0U3BlZWQgPSBsZW5ndGg7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgdGhpcy5jcmVhdGVQYXJ0aWNsZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBjcmVhdGUgc2luZ2xlIHBhcnRpY2xlO1xuICAgKlxuICAgKiBjYW4gdXNlIGVtaXQoe3g6MTB9LG5ldyBHcmF2aXR5KDEwKSx7J3BhcnRpY2xlVXBkYXRlJyxmdW59KSBvciBlbWl0KFt7eDoxMH0sbmV3IEluaXRpYWxpemVdLG5ldyBHcmF2aXR5KDEwKSx7J3BhcnRpY2xlVXBkYXRlJyxmdW59KVxuICAgKiBAbWV0aG9kIHJlbW92ZUFsbFBhcnRpY2xlc1xuICAgKi9cbiAgY3JlYXRlUGFydGljbGUoaW5pdGlhbGl6ZSwgYmVoYXZpb3VyKSB7XG4gICAgY29uc3QgcGFydGljbGUgPSB0aGlzLnBhcmVudC5wb29sLmdldChQYXJ0aWNsZSk7XG4gICAgdGhpcy5zZXR1cFBhcnRpY2xlKHBhcnRpY2xlLCBpbml0aWFsaXplLCBiZWhhdmlvdXIpO1xuICAgIHRoaXMuZGlzcGF0Y2goXCJQQVJUSUNMRV9DUkVBVEVEXCIsIHBhcnRpY2xlKTtcblxuICAgIHJldHVybiBwYXJ0aWNsZTtcbiAgfVxuXG4gIHNldHVwUGFydGljbGUocGFydGljbGUsIGluaXRpYWxpemUsIGJlaGF2aW91cikge1xuICAgIGxldCBpbml0aWFsaXplcyA9IHRoaXMuaW5pdGlhbGl6ZXM7XG4gICAgbGV0IGJlaGF2aW91cnMgPSB0aGlzLmJlaGF2aW91cnM7XG5cbiAgICBpZiAoaW5pdGlhbGl6ZSkgaW5pdGlhbGl6ZXMgPSBVdGlsLnRvQXJyYXkoaW5pdGlhbGl6ZSk7XG4gICAgaWYgKGJlaGF2aW91cikgYmVoYXZpb3VycyA9IFV0aWwudG9BcnJheShiZWhhdmlvdXIpO1xuXG4gICAgcGFydGljbGUucmVzZXQoKTtcbiAgICBJbml0aWFsaXplVXRpbC5pbml0aWFsaXplKHRoaXMsIHBhcnRpY2xlLCBpbml0aWFsaXplcyk7XG4gICAgcGFydGljbGUuYWRkQmVoYXZpb3VycyhiZWhhdmlvdXJzKTtcbiAgICBwYXJ0aWNsZS5wYXJlbnQgPSB0aGlzO1xuXG4gICAgdGhpcy5wYXJ0aWNsZXMucHVzaChwYXJ0aWNsZSk7XG4gIH1cblxuICByZW1vdmUoKSB7XG4gICAgdGhpcy5zdG9wKCk7XG4gICAgVXRpbC5kZXN0cm95QWxsKHRoaXMucGFydGljbGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0b3J5IHRoaXMgRW1pdHRlclxuICAgKiBAbWV0aG9kIGRlc3Ryb3lcbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5kZWFkID0gdHJ1ZTtcbiAgICB0aGlzLnJlbW92ZSgpO1xuICAgIHRoaXMucmVtb3ZlQWxsSW5pdGlhbGl6ZXJzKCk7XG4gICAgdGhpcy5yZW1vdmVBbGxCZWhhdmlvdXJzKCk7XG4gICAgdGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQucmVtb3ZlRW1pdHRlcih0aGlzKTtcbiAgfVxufVxuXG5FdmVudERpc3BhdGNoZXIuYmluZChFbWl0dGVyKTtcbiIsImltcG9ydCBFbWl0dGVyIGZyb20gXCIuL0VtaXR0ZXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmVoYXZpb3VyRW1pdHRlciBleHRlbmRzIEVtaXR0ZXIge1xuICAvKipcbiAgICogVGhlIEJlaGF2aW91ckVtaXR0ZXIgY2xhc3MgaW5oZXJpdHMgZnJvbSBQcm90b24uRW1pdHRlclxuICAgKlxuICAgKiB1c2UgdGhlIEJlaGF2aW91ckVtaXR0ZXIgeW91IGNhbiBhZGQgYmVoYXZpb3VycyB0byBzZWxmO1xuICAgKiBAY2xhc3MgUHJvdG9uLkJlaGF2aW91ckVtaXR0ZXJcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjb25mIHRoZSBwYXJhbWV0ZXJzIG9iamVjdDtcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmYpIHtcbiAgICBzdXBlcihjb25mKTtcblxuICAgIHRoaXMuc2VsZkJlaGF2aW91cnMgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBhZGQgdGhlIEJlaGF2aW91ciB0byBlbWl0dGVyO1xuICAgKlxuICAgKiB5b3UgY2FuIHVzZSBCZWhhdmlvdXJzIGFycmF5OmVtaXR0ZXIuYWRkU2VsZkJlaGF2aW91cihCZWhhdmlvdXIxLEJlaGF2aW91cjIsQmVoYXZpb3VyMyk7XG4gICAqIEBtZXRob2QgYWRkU2VsZkJlaGF2aW91clxuICAgKiBAcGFyYW0ge1Byb3Rvbi5CZWhhdmlvdXJ9IGJlaGF2aW91ciBsaWtlIHRoaXMgbmV3IFByb3Rvbi5Db2xvcigncmFuZG9tJylcbiAgICovXG4gIGFkZFNlbGZCZWhhdmlvdXIoLi4ucmVzdCkge1xuICAgIGxldCBpLFxuICAgICAgbGVuZ3RoID0gcmVzdC5sZW5ndGg7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBiZWhhdmlvdXIgPSByZXN0W2ldO1xuICAgICAgdGhpcy5zZWxmQmVoYXZpb3Vycy5wdXNoKGJlaGF2aW91cik7XG4gICAgICBiZWhhdmlvdXIuaW5pdGlhbGl6ZSh0aGlzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogcmVtb3ZlIHRoZSBCZWhhdmlvdXIgZm9yIHNlbGZcbiAgICogQG1ldGhvZCByZW1vdmVTZWxmQmVoYXZpb3VyXG4gICAqIEBwYXJhbSB7UHJvdG9uLkJlaGF2aW91cn0gYmVoYXZpb3VyIGEgYmVoYXZpb3VyXG4gICAqL1xuICByZW1vdmVTZWxmQmVoYXZpb3VyKGJlaGF2aW91cikge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWxmQmVoYXZpb3Vycy5pbmRleE9mKGJlaGF2aW91cik7XG4gICAgaWYgKGluZGV4ID4gLTEpIHRoaXMuc2VsZkJlaGF2aW91cnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxuXG4gIHVwZGF0ZSh0aW1lKSB7XG4gICAgc3VwZXIudXBkYXRlKHRpbWUpO1xuXG4gICAgaWYgKCF0aGlzLnNsZWVwKSB7XG4gICAgICBjb25zdCBsZW5ndGggPSB0aGlzLnNlbGZCZWhhdmlvdXJzLmxlbmd0aDtcbiAgICAgIGxldCBpO1xuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5zZWxmQmVoYXZpb3Vyc1tpXS5hcHBseUJlaGF2aW91cih0aGlzLCB0aW1lLCBpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgRW1pdHRlciBmcm9tIFwiLi9FbWl0dGVyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZvbGxvd0VtaXR0ZXIgZXh0ZW5kcyBFbWl0dGVyIHtcbiAgLyoqXG4gICAqIFRoZSBGb2xsb3dFbWl0dGVyIGNsYXNzIGluaGVyaXRzIGZyb20gUHJvdG9uLkVtaXR0ZXJcbiAgICpcbiAgICogdXNlIHRoZSBGb2xsb3dFbWl0dGVyIHdpbGwgZW1pdCBwYXJ0aWNsZSB3aGVuIG1vdXNlbW92aW5nXG4gICAqXG4gICAqIEBjbGFzcyBQcm90b24uRm9sbG93RW1pdHRlclxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtFbGVtZW50fSBtb3VzZVRhcmdldCBtb3VzZWV2ZW50J3MgdGFyZ2V0O1xuICAgKiBAcGFyYW0ge051bWJlcn0gZWFzZSB0aGUgZWFzaW5nIG9mIGZvbGxvd2luZyBzcGVlZDtcbiAgICogQGRlZmF1bHQgMC43XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjb25mIHRoZSBwYXJhbWV0ZXJzIG9iamVjdDtcbiAgICovXG4gIGNvbnN0cnVjdG9yKG1vdXNlVGFyZ2V0LCBlYXNlLCBjb25mKSB7XG4gICAgc3VwZXIoY29uZik7XG5cbiAgICB0aGlzLm1vdXNlVGFyZ2V0ID0gVXRpbC5pbml0VmFsdWUobW91c2VUYXJnZXQsIHdpbmRvdyk7XG4gICAgdGhpcy5lYXNlID0gVXRpbC5pbml0VmFsdWUoZWFzZSwgMC43KTtcblxuICAgIHRoaXMuX2FsbG93RW1pdHRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmluaXRFdmVudEhhbmRsZXIoKTtcbiAgfVxuXG4gIGluaXRFdmVudEhhbmRsZXIoKSB7XG4gICAgdGhpcy5tb3VzZW1vdmVIYW5kbGVyID0gZSA9PiB0aGlzLm1vdXNlbW92ZS5jYWxsKHRoaXMsIGUpO1xuICAgIHRoaXMubW91c2Vkb3duSGFuZGxlciA9IGUgPT4gdGhpcy5tb3VzZWRvd24uY2FsbCh0aGlzLCBlKTtcbiAgICB0aGlzLm1vdXNldXBIYW5kbGVyID0gZSA9PiB0aGlzLm1vdXNldXAuY2FsbCh0aGlzLCBlKTtcbiAgICB0aGlzLm1vdXNlVGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgdGhpcy5tb3VzZW1vdmVIYW5kbGVyLCBmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogc3RhcnQgZW1pdCBwYXJ0aWNsZVxuICAgKiBAbWV0aG9kIGVtaXRcbiAgICovXG4gIGVtaXQoKSB7XG4gICAgdGhpcy5fYWxsb3dFbWl0dGluZyA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogc3RvcCBlbWl0aW5nXG4gICAqIEBtZXRob2Qgc3RvcFxuICAgKi9cbiAgc3RvcCgpIHtcbiAgICB0aGlzLl9hbGxvd0VtaXR0aW5nID0gZmFsc2U7XG4gIH1cblxuICBtb3VzZW1vdmUoZSkge1xuICAgIGlmIChlLmxheWVyWCB8fCBlLmxheWVyWCA9PT0gMCkge1xuICAgICAgdGhpcy5wLnggKz0gKGUubGF5ZXJYIC0gdGhpcy5wLngpICogdGhpcy5lYXNlO1xuICAgICAgdGhpcy5wLnkgKz0gKGUubGF5ZXJZIC0gdGhpcy5wLnkpICogdGhpcy5lYXNlO1xuICAgIH0gZWxzZSBpZiAoZS5vZmZzZXRYIHx8IGUub2Zmc2V0WCA9PT0gMCkge1xuICAgICAgdGhpcy5wLnggKz0gKGUub2Zmc2V0WCAtIHRoaXMucC54KSAqIHRoaXMuZWFzZTtcbiAgICAgIHRoaXMucC55ICs9IChlLm9mZnNldFkgLSB0aGlzLnAueSkgKiB0aGlzLmVhc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2FsbG93RW1pdHRpbmcpIHN1cGVyLmVtaXQoXCJvbmNlXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3RvcnkgdGhpcyBFbWl0dGVyXG4gICAqIEBtZXRob2QgZGVzdHJveVxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgdGhpcy5tb3VzZVRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIHRoaXMubW91c2Vtb3ZlSGFuZGxlciwgZmFsc2UpO1xuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCB7XG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgd2hldGhlciBpdCBpcyBhIHBpY3R1cmUgb2JqZWN0XG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IGlzIG9yIG5vXG4gICAqL1xuICBpc0ltYWdlKG9iaikge1xuICAgIGlmICghb2JqKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCB0YWdOYW1lID0gYCR7b2JqLnRhZ05hbWV9YC50b1VwcGVyQ2FzZSgpO1xuICAgIGNvbnN0IG5vZGVOYW1lID0gYCR7b2JqLm5vZGVOYW1lfWAudG9VcHBlckNhc2UoKTtcbiAgICBpZiAobm9kZU5hbWUgPT09IFwiSU1HXCIgfHwgdGFnTmFtZSA9PT0gXCJJTUdcIikgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgd2hldGhlciBpdCBpcyBhIHN0cmluZyBvYmplY3RcbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gaXMgb3Igbm9cbiAgICovXG4gIGlzU3RyaW5nKG9iaikge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSBcInN0cmluZ1wiO1xuICB9XG59O1xuIiwiaW1wb3J0IFBvb2wgZnJvbSBcIi4uL2NvcmUvUG9vbFwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYXNlUmVuZGVyZXIge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBzdHJva2UpIHtcbiAgICB0aGlzLnBvb2wgPSBuZXcgUG9vbCgpO1xuICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5zdHJva2UgPSBzdHJva2U7XG4gICAgdGhpcy5jaXJjbGVDb25mID0geyBpc0NpcmNsZTogdHJ1ZSB9O1xuXG4gICAgdGhpcy5pbml0RXZlbnRIYW5kbGVyKCk7XG4gICAgdGhpcy5uYW1lID0gXCJCYXNlUmVuZGVyZXJcIjtcbiAgfVxuXG4gIHNldFN0cm9rZShjb2xvciA9IFwiIzAwMDAwMFwiLCB0aGlua25lc3MgPSAxKSB7XG4gICAgdGhpcy5zdHJva2UgPSB7IGNvbG9yLCB0aGlua25lc3MgfTtcbiAgfVxuXG4gIGluaXRFdmVudEhhbmRsZXIoKSB7XG4gICAgdGhpcy5fcHJvdG9uVXBkYXRlSGFuZGxlciA9ICgpID0+IHtcbiAgICAgIHRoaXMub25Qcm90b25VcGRhdGUuY2FsbCh0aGlzKTtcbiAgICB9O1xuXG4gICAgdGhpcy5fcHJvdG9uVXBkYXRlQWZ0ZXJIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5vblByb3RvblVwZGF0ZUFmdGVyLmNhbGwodGhpcyk7XG4gICAgfTtcblxuICAgIHRoaXMuX2VtaXR0ZXJBZGRlZEhhbmRsZXIgPSBlbWl0dGVyID0+IHtcbiAgICAgIHRoaXMub25FbWl0dGVyQWRkZWQuY2FsbCh0aGlzLCBlbWl0dGVyKTtcbiAgICB9O1xuXG4gICAgdGhpcy5fZW1pdHRlclJlbW92ZWRIYW5kbGVyID0gZW1pdHRlciA9PiB7XG4gICAgICB0aGlzLm9uRW1pdHRlclJlbW92ZWQuY2FsbCh0aGlzLCBlbWl0dGVyKTtcbiAgICB9O1xuXG4gICAgdGhpcy5fcGFydGljbGVDcmVhdGVkSGFuZGxlciA9IHBhcnRpY2xlID0+IHtcbiAgICAgIHRoaXMub25QYXJ0aWNsZUNyZWF0ZWQuY2FsbCh0aGlzLCBwYXJ0aWNsZSk7XG4gICAgfTtcblxuICAgIHRoaXMuX3BhcnRpY2xlVXBkYXRlSGFuZGxlciA9IHBhcnRpY2xlID0+IHtcbiAgICAgIHRoaXMub25QYXJ0aWNsZVVwZGF0ZS5jYWxsKHRoaXMsIHBhcnRpY2xlKTtcbiAgICB9O1xuXG4gICAgdGhpcy5fcGFydGljbGVEZWFkSGFuZGxlciA9IHBhcnRpY2xlID0+IHtcbiAgICAgIHRoaXMub25QYXJ0aWNsZURlYWQuY2FsbCh0aGlzLCBwYXJ0aWNsZSk7XG4gICAgfTtcbiAgfVxuXG4gIGluaXQocHJvdG9uKSB7XG4gICAgdGhpcy5wYXJlbnQgPSBwcm90b247XG5cbiAgICBwcm90b24uYWRkRXZlbnRMaXN0ZW5lcihcIlBST1RPTl9VUERBVEVcIiwgdGhpcy5fcHJvdG9uVXBkYXRlSGFuZGxlcik7XG4gICAgcHJvdG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJQUk9UT05fVVBEQVRFX0FGVEVSXCIsIHRoaXMuX3Byb3RvblVwZGF0ZUFmdGVySGFuZGxlcik7XG5cbiAgICBwcm90b24uYWRkRXZlbnRMaXN0ZW5lcihcIkVNSVRURVJfQURERURcIiwgdGhpcy5fZW1pdHRlckFkZGVkSGFuZGxlcik7XG4gICAgcHJvdG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJFTUlUVEVSX1JFTU9WRURcIiwgdGhpcy5fZW1pdHRlclJlbW92ZWRIYW5kbGVyKTtcblxuICAgIHByb3Rvbi5hZGRFdmVudExpc3RlbmVyKFwiUEFSVElDTEVfQ1JFQVRFRFwiLCB0aGlzLl9wYXJ0aWNsZUNyZWF0ZWRIYW5kbGVyKTtcbiAgICBwcm90b24uYWRkRXZlbnRMaXN0ZW5lcihcIlBBUlRJQ0xFX1VQREFURVwiLCB0aGlzLl9wYXJ0aWNsZVVwZGF0ZUhhbmRsZXIpO1xuICAgIHByb3Rvbi5hZGRFdmVudExpc3RlbmVyKFwiUEFSVElDTEVfREVBRFwiLCB0aGlzLl9wYXJ0aWNsZURlYWRIYW5kbGVyKTtcbiAgfVxuXG4gIHJlc2l6ZSh3aWR0aCwgaGVpZ2h0KSB7fVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5yZW1vdmUoKTtcbiAgICB0aGlzLnBvb2wuZGVzdHJveSgpO1xuICAgIHRoaXMucG9vbCA9IG51bGw7XG4gICAgdGhpcy5lbGVtZW50ID0gbnVsbDtcbiAgICB0aGlzLnN0cm9rZSA9IG51bGw7XG4gIH1cblxuICByZW1vdmUocHJvdG9uKSB7XG4gICAgdGhpcy5wYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIlBST1RPTl9VUERBVEVcIiwgdGhpcy5fcHJvdG9uVXBkYXRlSGFuZGxlcik7XG4gICAgdGhpcy5wYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIlBST1RPTl9VUERBVEVfQUZURVJcIiwgdGhpcy5fcHJvdG9uVXBkYXRlQWZ0ZXJIYW5kbGVyKTtcblxuICAgIHRoaXMucGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJFTUlUVEVSX0FEREVEXCIsIHRoaXMuX2VtaXR0ZXJBZGRlZEhhbmRsZXIpO1xuICAgIHRoaXMucGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJFTUlUVEVSX1JFTU9WRURcIiwgdGhpcy5fZW1pdHRlclJlbW92ZWRIYW5kbGVyKTtcblxuICAgIHRoaXMucGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJQQVJUSUNMRV9DUkVBVEVEXCIsIHRoaXMuX3BhcnRpY2xlQ3JlYXRlZEhhbmRsZXIpO1xuICAgIHRoaXMucGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJQQVJUSUNMRV9VUERBVEVcIiwgdGhpcy5fcGFydGljbGVVcGRhdGVIYW5kbGVyKTtcbiAgICB0aGlzLnBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiUEFSVElDTEVfREVBRFwiLCB0aGlzLl9wYXJ0aWNsZURlYWRIYW5kbGVyKTtcblxuICAgIHRoaXMucGFyZW50ID0gbnVsbDtcbiAgfVxuXG4gIG9uUHJvdG9uVXBkYXRlKCkge31cbiAgb25Qcm90b25VcGRhdGVBZnRlcigpIHt9XG5cbiAgb25FbWl0dGVyQWRkZWQoZW1pdHRlcikge31cbiAgb25FbWl0dGVyUmVtb3ZlZChlbWl0dGVyKSB7fVxuXG4gIG9uUGFydGljbGVDcmVhdGVkKHBhcnRpY2xlKSB7fVxuICBvblBhcnRpY2xlVXBkYXRlKHBhcnRpY2xlKSB7fVxuICBvblBhcnRpY2xlRGVhZChwYXJ0aWNsZSkge31cbn1cbiIsImltcG9ydCBUeXBlcyBmcm9tIFwiLi4vdXRpbHMvVHlwZXNcIjtcbmltcG9ydCBJbWdVdGlsIGZyb20gXCIuLi91dGlscy9JbWdVdGlsXCI7XG5pbXBvcnQgQ29sb3JVdGlsIGZyb20gXCIuLi91dGlscy9Db2xvclV0aWxcIjtcbmltcG9ydCBNYXRoVXRpbCBmcm9tIFwiLi4vbWF0aC9NYXRoVXRpbFwiO1xuaW1wb3J0IEJhc2VSZW5kZXJlciBmcm9tIFwiLi9CYXNlUmVuZGVyZXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2FudmFzUmVuZGVyZXIgZXh0ZW5kcyBCYXNlUmVuZGVyZXIge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50KSB7XG4gICAgc3VwZXIoZWxlbWVudCk7XG5cbiAgICB0aGlzLnN0cm9rZSA9IG51bGw7XG4gICAgdGhpcy5jb250ZXh0ID0gdGhpcy5lbGVtZW50LmdldENvbnRleHQoXCIyZFwiKTtcbiAgICB0aGlzLmJ1ZmZlckNhY2hlID0ge307XG4gICAgdGhpcy5uYW1lID0gXCJDYW52YXNSZW5kZXJlclwiO1xuICB9XG5cbiAgcmVzaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICB0aGlzLmVsZW1lbnQud2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLmVsZW1lbnQuaGVpZ2h0ID0gaGVpZ2h0O1xuICB9XG5cbiAgb25Qcm90b25VcGRhdGUoKSB7XG4gICAgdGhpcy5jb250ZXh0LmNsZWFyUmVjdCgwLCAwLCB0aGlzLmVsZW1lbnQud2lkdGgsIHRoaXMuZWxlbWVudC5oZWlnaHQpO1xuICB9XG5cbiAgb25QYXJ0aWNsZUNyZWF0ZWQocGFydGljbGUpIHtcbiAgICBpZiAocGFydGljbGUuYm9keSkge1xuICAgICAgSW1nVXRpbC5nZXRJbWdGcm9tQ2FjaGUocGFydGljbGUuYm9keSwgdGhpcy5hZGRJbWcyQm9keSwgcGFydGljbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJ0aWNsZS5jb2xvciA9IHBhcnRpY2xlLmNvbG9yIHx8IFwiI2ZmMDAwMFwiO1xuICAgIH1cbiAgfVxuXG4gIG9uUGFydGljbGVVcGRhdGUocGFydGljbGUpIHtcbiAgICBpZiAocGFydGljbGUuYm9keSkge1xuICAgICAgaWYgKFR5cGVzLmlzSW1hZ2UocGFydGljbGUuYm9keSkpIHtcbiAgICAgICAgdGhpcy5kcmF3SW1hZ2UocGFydGljbGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRyYXdDaXJjbGUocGFydGljbGUpO1xuICAgIH1cbiAgfVxuXG4gIG9uUGFydGljbGVEZWFkKHBhcnRpY2xlKSB7XG4gICAgcGFydGljbGUuYm9keSA9IG51bGw7XG4gIH1cblxuICAvLyBwcml2YXRlIG1ldGhvZFxuICBhZGRJbWcyQm9keShpbWcsIHBhcnRpY2xlKSB7XG4gICAgcGFydGljbGUuYm9keSA9IGltZztcbiAgfVxuXG4gIC8vIHByaXZhdGUgZHJhd0ltYWdlIG1ldGhvZFxuICBkcmF3SW1hZ2UocGFydGljbGUpIHtcbiAgICBjb25zdCB3ID0gKHBhcnRpY2xlLmJvZHkud2lkdGggKiBwYXJ0aWNsZS5zY2FsZSkgfCAwO1xuICAgIGNvbnN0IGggPSAocGFydGljbGUuYm9keS5oZWlnaHQgKiBwYXJ0aWNsZS5zY2FsZSkgfCAwO1xuICAgIGNvbnN0IHggPSBwYXJ0aWNsZS5wLnggLSB3IC8gMjtcbiAgICBjb25zdCB5ID0gcGFydGljbGUucC55IC0gaCAvIDI7XG5cbiAgICBpZiAoISFwYXJ0aWNsZS5jb2xvcikge1xuICAgICAgaWYgKCFwYXJ0aWNsZS5kYXRhW1wiYnVmZmVyXCJdKSBwYXJ0aWNsZS5kYXRhLmJ1ZmZlciA9IHRoaXMuY3JlYXRlQnVmZmVyKHBhcnRpY2xlLmJvZHkpO1xuXG4gICAgICBjb25zdCBidWZDb250ZXh0ID0gcGFydGljbGUuZGF0YS5idWZmZXIuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgICAgYnVmQ29udGV4dC5jbGVhclJlY3QoMCwgMCwgcGFydGljbGUuZGF0YS5idWZmZXIud2lkdGgsIHBhcnRpY2xlLmRhdGEuYnVmZmVyLmhlaWdodCk7XG4gICAgICBidWZDb250ZXh0Lmdsb2JhbEFscGhhID0gcGFydGljbGUuYWxwaGE7XG4gICAgICBidWZDb250ZXh0LmRyYXdJbWFnZShwYXJ0aWNsZS5ib2R5LCAwLCAwKTtcblxuICAgICAgYnVmQ29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBcInNvdXJjZS1hdG9wXCI7XG4gICAgICBidWZDb250ZXh0LmZpbGxTdHlsZSA9IENvbG9yVXRpbC5yZ2JUb0hleChwYXJ0aWNsZS5yZ2IpO1xuICAgICAgYnVmQ29udGV4dC5maWxsUmVjdCgwLCAwLCBwYXJ0aWNsZS5kYXRhLmJ1ZmZlci53aWR0aCwgcGFydGljbGUuZGF0YS5idWZmZXIuaGVpZ2h0KTtcbiAgICAgIGJ1ZkNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gXCJzb3VyY2Utb3ZlclwiO1xuICAgICAgYnVmQ29udGV4dC5nbG9iYWxBbHBoYSA9IDE7XG5cbiAgICAgIHRoaXMuY29udGV4dC5kcmF3SW1hZ2UoXG4gICAgICAgIHBhcnRpY2xlLmRhdGEuYnVmZmVyLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICBwYXJ0aWNsZS5kYXRhLmJ1ZmZlci53aWR0aCxcbiAgICAgICAgcGFydGljbGUuZGF0YS5idWZmZXIuaGVpZ2h0LFxuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICB3LFxuICAgICAgICBoXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbnRleHQuc2F2ZSgpO1xuXG4gICAgICB0aGlzLmNvbnRleHQuZ2xvYmFsQWxwaGEgPSBwYXJ0aWNsZS5hbHBoYTtcbiAgICAgIHRoaXMuY29udGV4dC50cmFuc2xhdGUocGFydGljbGUucC54LCBwYXJ0aWNsZS5wLnkpO1xuICAgICAgdGhpcy5jb250ZXh0LnJvdGF0ZShNYXRoVXRpbC5kZWdyZWVUcmFuc2Zvcm0ocGFydGljbGUucm90YXRpb24pKTtcbiAgICAgIHRoaXMuY29udGV4dC50cmFuc2xhdGUoLXBhcnRpY2xlLnAueCwgLXBhcnRpY2xlLnAueSk7XG4gICAgICB0aGlzLmNvbnRleHQuZHJhd0ltYWdlKHBhcnRpY2xlLmJvZHksIDAsIDAsIHBhcnRpY2xlLmJvZHkud2lkdGgsIHBhcnRpY2xlLmJvZHkuaGVpZ2h0LCB4LCB5LCB3LCBoKTtcblxuICAgICAgdGhpcy5jb250ZXh0Lmdsb2JhbEFscGhhID0gMTtcbiAgICAgIHRoaXMuY29udGV4dC5yZXN0b3JlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gcHJpdmF0ZSBkcmF3Q2lyY2xlIC0tXG4gIGRyYXdDaXJjbGUocGFydGljbGUpIHtcbiAgICBpZiAocGFydGljbGUucmdiKSB7XG4gICAgICB0aGlzLmNvbnRleHQuZmlsbFN0eWxlID0gYHJnYmEoJHtwYXJ0aWNsZS5yZ2Iucn0sJHtwYXJ0aWNsZS5yZ2IuZ30sJHtwYXJ0aWNsZS5yZ2IuYn0sJHtwYXJ0aWNsZS5hbHBoYX0pYDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb250ZXh0LmZpbGxTdHlsZSA9IHBhcnRpY2xlLmNvbG9yO1xuICAgIH1cblxuICAgIC8vIGRyYXcgY2lyY2xlXG4gICAgdGhpcy5jb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgIHRoaXMuY29udGV4dC5hcmMocGFydGljbGUucC54LCBwYXJ0aWNsZS5wLnksIHBhcnRpY2xlLnJhZGl1cywgMCwgTWF0aC5QSSAqIDIsIHRydWUpO1xuXG4gICAgaWYgKHRoaXMuc3Ryb2tlKSB7XG4gICAgICB0aGlzLmNvbnRleHQuc3Ryb2tlU3R5bGUgPSB0aGlzLnN0cm9rZS5jb2xvcjtcbiAgICAgIHRoaXMuY29udGV4dC5saW5lV2lkdGggPSB0aGlzLnN0cm9rZS50aGlua25lc3M7XG4gICAgICB0aGlzLmNvbnRleHQuc3Ryb2tlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5jb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIHRoaXMuY29udGV4dC5maWxsKCk7XG4gIH1cblxuICAvLyBwcml2YXRlIGNyZWF0ZUJ1ZmZlclxuICBjcmVhdGVCdWZmZXIoaW1hZ2UpIHtcbiAgICBpZiAoVHlwZXMuaXNJbWFnZShpbWFnZSkpIHtcbiAgICAgIGNvbnN0IHNpemUgPSBpbWFnZS53aWR0aCArIFwiX1wiICsgaW1hZ2UuaGVpZ2h0O1xuICAgICAgbGV0IGNhbnZhcyA9IHRoaXMuYnVmZmVyQ2FjaGVbc2l6ZV07XG5cbiAgICAgIGlmICghY2FudmFzKSB7XG4gICAgICAgIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgICAgIGNhbnZhcy53aWR0aCA9IGltYWdlLndpZHRoO1xuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0O1xuICAgICAgICB0aGlzLmJ1ZmZlckNhY2hlW3NpemVdID0gY2FudmFzO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY2FudmFzO1xuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuc3Ryb2tlID0gbnVsbDtcbiAgICB0aGlzLmNvbnRleHQgPSBudWxsO1xuICAgIHRoaXMuYnVmZmVyQ2FjaGUgPSBudWxsO1xuICB9XG59XG4iLCJpbXBvcnQgRG9tVXRpbCBmcm9tIFwiLi4vdXRpbHMvRG9tVXRpbFwiO1xuaW1wb3J0IEltZ1V0aWwgZnJvbSBcIi4uL3V0aWxzL0ltZ1V0aWxcIjtcbmltcG9ydCBCYXNlUmVuZGVyZXIgZnJvbSBcIi4vQmFzZVJlbmRlcmVyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERvbVJlbmRlcmVyIGV4dGVuZHMgQmFzZVJlbmRlcmVyIHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCkge1xuICAgIHN1cGVyKGVsZW1lbnQpO1xuXG4gICAgdGhpcy5zdHJva2UgPSBudWxsO1xuICAgIHRoaXMudHJhbnNmb3JtM2QgPSBmYWxzZTtcbiAgICB0aGlzLnBvb2wuY3JlYXRlID0gKGJvZHksIHBhcnRpY2xlKSA9PiB0aGlzLmNyZWF0ZUJvZHkoYm9keSwgcGFydGljbGUpO1xuICAgIHRoaXMuYWRkSW1nMkJvZHkgPSB0aGlzLmFkZEltZzJCb2R5LmJpbmQodGhpcyk7XG5cbiAgICB0aGlzLm5hbWUgPSBcIkRvbVJlbmRlcmVyXCI7XG4gIH1cblxuICBvblBhcnRpY2xlQ3JlYXRlZChwYXJ0aWNsZSkge1xuICAgIGlmIChwYXJ0aWNsZS5ib2R5KSB7XG4gICAgICBJbWdVdGlsLmdldEltZ0Zyb21DYWNoZShwYXJ0aWNsZS5ib2R5LCB0aGlzLmFkZEltZzJCb2R5LCBwYXJ0aWNsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcnRpY2xlLmJvZHkgPSB0aGlzLnBvb2wuZ2V0KHRoaXMuY2lyY2xlQ29uZiwgcGFydGljbGUpO1xuICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHBhcnRpY2xlLmJvZHkpO1xuICAgIH1cbiAgfVxuXG4gIG9uUGFydGljbGVVcGRhdGUocGFydGljbGUpIHtcbiAgICBpZiAodGhpcy5ib2R5UmVhZHkocGFydGljbGUpKSB7XG4gICAgICBpZiAodGhpcy50cmFuc2Zvcm0zZCkge1xuICAgICAgICBEb21VdGlsLnRyYW5zZm9ybTNkKHBhcnRpY2xlLmJvZHksIHBhcnRpY2xlLnAueCwgcGFydGljbGUucC55LCBwYXJ0aWNsZS5zY2FsZSwgcGFydGljbGUucm90YXRpb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgRG9tVXRpbC50cmFuc2Zvcm0ocGFydGljbGUuYm9keSwgcGFydGljbGUucC54LCBwYXJ0aWNsZS5wLnksIHBhcnRpY2xlLnNjYWxlLCBwYXJ0aWNsZS5yb3RhdGlvbik7XG4gICAgICB9XG5cbiAgICAgIHBhcnRpY2xlLmJvZHkuc3R5bGUub3BhY2l0eSA9IHBhcnRpY2xlLmFscGhhO1xuXG4gICAgICBpZiAocGFydGljbGUuYm9keS5pc0NpcmNsZSkge1xuICAgICAgICBwYXJ0aWNsZS5ib2R5LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHBhcnRpY2xlLmNvbG9yIHx8IFwiI2ZmMDAwMFwiO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uUGFydGljbGVEZWFkKHBhcnRpY2xlKSB7XG4gICAgaWYgKHRoaXMuYm9keVJlYWR5KHBhcnRpY2xlKSkge1xuICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUNoaWxkKHBhcnRpY2xlLmJvZHkpO1xuICAgICAgdGhpcy5wb29sLmV4cGlyZShwYXJ0aWNsZS5ib2R5KTtcbiAgICAgIHBhcnRpY2xlLmJvZHkgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGJvZHlSZWFkeShwYXJ0aWNsZSkge1xuICAgIHJldHVybiB0eXBlb2YgcGFydGljbGUuYm9keSA9PT0gXCJvYmplY3RcIiAmJiBwYXJ0aWNsZS5ib2R5ICYmICFwYXJ0aWNsZS5ib2R5LmlzSW5uZXI7XG4gIH1cblxuICAvLyBwcml2YXRlIG1ldGhvZFxuICBhZGRJbWcyQm9keShpbWcsIHBhcnRpY2xlKSB7XG4gICAgaWYgKHBhcnRpY2xlLmRlYWQpIHJldHVybjtcbiAgICBwYXJ0aWNsZS5ib2R5ID0gdGhpcy5wb29sLmdldChpbWcsIHBhcnRpY2xlKTtcbiAgICBEb21VdGlsLnJlc2l6ZShwYXJ0aWNsZS5ib2R5LCBpbWcud2lkdGgsIGltZy5oZWlnaHQpO1xuXG4gICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHBhcnRpY2xlLmJvZHkpO1xuICB9XG5cbiAgY3JlYXRlQm9keShib2R5LCBwYXJ0aWNsZSkge1xuICAgIGlmIChib2R5LmlzQ2lyY2xlKSByZXR1cm4gdGhpcy5jcmVhdGVDaXJjbGUocGFydGljbGUpO1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVNwcml0ZShib2R5LCBwYXJ0aWNsZSk7XG4gIH1cblxuICAvLyBwcml2YXRlIG1ldGhvZHNcbiAgY3JlYXRlQ2lyY2xlKHBhcnRpY2xlKSB7XG4gICAgY29uc3QgZG9tID0gRG9tVXRpbC5jcmVhdGVEaXYoYCR7cGFydGljbGUuaWR9X2RvbWAsIDIgKiBwYXJ0aWNsZS5yYWRpdXMsIDIgKiBwYXJ0aWNsZS5yYWRpdXMpO1xuICAgIGRvbS5zdHlsZS5ib3JkZXJSYWRpdXMgPSBgJHtwYXJ0aWNsZS5yYWRpdXN9cHhgO1xuXG4gICAgaWYgKHRoaXMuc3Ryb2tlKSB7XG4gICAgICBkb20uc3R5bGUuYm9yZGVyQ29sb3IgPSB0aGlzLnN0cm9rZS5jb2xvcjtcbiAgICAgIGRvbS5zdHlsZS5ib3JkZXJXaWR0aCA9IGAke3RoaXMuc3Ryb2tlLnRoaW5rbmVzc31weGA7XG4gICAgfVxuICAgIGRvbS5pc0NpcmNsZSA9IHRydWU7XG5cbiAgICByZXR1cm4gZG9tO1xuICB9XG5cbiAgY3JlYXRlU3ByaXRlKGJvZHksIHBhcnRpY2xlKSB7XG4gICAgY29uc3QgdXJsID0gdHlwZW9mIGJvZHkgPT09IFwic3RyaW5nXCIgPyBib2R5IDogYm9keS5zcmM7XG4gICAgY29uc3QgZG9tID0gRG9tVXRpbC5jcmVhdGVEaXYoYCR7cGFydGljbGUuaWR9X2RvbWAsIGJvZHkud2lkdGgsIGJvZHkuaGVpZ2h0KTtcbiAgICBkb20uc3R5bGUuYmFja2dyb3VuZEltYWdlID0gYHVybCgke3VybH0pYDtcblxuICAgIHJldHVybiBkb207XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICB0aGlzLnN0cm9rZSA9IG51bGw7XG4gIH1cbn1cbiIsImltcG9ydCBUeXBlcyBmcm9tIFwiLi4vdXRpbHMvVHlwZXNcIjtcbmltcG9ydCBCYXNlUmVuZGVyZXIgZnJvbSBcIi4vQmFzZVJlbmRlcmVyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVhc2VsUmVuZGVyZXIgZXh0ZW5kcyBCYXNlUmVuZGVyZXIge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBzdHJva2UpIHtcbiAgICBzdXBlcihlbGVtZW50KTtcblxuICAgIHRoaXMuc3Ryb2tlID0gc3Ryb2tlO1xuICAgIHRoaXMubmFtZSA9IFwiRWFzZWxSZW5kZXJlclwiO1xuICB9XG5cbiAgb25QYXJ0aWNsZUNyZWF0ZWQocGFydGljbGUpIHtcbiAgICBpZiAocGFydGljbGUuYm9keSkge1xuICAgICAgdGhpcy5jcmVhdGVTcHJpdGUocGFydGljbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNyZWF0ZUNpcmNsZShwYXJ0aWNsZSk7XG4gICAgfVxuXG4gICAgdGhpcy5lbGVtZW50LmFkZENoaWxkKHBhcnRpY2xlLmJvZHkpO1xuICB9XG5cbiAgb25QYXJ0aWNsZVVwZGF0ZShwYXJ0aWNsZSkge1xuICAgIGlmIChwYXJ0aWNsZS5ib2R5KSB7XG4gICAgICBwYXJ0aWNsZS5ib2R5LnggPSBwYXJ0aWNsZS5wLng7XG4gICAgICBwYXJ0aWNsZS5ib2R5LnkgPSBwYXJ0aWNsZS5wLnk7XG5cbiAgICAgIHBhcnRpY2xlLmJvZHkuYWxwaGEgPSBwYXJ0aWNsZS5hbHBoYTtcbiAgICAgIHBhcnRpY2xlLmJvZHkuc2NhbGVYID0gcGFydGljbGUuYm9keS5zY2FsZVkgPSBwYXJ0aWNsZS5zY2FsZTtcbiAgICAgIHBhcnRpY2xlLmJvZHkucm90YXRpb24gPSBwYXJ0aWNsZS5yb3RhdGlvbjtcbiAgICB9XG4gIH1cblxuICBvblBhcnRpY2xlRGVhZChwYXJ0aWNsZSkge1xuICAgIGlmIChwYXJ0aWNsZS5ib2R5KSB7XG4gICAgICBwYXJ0aWNsZS5ib2R5LnBhcmVudCAmJiBwYXJ0aWNsZS5ib2R5LnBhcmVudC5yZW1vdmVDaGlsZChwYXJ0aWNsZS5ib2R5KTtcbiAgICAgIHRoaXMucG9vbC5leHBpcmUocGFydGljbGUuYm9keSk7XG4gICAgICBwYXJ0aWNsZS5ib2R5ID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAocGFydGljbGUuZ3JhcGhpY3MpIHRoaXMucG9vbC5leHBpcmUocGFydGljbGUuZ3JhcGhpY3MpO1xuICB9XG5cbiAgLy8gcHJpdmF0ZVxuICBjcmVhdGVTcHJpdGUocGFydGljbGUpIHtcbiAgICBwYXJ0aWNsZS5ib2R5ID0gdGhpcy5wb29sLmdldChwYXJ0aWNsZS5ib2R5KTtcblxuICAgIGlmIChwYXJ0aWNsZS5ib2R5LnBhcmVudCkgcmV0dXJuO1xuICAgIGlmIChwYXJ0aWNsZS5ib2R5W1wiaW1hZ2VcIl0pIHtcbiAgICAgIHBhcnRpY2xlLmJvZHkucmVnWCA9IHBhcnRpY2xlLmJvZHkuaW1hZ2Uud2lkdGggLyAyO1xuICAgICAgcGFydGljbGUuYm9keS5yZWdZID0gcGFydGljbGUuYm9keS5pbWFnZS5oZWlnaHQgLyAyO1xuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZUNpcmNsZShwYXJ0aWNsZSkge1xuICAgIGNvbnN0IGdyYXBoaWNzID0gdGhpcy5wb29sLmdldChjcmVhdGVqcy5HcmFwaGljcyk7XG5cbiAgICBpZiAodGhpcy5zdHJva2UpIHtcbiAgICAgIGlmIChUeXBlcy5pc1N0cmluZyh0aGlzLnN0cm9rZSkpIHtcbiAgICAgICAgZ3JhcGhpY3MuYmVnaW5TdHJva2UodGhpcy5zdHJva2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ3JhcGhpY3MuYmVnaW5TdHJva2UoXCIjMDAwMDAwXCIpO1xuICAgICAgfVxuICAgIH1cbiAgICBncmFwaGljcy5iZWdpbkZpbGwocGFydGljbGUuY29sb3IgfHwgXCIjZmYwMDAwXCIpLmRyYXdDaXJjbGUoMCwgMCwgcGFydGljbGUucmFkaXVzKTtcbiAgICBjb25zdCBzaGFwZSA9IHRoaXMucG9vbC5nZXQoY3JlYXRlanMuU2hhcGUsIFtncmFwaGljc10pO1xuXG4gICAgcGFydGljbGUuYm9keSA9IHNoYXBlO1xuICAgIHBhcnRpY2xlLmdyYXBoaWNzID0gZ3JhcGhpY3M7XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICB0aGlzLnN0cm9rZSA9IG51bGw7XG4gIH1cbn1cbiIsImltcG9ydCBSZWN0YW5nbGUgZnJvbSBcIi4uL21hdGgvUmVjdGFuZ2xlXCI7XG5pbXBvcnQgQmFzZVJlbmRlcmVyIGZyb20gXCIuL0Jhc2VSZW5kZXJlclwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQaXhlbFJlbmRlcmVyIGV4dGVuZHMgQmFzZVJlbmRlcmVyIHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgcmVjdGFuZ2xlKSB7XG4gICAgc3VwZXIoZWxlbWVudCk7XG5cbiAgICB0aGlzLmNvbnRleHQgPSB0aGlzLmVsZW1lbnQuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgIHRoaXMuaW1hZ2VEYXRhID0gbnVsbDtcbiAgICB0aGlzLnJlY3RhbmdsZSA9IHJlY3RhbmdsZTtcbiAgICB0aGlzLmNyZWF0ZUltYWdlRGF0YShyZWN0YW5nbGUpO1xuXG4gICAgdGhpcy5uYW1lID0gXCJQaXhlbFJlbmRlcmVyXCI7XG4gIH1cblxuICByZXNpemUod2lkdGgsIGhlaWdodCkge1xuICAgIHRoaXMuZWxlbWVudC53aWR0aCA9IHdpZHRoO1xuICAgIHRoaXMuZWxlbWVudC5oZWlnaHQgPSBoZWlnaHQ7XG4gIH1cblxuICBjcmVhdGVJbWFnZURhdGEocmVjdGFuZ2xlKSB7XG4gICAgdGhpcy5yZWN0YW5nbGUgPSByZWN0YW5nbGUgPyByZWN0YW5nbGUgOiBuZXcgUmVjdGFuZ2xlKDAsIDAsIHRoaXMuZWxlbWVudC53aWR0aCwgdGhpcy5lbGVtZW50LmhlaWdodCk7XG4gICAgdGhpcy5pbWFnZURhdGEgPSB0aGlzLmNvbnRleHQuY3JlYXRlSW1hZ2VEYXRhKHRoaXMucmVjdGFuZ2xlLndpZHRoLCB0aGlzLnJlY3RhbmdsZS5oZWlnaHQpO1xuICAgIHRoaXMuY29udGV4dC5wdXRJbWFnZURhdGEodGhpcy5pbWFnZURhdGEsIHRoaXMucmVjdGFuZ2xlLngsIHRoaXMucmVjdGFuZ2xlLnkpO1xuICB9XG5cbiAgb25Qcm90b25VcGRhdGUoKSB7XG4gICAgdGhpcy5jb250ZXh0LmNsZWFyUmVjdCh0aGlzLnJlY3RhbmdsZS54LCB0aGlzLnJlY3RhbmdsZS55LCB0aGlzLnJlY3RhbmdsZS53aWR0aCwgdGhpcy5yZWN0YW5nbGUuaGVpZ2h0KTtcbiAgICB0aGlzLmltYWdlRGF0YSA9IHRoaXMuY29udGV4dC5nZXRJbWFnZURhdGEoXG4gICAgICB0aGlzLnJlY3RhbmdsZS54LFxuICAgICAgdGhpcy5yZWN0YW5nbGUueSxcbiAgICAgIHRoaXMucmVjdGFuZ2xlLndpZHRoLFxuICAgICAgdGhpcy5yZWN0YW5nbGUuaGVpZ2h0XG4gICAgKTtcbiAgfVxuXG4gIG9uUHJvdG9uVXBkYXRlQWZ0ZXIoKSB7XG4gICAgdGhpcy5jb250ZXh0LnB1dEltYWdlRGF0YSh0aGlzLmltYWdlRGF0YSwgdGhpcy5yZWN0YW5nbGUueCwgdGhpcy5yZWN0YW5nbGUueSk7XG4gIH1cblxuICBvblBhcnRpY2xlQ3JlYXRlZChwYXJ0aWNsZSkge31cblxuICBvblBhcnRpY2xlVXBkYXRlKHBhcnRpY2xlKSB7XG4gICAgaWYgKHRoaXMuaW1hZ2VEYXRhKSB7XG4gICAgICB0aGlzLnNldFBpeGVsKFxuICAgICAgICB0aGlzLmltYWdlRGF0YSxcbiAgICAgICAgKHBhcnRpY2xlLnAueCAtIHRoaXMucmVjdGFuZ2xlLngpID4+IDAsXG4gICAgICAgIChwYXJ0aWNsZS5wLnkgLSB0aGlzLnJlY3RhbmdsZS55KSA+PiAwLFxuICAgICAgICBwYXJ0aWNsZVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBzZXRQaXhlbChpbWFnZWRhdGEsIHgsIHksIHBhcnRpY2xlKSB7XG4gICAgY29uc3QgcmdiID0gcGFydGljbGUucmdiO1xuICAgIGlmICh4IDwgMCB8fCB4ID4gdGhpcy5lbGVtZW50LndpZHRoIHx8IHkgPCAwIHx8IHkgPiB0aGlzLmVsZW1lbnR3aWR0aCkgcmV0dXJuO1xuXG4gICAgY29uc3QgaSA9ICgoeSA+PiAwKSAqIGltYWdlZGF0YS53aWR0aCArICh4ID4+IDApKSAqIDQ7XG4gICAgaW1hZ2VkYXRhLmRhdGFbaV0gPSByZ2IucjtcbiAgICBpbWFnZWRhdGEuZGF0YVtpICsgMV0gPSByZ2IuZztcbiAgICBpbWFnZWRhdGEuZGF0YVtpICsgMl0gPSByZ2IuYjtcbiAgICBpbWFnZWRhdGEuZGF0YVtpICsgM10gPSBwYXJ0aWNsZS5hbHBoYSAqIDI1NTtcbiAgfVxuXG4gIG9uUGFydGljbGVEZWFkKHBhcnRpY2xlKSB7fVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuc3Ryb2tlID0gbnVsbDtcbiAgICB0aGlzLmNvbnRleHQgPSBudWxsO1xuICAgIHRoaXMuaW1hZ2VEYXRhID0gbnVsbDtcbiAgICB0aGlzLnJlY3RhbmdsZSA9IG51bGw7XG4gIH1cbn1cbiIsImltcG9ydCBUeXBlcyBmcm9tIFwiLi4vdXRpbHMvVHlwZXNcIjtcbmltcG9ydCBDb2xvclV0aWwgZnJvbSBcIi4uL3V0aWxzL0NvbG9yVXRpbFwiO1xuaW1wb3J0IE1hdGhVdGlsIGZyb20gXCIuLi9tYXRoL01hdGhVdGlsXCI7XG5pbXBvcnQgQmFzZVJlbmRlcmVyIGZyb20gXCIuL0Jhc2VSZW5kZXJlclwiO1xuXG5sZXQgUElYSUNsYXNzO1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGl4aVJlbmRlcmVyIGV4dGVuZHMgQmFzZVJlbmRlcmVyIHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgc3Ryb2tlKSB7XG4gICAgc3VwZXIoZWxlbWVudCk7XG5cbiAgICB0aGlzLnN0cm9rZSA9IHN0cm9rZTtcbiAgICB0aGlzLmNvbG9yID0gZmFsc2U7XG4gICAgdGhpcy5zZXRDb2xvciA9IGZhbHNlO1xuICAgIHRoaXMuYmxlbmRNb2RlID0gbnVsbDtcbiAgICB0aGlzLnBvb2wuY3JlYXRlID0gKGJvZHksIHBhcnRpY2xlKSA9PiB0aGlzLmNyZWF0ZUJvZHkoYm9keSwgcGFydGljbGUpO1xuICAgIHRoaXMuc2V0UElYSSh3aW5kb3cuUElYSSk7XG5cbiAgICB0aGlzLm5hbWUgPSBcIlBpeGlSZW5kZXJlclwiO1xuICB9XG5cbiAgc2V0UElYSShQSVhJKSB7XG4gICAgdHJ5IHtcbiAgICAgIFBJWElDbGFzcyA9IFBJWEkgfHwgeyBTcHJpdGU6IHt9IH07XG4gICAgICB0aGlzLmNyZWF0ZUZyb21JbWFnZSA9IFBJWElDbGFzcy5TcHJpdGUuZnJvbSB8fCBQSVhJQ2xhc3MuU3ByaXRlLmZyb21JbWFnZTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICB9XG5cbiAgb25Qcm90b25VcGRhdGUoKSB7fVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gcGFydGljbGVcbiAgICovXG4gIG9uUGFydGljbGVDcmVhdGVkKHBhcnRpY2xlKSB7XG4gICAgaWYgKHBhcnRpY2xlLmJvZHkpIHtcbiAgICAgIHBhcnRpY2xlLmJvZHkgPSB0aGlzLnBvb2wuZ2V0KHBhcnRpY2xlLmJvZHksIHBhcnRpY2xlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFydGljbGUuYm9keSA9IHRoaXMucG9vbC5nZXQodGhpcy5jaXJjbGVDb25mLCBwYXJ0aWNsZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYmxlbmRNb2RlKSB7XG4gICAgICBwYXJ0aWNsZS5ib2R5LmJsZW5kTW9kZSA9IHRoaXMuYmxlbmRNb2RlO1xuICAgIH1cblxuICAgIHRoaXMuZWxlbWVudC5hZGRDaGlsZChwYXJ0aWNsZS5ib2R5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gcGFydGljbGVcbiAgICovXG4gIG9uUGFydGljbGVVcGRhdGUocGFydGljbGUpIHtcbiAgICB0aGlzLnRyYW5zZm9ybShwYXJ0aWNsZSwgcGFydGljbGUuYm9keSk7XG5cbiAgICBpZiAodGhpcy5zZXRDb2xvciA9PT0gdHJ1ZSB8fCB0aGlzLmNvbG9yID09PSB0cnVlKSB7XG4gICAgICBwYXJ0aWNsZS5ib2R5LnRpbnQgPSBDb2xvclV0aWwuZ2V0SGV4MTZGcm9tUGFydGljbGUocGFydGljbGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gcGFydGljbGVcbiAgICovXG4gIG9uUGFydGljbGVEZWFkKHBhcnRpY2xlKSB7XG4gICAgdGhpcy5lbGVtZW50LnJlbW92ZUNoaWxkKHBhcnRpY2xlLmJvZHkpO1xuICAgIHRoaXMucG9vbC5leHBpcmUocGFydGljbGUuYm9keSk7XG4gICAgcGFydGljbGUuYm9keSA9IG51bGw7XG4gIH1cblxuICB0cmFuc2Zvcm0ocGFydGljbGUsIHRhcmdldCkge1xuICAgIHRhcmdldC54ID0gcGFydGljbGUucC54O1xuICAgIHRhcmdldC55ID0gcGFydGljbGUucC55O1xuXG4gICAgdGFyZ2V0LmFscGhhID0gcGFydGljbGUuYWxwaGE7XG5cbiAgICB0YXJnZXQuc2NhbGUueCA9IHBhcnRpY2xlLnNjYWxlO1xuICAgIHRhcmdldC5zY2FsZS55ID0gcGFydGljbGUuc2NhbGU7XG5cbiAgICAvLyB1c2luZyBjYWNoZWQgdmVyc2lvbiBvZiBNYXRoVXRpbC5QSV8xODAgZm9yIHNsaWdodCBwZXJmb3JtYW5jZSBpbmNyZWFzZS5cbiAgICB0YXJnZXQucm90YXRpb24gPSBwYXJ0aWNsZS5yb3RhdGlvbiAqIE1hdGhVdGlsLlBJXzE4MDsgLy8gTWF0aFV0aWwuUElfMTgwO1xuICB9XG5cbiAgY3JlYXRlQm9keShib2R5LCBwYXJ0aWNsZSkge1xuICAgIGlmIChib2R5LmlzQ2lyY2xlKSByZXR1cm4gdGhpcy5jcmVhdGVDaXJjbGUocGFydGljbGUpO1xuICAgIGVsc2UgcmV0dXJuIHRoaXMuY3JlYXRlU3ByaXRlKGJvZHkpO1xuICB9XG5cbiAgY3JlYXRlU3ByaXRlKGJvZHkpIHtcbiAgICBjb25zdCBzcHJpdGUgPSBib2R5LmlzSW5uZXIgPyB0aGlzLmNyZWF0ZUZyb21JbWFnZShib2R5LnNyYykgOiBuZXcgUElYSUNsYXNzLlNwcml0ZShib2R5KTtcblxuICAgIHNwcml0ZS5hbmNob3IueCA9IDAuNTtcbiAgICBzcHJpdGUuYW5jaG9yLnkgPSAwLjU7XG5cbiAgICByZXR1cm4gc3ByaXRlO1xuICB9XG5cbiAgY3JlYXRlQ2lyY2xlKHBhcnRpY2xlKSB7XG4gICAgY29uc3QgZ3JhcGhpY3MgPSBuZXcgUElYSUNsYXNzLkdyYXBoaWNzKCk7XG5cbiAgICBpZiAodGhpcy5zdHJva2UpIHtcbiAgICAgIGNvbnN0IHN0cm9rZSA9IFR5cGVzLmlzU3RyaW5nKHRoaXMuc3Ryb2tlKSA/IHRoaXMuc3Ryb2tlIDogMHgwMDAwMDA7XG4gICAgICBncmFwaGljcy5iZWdpblN0cm9rZShzdHJva2UpO1xuICAgIH1cblxuICAgIGdyYXBoaWNzLmJlZ2luRmlsbChwYXJ0aWNsZS5jb2xvciB8fCAweDAwOGNlZCk7XG4gICAgZ3JhcGhpY3MuZHJhd0NpcmNsZSgwLCAwLCBwYXJ0aWNsZS5yYWRpdXMpO1xuICAgIGdyYXBoaWNzLmVuZEZpbGwoKTtcblxuICAgIHJldHVybiBncmFwaGljcztcbiAgfVxuXG4gIGRlc3Ryb3kocGFydGljbGVzKSB7XG4gICAgc3VwZXIuZGVzdHJveSgpO1xuXG4gICAgbGV0IGkgPSBwYXJ0aWNsZXMubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIGxldCBwYXJ0aWNsZSA9IHBhcnRpY2xlc1tpXTtcbiAgICAgIGlmIChwYXJ0aWNsZS5ib2R5KSB7XG4gICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVDaGlsZChwYXJ0aWNsZS5ib2R5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBNYXQzIGZyb20gXCIuLi9tYXRoL01hdDNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTVN0YWNrIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5tYXRzID0gW107XG4gICAgdGhpcy5zaXplID0gMDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjA7IGkrKykgdGhpcy5tYXRzLnB1c2goTWF0My5jcmVhdGUoWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdKSk7XG4gIH1cblxuICBzZXQobSwgaSkge1xuICAgIGlmIChpID09PSAwKSBNYXQzLnNldChtLCB0aGlzLm1hdHNbMF0pO1xuICAgIGVsc2UgTWF0My5tdWx0aXBseSh0aGlzLm1hdHNbaSAtIDFdLCBtLCB0aGlzLm1hdHNbaV0pO1xuXG4gICAgdGhpcy5zaXplID0gTWF0aC5tYXgodGhpcy5zaXplLCBpICsgMSk7XG4gIH1cblxuICBwdXNoKG0pIHtcbiAgICBpZiAodGhpcy5zaXplID09PSAwKSBNYXQzLnNldChtLCB0aGlzLm1hdHNbMF0pO1xuICAgIGVsc2UgTWF0My5tdWx0aXBseSh0aGlzLm1hdHNbdGhpcy5zaXplIC0gMV0sIG0sIHRoaXMubWF0c1t0aGlzLnNpemVdKTtcblxuICAgIHRoaXMuc2l6ZSsrO1xuICB9XG5cbiAgcG9wKCkge1xuICAgIGlmICh0aGlzLnNpemUgPiAwKSB0aGlzLnNpemUtLTtcbiAgfVxuXG4gIHRvcCgpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRzW3RoaXMuc2l6ZSAtIDFdO1xuICB9XG59XG4iLCJpbXBvcnQgTWF0MyBmcm9tIFwiLi4vbWF0aC9NYXQzXCI7XG5pbXBvcnQgQmFzZVJlbmRlcmVyIGZyb20gXCIuL0Jhc2VSZW5kZXJlclwiO1xuXG5pbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IEltZ1V0aWwgZnJvbSBcIi4uL3V0aWxzL0ltZ1V0aWxcIjtcbmltcG9ydCBNU3RhY2sgZnJvbSBcIi4uL3V0aWxzL01TdGFja1wiO1xuaW1wb3J0IERvbVV0aWwgZnJvbSBcIi4uL3V0aWxzL0RvbVV0aWxcIjtcbmltcG9ydCBXZWJHTFV0aWwgZnJvbSBcIi4uL3V0aWxzL1dlYkdMVXRpbFwiO1xuaW1wb3J0IE1hdGhVdGlsIGZyb20gXCIuLi9tYXRoL01hdGhVdGlsXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdlYkdMUmVuZGVyZXIgZXh0ZW5kcyBCYXNlUmVuZGVyZXIge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50KSB7XG4gICAgc3VwZXIoZWxlbWVudCk7XG5cbiAgICB0aGlzLmdsID0gdGhpcy5lbGVtZW50LmdldENvbnRleHQoXCJleHBlcmltZW50YWwtd2ViZ2xcIiwgeyBhbnRpYWxpYXM6IHRydWUsIHN0ZW5jaWw6IGZhbHNlLCBkZXB0aDogZmFsc2UgfSk7XG4gICAgaWYgKCF0aGlzLmdsKSBhbGVydChcIlNvcnJ5IHlvdXIgYnJvd3NlciBkbyBub3Qgc3VwcGVzdCBXZWJHTCFcIik7XG5cbiAgICB0aGlzLmluaXRWYXIoKTtcbiAgICB0aGlzLnNldE1heFJhZGl1cygpO1xuICAgIHRoaXMuaW5pdFNoYWRlcnMoKTtcbiAgICB0aGlzLmluaXRCdWZmZXJzKCk7XG5cbiAgICB0aGlzLmdsLmJsZW5kRXF1YXRpb24odGhpcy5nbC5GVU5DX0FERCk7XG4gICAgdGhpcy5nbC5ibGVuZEZ1bmModGhpcy5nbC5TUkNfQUxQSEEsIHRoaXMuZ2wuT05FX01JTlVTX1NSQ19BTFBIQSk7XG4gICAgdGhpcy5nbC5lbmFibGUodGhpcy5nbC5CTEVORCk7XG4gICAgdGhpcy5hZGRJbWcyQm9keSA9IHRoaXMuYWRkSW1nMkJvZHkuYmluZCh0aGlzKTtcblxuICAgIHRoaXMubmFtZSA9IFwiV2ViR0xSZW5kZXJlclwiO1xuICB9XG5cbiAgaW5pdChwcm90b24pIHtcbiAgICBzdXBlci5pbml0KHByb3Rvbik7XG4gICAgdGhpcy5yZXNpemUodGhpcy5lbGVtZW50LndpZHRoLCB0aGlzLmVsZW1lbnQuaGVpZ2h0KTtcbiAgfVxuXG4gIHJlc2l6ZSh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgdGhpcy51bWF0WzRdID0gLTI7XG4gICAgdGhpcy51bWF0WzddID0gMTtcblxuICAgIHRoaXMuc21hdFswXSA9IDEgLyB3aWR0aDtcbiAgICB0aGlzLnNtYXRbNF0gPSAxIC8gaGVpZ2h0O1xuXG4gICAgdGhpcy5tc3RhY2suc2V0KHRoaXMudW1hdCwgMCk7XG4gICAgdGhpcy5tc3RhY2suc2V0KHRoaXMuc21hdCwgMSk7XG5cbiAgICB0aGlzLmdsLnZpZXdwb3J0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIHRoaXMuZWxlbWVudC53aWR0aCA9IHdpZHRoO1xuICAgIHRoaXMuZWxlbWVudC5oZWlnaHQgPSBoZWlnaHQ7XG4gIH1cblxuICBzZXRNYXhSYWRpdXMocmFkaXVzKSB7XG4gICAgdGhpcy5jaXJjbGVDYW52YXNVUkwgPSB0aGlzLmNyZWF0ZUNpcmNsZShyYWRpdXMpO1xuICB9XG5cbiAgZ2V0VmVydGV4U2hhZGVyKCkge1xuICAgIGNvbnN0IHZzU291cmNlID0gW1xuICAgICAgXCJ1bmlmb3JtIHZlYzIgdmlld3BvcnQ7XCIsXG4gICAgICBcImF0dHJpYnV0ZSB2ZWMyIGFWZXJ0ZXhQb3NpdGlvbjtcIixcbiAgICAgIFwiYXR0cmlidXRlIHZlYzIgYVRleHR1cmVDb29yZDtcIixcbiAgICAgIFwidW5pZm9ybSBtYXQzIHRNYXQ7XCIsXG4gICAgICBcInZhcnlpbmcgdmVjMiB2VGV4dHVyZUNvb3JkO1wiLFxuICAgICAgXCJ2YXJ5aW5nIGZsb2F0IGFscGhhO1wiLFxuICAgICAgXCJ2b2lkIG1haW4oKSB7XCIsXG4gICAgICBcInZlYzMgdiA9IHRNYXQgKiB2ZWMzKGFWZXJ0ZXhQb3NpdGlvbiwgMS4wKTtcIixcbiAgICAgIFwiZ2xfUG9zaXRpb24gPSB2ZWM0KHYueCwgdi55LCAwLCAxKTtcIixcbiAgICAgIFwidlRleHR1cmVDb29yZCA9IGFUZXh0dXJlQ29vcmQ7XCIsXG4gICAgICBcImFscGhhID0gdE1hdFswXVsyXTtcIixcbiAgICAgIFwifVwiXG4gICAgXS5qb2luKFwiXFxuXCIpO1xuICAgIHJldHVybiB2c1NvdXJjZTtcbiAgfVxuXG4gIGdldEZyYWdtZW50U2hhZGVyKCkge1xuICAgIGNvbnN0IGZzU291cmNlID0gW1xuICAgICAgXCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcIixcbiAgICAgIFwidmFyeWluZyB2ZWMyIHZUZXh0dXJlQ29vcmQ7XCIsXG4gICAgICBcInZhcnlpbmcgZmxvYXQgYWxwaGE7XCIsXG4gICAgICBcInVuaWZvcm0gc2FtcGxlcjJEIHVTYW1wbGVyO1wiLFxuICAgICAgXCJ1bmlmb3JtIHZlYzQgY29sb3I7XCIsXG4gICAgICBcInVuaWZvcm0gYm9vbCB1c2VUZXh0dXJlO1wiLFxuICAgICAgXCJ1bmlmb3JtIHZlYzMgdUNvbG9yO1wiLFxuICAgICAgXCJ2b2lkIG1haW4oKSB7XCIsXG4gICAgICBcInZlYzQgdGV4dHVyZUNvbG9yID0gdGV4dHVyZTJEKHVTYW1wbGVyLCB2VGV4dHVyZUNvb3JkKTtcIixcbiAgICAgIFwiZ2xfRnJhZ0NvbG9yID0gdGV4dHVyZUNvbG9yICogdmVjNCh1Q29sb3IsIDEuMCk7XCIsXG4gICAgICBcImdsX0ZyYWdDb2xvci53ICo9IGFscGhhO1wiLFxuICAgICAgXCJ9XCJcbiAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgcmV0dXJuIGZzU291cmNlO1xuICB9XG5cbiAgaW5pdFZhcigpIHtcbiAgICB0aGlzLm1zdGFjayA9IG5ldyBNU3RhY2soKTtcbiAgICB0aGlzLnVtYXQgPSBNYXQzLmNyZWF0ZShbMiwgMCwgMSwgMCwgLTIsIDAsIC0xLCAxLCAxXSk7XG4gICAgdGhpcy5zbWF0ID0gTWF0My5jcmVhdGUoWzEgLyAxMDAsIDAsIDEsIDAsIDEgLyAxMDAsIDAsIDAsIDAsIDFdKTtcbiAgICB0aGlzLnRleHR1cmVidWZmZXJzID0ge307XG4gIH1cblxuICBibGVuZEVxdWF0aW9uKEEpIHtcbiAgICB0aGlzLmdsLmJsZW5kRXF1YXRpb24odGhpcy5nbFtBXSk7XG4gIH1cblxuICBibGVuZEZ1bmMoQSwgQikge1xuICAgIHRoaXMuZ2wuYmxlbmRGdW5jKHRoaXMuZ2xbQV0sIHRoaXMuZ2xbQl0pO1xuICB9XG5cbiAgZ2V0U2hhZGVyKGdsLCBzdHIsIGZzKSB7XG4gICAgY29uc3Qgc2hhZGVyID0gZnMgPyBnbC5jcmVhdGVTaGFkZXIoZ2wuRlJBR01FTlRfU0hBREVSKSA6IGdsLmNyZWF0ZVNoYWRlcihnbC5WRVJURVhfU0hBREVSKTtcblxuICAgIGdsLnNoYWRlclNvdXJjZShzaGFkZXIsIHN0cik7XG4gICAgZ2wuY29tcGlsZVNoYWRlcihzaGFkZXIpO1xuXG4gICAgaWYgKCFnbC5nZXRTaGFkZXJQYXJhbWV0ZXIoc2hhZGVyLCBnbC5DT01QSUxFX1NUQVRVUykpIHtcbiAgICAgIGFsZXJ0KGdsLmdldFNoYWRlckluZm9Mb2coc2hhZGVyKSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gc2hhZGVyO1xuICB9XG5cbiAgaW5pdFNoYWRlcnMoKSB7XG4gICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSB0aGlzLmdldFNoYWRlcih0aGlzLmdsLCB0aGlzLmdldEZyYWdtZW50U2hhZGVyKCksIHRydWUpO1xuICAgIGNvbnN0IHZlcnRleFNoYWRlciA9IHRoaXMuZ2V0U2hhZGVyKHRoaXMuZ2wsIHRoaXMuZ2V0VmVydGV4U2hhZGVyKCksIGZhbHNlKTtcblxuICAgIHRoaXMuc3Byb2dyYW0gPSB0aGlzLmdsLmNyZWF0ZVByb2dyYW0oKTtcbiAgICB0aGlzLmdsLmF0dGFjaFNoYWRlcih0aGlzLnNwcm9ncmFtLCB2ZXJ0ZXhTaGFkZXIpO1xuICAgIHRoaXMuZ2wuYXR0YWNoU2hhZGVyKHRoaXMuc3Byb2dyYW0sIGZyYWdtZW50U2hhZGVyKTtcbiAgICB0aGlzLmdsLmxpbmtQcm9ncmFtKHRoaXMuc3Byb2dyYW0pO1xuXG4gICAgaWYgKCF0aGlzLmdsLmdldFByb2dyYW1QYXJhbWV0ZXIodGhpcy5zcHJvZ3JhbSwgdGhpcy5nbC5MSU5LX1NUQVRVUykpIGFsZXJ0KFwiQ291bGQgbm90IGluaXRpYWxpc2Ugc2hhZGVyc1wiKTtcblxuICAgIHRoaXMuZ2wudXNlUHJvZ3JhbSh0aGlzLnNwcm9ncmFtKTtcbiAgICB0aGlzLnNwcm9ncmFtLnZwYSA9IHRoaXMuZ2wuZ2V0QXR0cmliTG9jYXRpb24odGhpcy5zcHJvZ3JhbSwgXCJhVmVydGV4UG9zaXRpb25cIik7XG4gICAgdGhpcy5zcHJvZ3JhbS50Y2EgPSB0aGlzLmdsLmdldEF0dHJpYkxvY2F0aW9uKHRoaXMuc3Byb2dyYW0sIFwiYVRleHR1cmVDb29yZFwiKTtcbiAgICB0aGlzLmdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHRoaXMuc3Byb2dyYW0udGNhKTtcbiAgICB0aGlzLmdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHRoaXMuc3Byb2dyYW0udnBhKTtcblxuICAgIHRoaXMuc3Byb2dyYW0udE1hdFVuaWZvcm0gPSB0aGlzLmdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnNwcm9ncmFtLCBcInRNYXRcIik7XG4gICAgdGhpcy5zcHJvZ3JhbS5zYW1wbGVyVW5pZm9ybSA9IHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMuc3Byb2dyYW0sIFwidVNhbXBsZXJcIik7XG4gICAgdGhpcy5zcHJvZ3JhbS51c2VUZXggPSB0aGlzLmdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnNwcm9ncmFtLCBcInVzZVRleHR1cmVcIik7XG4gICAgdGhpcy5zcHJvZ3JhbS5jb2xvciA9IHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMuc3Byb2dyYW0sIFwidUNvbG9yXCIpO1xuICAgIHRoaXMuZ2wudW5pZm9ybTFpKHRoaXMuc3Byb2dyYW0udXNlVGV4LCAxKTtcbiAgfVxuXG4gIGluaXRCdWZmZXJzKCkge1xuICAgIGNvbnN0IHZzID0gWzAsIDMsIDEsIDAsIDIsIDNdO1xuICAgIGxldCBpZHg7XG5cbiAgICB0aGlzLnVuaXRJQnVmZmVyID0gdGhpcy5nbC5jcmVhdGVCdWZmZXIoKTtcbiAgICB0aGlzLmdsLmJpbmRCdWZmZXIodGhpcy5nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgdGhpcy51bml0SUJ1ZmZlcik7XG4gICAgdGhpcy5nbC5idWZmZXJEYXRhKHRoaXMuZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIG5ldyBVaW50MTZBcnJheSh2cyksIHRoaXMuZ2wuU1RBVElDX0RSQVcpO1xuXG4gICAgbGV0IGk7XG4gICAgbGV0IGlkcyA9IFtdO1xuICAgIGZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgaWRzLnB1c2goaSk7XG4gICAgaWR4ID0gbmV3IFVpbnQxNkFycmF5KGlkcyk7XG5cbiAgICB0aGlzLnVuaXRJMzMgPSB0aGlzLmdsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCB0aGlzLnVuaXRJMzMpO1xuICAgIHRoaXMuZ2wuYnVmZmVyRGF0YSh0aGlzLmdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBpZHgsIHRoaXMuZ2wuU1RBVElDX0RSQVcpO1xuXG4gICAgaWRzID0gW107XG4gICAgZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSBpZHMucHVzaChpLCBpICsgMSwgaSArIDIpO1xuICAgIGlkeCA9IG5ldyBVaW50MTZBcnJheShpZHMpO1xuXG4gICAgdGhpcy5zdHJpcEJ1ZmZlciA9IHRoaXMuZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgdGhpcy5nbC5iaW5kQnVmZmVyKHRoaXMuZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIHRoaXMuc3RyaXBCdWZmZXIpO1xuICAgIHRoaXMuZ2wuYnVmZmVyRGF0YSh0aGlzLmdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBpZHgsIHRoaXMuZ2wuU1RBVElDX0RSQVcpO1xuICB9XG5cbiAgY3JlYXRlQ2lyY2xlKHJhaWR1cykge1xuICAgIHRoaXMuY2lyY2xlQ2FudmFzUmFkaXVzID0gV2ViR0xVdGlsLm5ocG90KFV0aWwuaW5pdFZhbHVlKHJhaWR1cywgMzIpKTtcbiAgICBjb25zdCBjYW52YXMgPSBEb21VdGlsLmNyZWF0ZUNhbnZhcyhcImNpcmNsZV9jYW52YXNcIiwgdGhpcy5jaXJjbGVDYW52YXNSYWRpdXMgKiAyLCB0aGlzLmNpcmNsZUNhbnZhc1JhZGl1cyAqIDIpO1xuICAgIGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuXG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICBjb250ZXh0LmFyYyh0aGlzLmNpcmNsZUNhbnZhc1JhZGl1cywgdGhpcy5jaXJjbGVDYW52YXNSYWRpdXMsIHRoaXMuY2lyY2xlQ2FudmFzUmFkaXVzLCAwLCBNYXRoLlBJICogMiwgdHJ1ZSk7XG4gICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICBjb250ZXh0LmZpbGxTdHlsZSA9IFwiI0ZGRlwiO1xuICAgIGNvbnRleHQuZmlsbCgpO1xuXG4gICAgcmV0dXJuIGNhbnZhcy50b0RhdGFVUkwoKTtcbiAgfVxuXG4gIGRyYXdJbWcyQ2FudmFzKHBhcnRpY2xlKSB7XG4gICAgY29uc3QgX3cgPSBwYXJ0aWNsZS5ib2R5LndpZHRoO1xuICAgIGNvbnN0IF9oID0gcGFydGljbGUuYm9keS5oZWlnaHQ7XG5cbiAgICBjb25zdCBfd2lkdGggPSBXZWJHTFV0aWwubmhwb3QocGFydGljbGUuYm9keS53aWR0aCk7XG4gICAgY29uc3QgX2hlaWdodCA9IFdlYkdMVXRpbC5uaHBvdChwYXJ0aWNsZS5ib2R5LmhlaWdodCk7XG5cbiAgICBjb25zdCBfc2NhbGVYID0gcGFydGljbGUuYm9keS53aWR0aCAvIF93aWR0aDtcbiAgICBjb25zdCBfc2NhbGVZID0gcGFydGljbGUuYm9keS5oZWlnaHQgLyBfaGVpZ2h0O1xuXG4gICAgaWYgKCF0aGlzLnRleHR1cmVidWZmZXJzW3BhcnRpY2xlLmRhdGEuc3JjXSlcbiAgICAgIHRoaXMudGV4dHVyZWJ1ZmZlcnNbcGFydGljbGUuZGF0YS5zcmNdID0gW1xuICAgICAgICB0aGlzLmdsLmNyZWF0ZVRleHR1cmUoKSxcbiAgICAgICAgdGhpcy5nbC5jcmVhdGVCdWZmZXIoKSxcbiAgICAgICAgdGhpcy5nbC5jcmVhdGVCdWZmZXIoKVxuICAgICAgXTtcblxuICAgIHBhcnRpY2xlLmRhdGEudGV4dHVyZSA9IHRoaXMudGV4dHVyZWJ1ZmZlcnNbcGFydGljbGUuZGF0YS5zcmNdWzBdO1xuICAgIHBhcnRpY2xlLmRhdGEudmNCdWZmZXIgPSB0aGlzLnRleHR1cmVidWZmZXJzW3BhcnRpY2xlLmRhdGEuc3JjXVsxXTtcbiAgICBwYXJ0aWNsZS5kYXRhLnRjQnVmZmVyID0gdGhpcy50ZXh0dXJlYnVmZmVyc1twYXJ0aWNsZS5kYXRhLnNyY11bMl07XG5cbiAgICB0aGlzLmdsLmJpbmRCdWZmZXIodGhpcy5nbC5BUlJBWV9CVUZGRVIsIHBhcnRpY2xlLmRhdGEudGNCdWZmZXIpO1xuICAgIHRoaXMuZ2wuYnVmZmVyRGF0YShcbiAgICAgIHRoaXMuZ2wuQVJSQVlfQlVGRkVSLFxuICAgICAgbmV3IEZsb2F0MzJBcnJheShbMC4wLCAwLjAsIF9zY2FsZVgsIDAuMCwgMC4wLCBfc2NhbGVZLCBfc2NhbGVZLCBfc2NhbGVZXSksXG4gICAgICB0aGlzLmdsLlNUQVRJQ19EUkFXXG4gICAgKTtcbiAgICB0aGlzLmdsLmJpbmRCdWZmZXIodGhpcy5nbC5BUlJBWV9CVUZGRVIsIHBhcnRpY2xlLmRhdGEudmNCdWZmZXIpO1xuICAgIHRoaXMuZ2wuYnVmZmVyRGF0YShcbiAgICAgIHRoaXMuZ2wuQVJSQVlfQlVGRkVSLFxuICAgICAgbmV3IEZsb2F0MzJBcnJheShbMC4wLCAwLjAsIF93LCAwLjAsIDAuMCwgX2gsIF93LCBfaF0pLFxuICAgICAgdGhpcy5nbC5TVEFUSUNfRFJBV1xuICAgICk7XG5cbiAgICBjb25zdCBjb250ZXh0ID0gcGFydGljbGUuZGF0YS5jYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgIGNvbnN0IGRhdGEgPSBjb250ZXh0LmdldEltYWdlRGF0YSgwLCAwLCBfd2lkdGgsIF9oZWlnaHQpO1xuXG4gICAgdGhpcy5nbC5iaW5kVGV4dHVyZSh0aGlzLmdsLlRFWFRVUkVfMkQsIHBhcnRpY2xlLmRhdGEudGV4dHVyZSk7XG4gICAgdGhpcy5nbC50ZXhJbWFnZTJEKHRoaXMuZ2wuVEVYVFVSRV8yRCwgMCwgdGhpcy5nbC5SR0JBLCB0aGlzLmdsLlJHQkEsIHRoaXMuZ2wuVU5TSUdORURfQllURSwgZGF0YSk7XG4gICAgdGhpcy5nbC50ZXhQYXJhbWV0ZXJpKHRoaXMuZ2wuVEVYVFVSRV8yRCwgdGhpcy5nbC5URVhUVVJFX01BR19GSUxURVIsIHRoaXMuZ2wuTElORUFSKTtcbiAgICB0aGlzLmdsLnRleFBhcmFtZXRlcmkodGhpcy5nbC5URVhUVVJFXzJELCB0aGlzLmdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgdGhpcy5nbC5MSU5FQVJfTUlQTUFQX05FQVJFU1QpO1xuICAgIHRoaXMuZ2wuZ2VuZXJhdGVNaXBtYXAodGhpcy5nbC5URVhUVVJFXzJEKTtcblxuICAgIHBhcnRpY2xlLmRhdGEudGV4dHVyZUxvYWRlZCA9IHRydWU7XG4gICAgcGFydGljbGUuZGF0YS50ZXh0dXJlV2lkdGggPSBfdztcbiAgICBwYXJ0aWNsZS5kYXRhLnRleHR1cmVIZWlnaHQgPSBfaDtcbiAgfVxuXG4gIG9uUHJvdG9uVXBkYXRlKCkge1xuICAgIC8vIHRoaXMuZ2wuY2xlYXJDb2xvcigwLCAwLCAwLCAxKTtcbiAgICAvLyB0aGlzLmdsLmNsZWFyKHRoaXMuZ2wuQ09MT1JfQlVGRkVSX0JJVCB8IHRoaXMuZ2wuREVQVEhfQlVGRkVSX0JJVCk7XG4gIH1cblxuICBvblBhcnRpY2xlQ3JlYXRlZChwYXJ0aWNsZSkge1xuICAgIHBhcnRpY2xlLmRhdGEudGV4dHVyZUxvYWRlZCA9IGZhbHNlO1xuICAgIHBhcnRpY2xlLmRhdGEudG1hdCA9IE1hdDMuY3JlYXRlKCk7XG4gICAgcGFydGljbGUuZGF0YS50bWF0WzhdID0gMTtcbiAgICBwYXJ0aWNsZS5kYXRhLmltYXQgPSBNYXQzLmNyZWF0ZSgpO1xuICAgIHBhcnRpY2xlLmRhdGEuaW1hdFs4XSA9IDE7XG5cbiAgICBpZiAocGFydGljbGUuYm9keSkge1xuICAgICAgSW1nVXRpbC5nZXRJbWdGcm9tQ2FjaGUocGFydGljbGUuYm9keSwgdGhpcy5hZGRJbWcyQm9keSwgcGFydGljbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBJbWdVdGlsLmdldEltZ0Zyb21DYWNoZSh0aGlzLmNpcmNsZUNhbnZhc1VSTCwgdGhpcy5hZGRJbWcyQm9keSwgcGFydGljbGUpO1xuICAgICAgcGFydGljbGUuZGF0YS5vbGRTY2FsZSA9IHBhcnRpY2xlLnJhZGl1cyAvIHRoaXMuY2lyY2xlQ2FudmFzUmFkaXVzO1xuICAgIH1cbiAgfVxuXG4gIC8vIHByaXZhdGVcbiAgYWRkSW1nMkJvZHkoaW1nLCBwYXJ0aWNsZSkge1xuICAgIGlmIChwYXJ0aWNsZS5kZWFkKSByZXR1cm47XG4gICAgcGFydGljbGUuYm9keSA9IGltZztcbiAgICBwYXJ0aWNsZS5kYXRhLnNyYyA9IGltZy5zcmM7XG4gICAgcGFydGljbGUuZGF0YS5jYW52YXMgPSBJbWdVdGlsLmdldENhbnZhc0Zyb21DYWNoZShpbWcpO1xuICAgIHBhcnRpY2xlLmRhdGEub2xkU2NhbGUgPSAxO1xuXG4gICAgdGhpcy5kcmF3SW1nMkNhbnZhcyhwYXJ0aWNsZSk7XG4gIH1cblxuICBvblBhcnRpY2xlVXBkYXRlKHBhcnRpY2xlKSB7XG4gICAgaWYgKHBhcnRpY2xlLmRhdGEudGV4dHVyZUxvYWRlZCkge1xuICAgICAgdGhpcy51cGRhdGVNYXRyaXgocGFydGljbGUpO1xuXG4gICAgICB0aGlzLmdsLnVuaWZvcm0zZih0aGlzLnNwcm9ncmFtLmNvbG9yLCBwYXJ0aWNsZS5yZ2IuciAvIDI1NSwgcGFydGljbGUucmdiLmcgLyAyNTUsIHBhcnRpY2xlLnJnYi5iIC8gMjU1KTtcbiAgICAgIHRoaXMuZ2wudW5pZm9ybU1hdHJpeDNmdih0aGlzLnNwcm9ncmFtLnRNYXRVbmlmb3JtLCBmYWxzZSwgdGhpcy5tc3RhY2sudG9wKCkpO1xuXG4gICAgICB0aGlzLmdsLmJpbmRCdWZmZXIodGhpcy5nbC5BUlJBWV9CVUZGRVIsIHBhcnRpY2xlLmRhdGEudmNCdWZmZXIpO1xuICAgICAgdGhpcy5nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHRoaXMuc3Byb2dyYW0udnBhLCAyLCB0aGlzLmdsLkZMT0FULCBmYWxzZSwgMCwgMCk7XG4gICAgICB0aGlzLmdsLmJpbmRCdWZmZXIodGhpcy5nbC5BUlJBWV9CVUZGRVIsIHBhcnRpY2xlLmRhdGEudGNCdWZmZXIpO1xuICAgICAgdGhpcy5nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHRoaXMuc3Byb2dyYW0udGNhLCAyLCB0aGlzLmdsLkZMT0FULCBmYWxzZSwgMCwgMCk7XG4gICAgICB0aGlzLmdsLmJpbmRUZXh0dXJlKHRoaXMuZ2wuVEVYVFVSRV8yRCwgcGFydGljbGUuZGF0YS50ZXh0dXJlKTtcbiAgICAgIHRoaXMuZ2wudW5pZm9ybTFpKHRoaXMuc3Byb2dyYW0uc2FtcGxlclVuaWZvcm0sIDApO1xuICAgICAgdGhpcy5nbC5iaW5kQnVmZmVyKHRoaXMuZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIHRoaXMudW5pdElCdWZmZXIpO1xuXG4gICAgICB0aGlzLmdsLmRyYXdFbGVtZW50cyh0aGlzLmdsLlRSSUFOR0xFUywgNiwgdGhpcy5nbC5VTlNJR05FRF9TSE9SVCwgMCk7XG4gICAgICB0aGlzLm1zdGFjay5wb3AoKTtcbiAgICB9XG4gIH1cblxuICBvblBhcnRpY2xlRGVhZChwYXJ0aWNsZSkge31cblxuICB1cGRhdGVNYXRyaXgocGFydGljbGUpIHtcbiAgICBjb25zdCBtb3ZlT3JpZ2luTWF0cml4ID0gV2ViR0xVdGlsLm1ha2VUcmFuc2xhdGlvbihcbiAgICAgIC1wYXJ0aWNsZS5kYXRhLnRleHR1cmVXaWR0aCAvIDIsXG4gICAgICAtcGFydGljbGUuZGF0YS50ZXh0dXJlSGVpZ2h0IC8gMlxuICAgICk7XG4gICAgY29uc3QgdHJhbnNsYXRpb25NYXRyaXggPSBXZWJHTFV0aWwubWFrZVRyYW5zbGF0aW9uKHBhcnRpY2xlLnAueCwgcGFydGljbGUucC55KTtcblxuICAgIGNvbnN0IGFuZ2VsID0gcGFydGljbGUucm90YXRpb24gKiBNYXRoVXRpbC5QSV8xODA7XG4gICAgY29uc3Qgcm90YXRpb25NYXRyaXggPSBXZWJHTFV0aWwubWFrZVJvdGF0aW9uKGFuZ2VsKTtcblxuICAgIGNvbnN0IHNjYWxlID0gcGFydGljbGUuc2NhbGUgKiBwYXJ0aWNsZS5kYXRhLm9sZFNjYWxlO1xuICAgIGNvbnN0IHNjYWxlTWF0cml4ID0gV2ViR0xVdGlsLm1ha2VTY2FsZShzY2FsZSwgc2NhbGUpO1xuICAgIGxldCBtYXRyaXggPSBXZWJHTFV0aWwubWF0cml4TXVsdGlwbHkobW92ZU9yaWdpbk1hdHJpeCwgc2NhbGVNYXRyaXgpO1xuXG4gICAgbWF0cml4ID0gV2ViR0xVdGlsLm1hdHJpeE11bHRpcGx5KG1hdHJpeCwgcm90YXRpb25NYXRyaXgpO1xuICAgIG1hdHJpeCA9IFdlYkdMVXRpbC5tYXRyaXhNdWx0aXBseShtYXRyaXgsIHRyYW5zbGF0aW9uTWF0cml4KTtcblxuICAgIE1hdDMuaW52ZXJzZShtYXRyaXgsIHBhcnRpY2xlLmRhdGEuaW1hdCk7XG4gICAgbWF0cml4WzJdID0gcGFydGljbGUuYWxwaGE7XG5cbiAgICB0aGlzLm1zdGFjay5wdXNoKG1hdHJpeCk7XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICB0aGlzLmdsID0gbnVsbDtcbiAgICB0aGlzLm1zdGFjayA9IG51bGw7XG4gICAgdGhpcy51bWF0ID0gbnVsbDtcbiAgICB0aGlzLnNtYXQgPSBudWxsO1xuICAgIHRoaXMudGV4dHVyZWJ1ZmZlcnMgPSBudWxsO1xuICB9XG59XG4iLCJpbXBvcnQgQmFzZVJlbmRlcmVyIGZyb20gXCIuL0Jhc2VSZW5kZXJlclwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDdXN0b21SZW5kZXJlciBleHRlbmRzIEJhc2VSZW5kZXJlciB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQpIHtcbiAgICBzdXBlcihlbGVtZW50KTtcblxuICAgIHRoaXMubmFtZSA9IFwiQ3VzdG9tUmVuZGVyZXJcIjtcbiAgfVxufVxuIiwiaW1wb3J0IFpvbmUgZnJvbSBcIi4vWm9uZVwiO1xuaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBNYXRoVXRpbCBmcm9tIFwiLi4vbWF0aC9NYXRoVXRpbFwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaW5lWm9uZSBleHRlbmRzIFpvbmUge1xuICBjb25zdHJ1Y3Rvcih4MSwgeTEsIHgyLCB5MiwgZGlyZWN0aW9uKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGlmICh4MiAtIHgxID49IDApIHtcbiAgICAgIHRoaXMueDEgPSB4MTtcbiAgICAgIHRoaXMueTEgPSB5MTtcbiAgICAgIHRoaXMueDIgPSB4MjtcbiAgICAgIHRoaXMueTIgPSB5MjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy54MSA9IHgyO1xuICAgICAgdGhpcy55MSA9IHkyO1xuICAgICAgdGhpcy54MiA9IHgxO1xuICAgICAgdGhpcy55MiA9IHkxO1xuICAgIH1cblxuICAgIHRoaXMuZHggPSB0aGlzLngyIC0gdGhpcy54MTtcbiAgICB0aGlzLmR5ID0gdGhpcy55MiAtIHRoaXMueTE7XG5cbiAgICB0aGlzLm1pbnggPSBNYXRoLm1pbih0aGlzLngxLCB0aGlzLngyKTtcbiAgICB0aGlzLm1pbnkgPSBNYXRoLm1pbih0aGlzLnkxLCB0aGlzLnkyKTtcbiAgICB0aGlzLm1heHggPSBNYXRoLm1heCh0aGlzLngxLCB0aGlzLngyKTtcbiAgICB0aGlzLm1heHkgPSBNYXRoLm1heCh0aGlzLnkxLCB0aGlzLnkyKTtcblxuICAgIHRoaXMuZG90ID0gdGhpcy54MiAqIHRoaXMueTEgLSB0aGlzLngxICogdGhpcy55MjtcbiAgICB0aGlzLnh4eXkgPSB0aGlzLmR4ICogdGhpcy5keCArIHRoaXMuZHkgKiB0aGlzLmR5O1xuXG4gICAgdGhpcy5ncmFkaWVudCA9IHRoaXMuZ2V0R3JhZGllbnQoKTtcbiAgICB0aGlzLmxlbmd0aCA9IHRoaXMuZ2V0TGVuZ3RoKCk7XG4gICAgdGhpcy5kaXJlY3Rpb24gPSBVdGlsLmluaXRWYWx1ZShkaXJlY3Rpb24sIFwiPlwiKTtcbiAgfVxuXG4gIGdldFBvc2l0aW9uKCkge1xuICAgIHRoaXMucmFuZG9tID0gTWF0aC5yYW5kb20oKTtcbiAgICB0aGlzLnZlY3Rvci54ID0gdGhpcy54MSArIHRoaXMucmFuZG9tICogdGhpcy5sZW5ndGggKiBNYXRoLmNvcyh0aGlzLmdyYWRpZW50KTtcbiAgICB0aGlzLnZlY3Rvci55ID0gdGhpcy55MSArIHRoaXMucmFuZG9tICogdGhpcy5sZW5ndGggKiBNYXRoLnNpbih0aGlzLmdyYWRpZW50KTtcblxuICAgIHJldHVybiB0aGlzLnZlY3RvcjtcbiAgfVxuXG4gIGdldERpcmVjdGlvbih4LCB5KSB7XG4gICAgY29uc3QgQSA9IHRoaXMuZHk7XG4gICAgY29uc3QgQiA9IC10aGlzLmR4O1xuICAgIGNvbnN0IEMgPSB0aGlzLmRvdDtcbiAgICBjb25zdCBEID0gQiA9PT0gMCA/IDEgOiBCO1xuXG4gICAgaWYgKChBICogeCArIEIgKiB5ICsgQykgKiBEID4gMCkgcmV0dXJuIHRydWU7XG4gICAgZWxzZSByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXREaXN0YW5jZSh4LCB5KSB7XG4gICAgY29uc3QgQSA9IHRoaXMuZHk7XG4gICAgY29uc3QgQiA9IC10aGlzLmR4O1xuICAgIGNvbnN0IEMgPSB0aGlzLmRvdDtcbiAgICBjb25zdCBEID0gQSAqIHggKyBCICogeSArIEM7XG5cbiAgICByZXR1cm4gRCAvIE1hdGguc3FydCh0aGlzLnh4eXkpO1xuICB9XG5cbiAgZ2V0U3ltbWV0cmljKHYpIHtcbiAgICBjb25zdCB0aGEyID0gdi5nZXRHcmFkaWVudCgpO1xuICAgIGNvbnN0IHRoYTEgPSB0aGlzLmdldEdyYWRpZW50KCk7XG4gICAgY29uc3QgdGhhID0gMiAqICh0aGExIC0gdGhhMik7XG5cbiAgICBjb25zdCBvbGR4ID0gdi54O1xuICAgIGNvbnN0IG9sZHkgPSB2Lnk7XG5cbiAgICB2LnggPSBvbGR4ICogTWF0aC5jb3ModGhhKSAtIG9sZHkgKiBNYXRoLnNpbih0aGEpO1xuICAgIHYueSA9IG9sZHggKiBNYXRoLnNpbih0aGEpICsgb2xkeSAqIE1hdGguY29zKHRoYSk7XG5cbiAgICByZXR1cm4gdjtcbiAgfVxuXG4gIGdldEdyYWRpZW50KCkge1xuICAgIHJldHVybiBNYXRoLmF0YW4yKHRoaXMuZHksIHRoaXMuZHgpO1xuICB9XG5cbiAgcmFuZ2VPdXQocGFydGljbGUpIHtcbiAgICBjb25zdCBhbmdsZSA9IE1hdGguYWJzKHRoaXMuZ2V0R3JhZGllbnQoKSk7XG5cbiAgICBpZiAoYW5nbGUgPD0gTWF0aFV0aWwuUEkgLyA0KSB7XG4gICAgICBpZiAocGFydGljbGUucC54IDw9IHRoaXMubWF4eCAmJiBwYXJ0aWNsZS5wLnggPj0gdGhpcy5taW54KSByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHBhcnRpY2xlLnAueSA8PSB0aGlzLm1heHkgJiYgcGFydGljbGUucC55ID49IHRoaXMubWlueSkgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0TGVuZ3RoKCkge1xuICAgIHJldHVybiBNYXRoLnNxcnQodGhpcy5keCAqIHRoaXMuZHggKyB0aGlzLmR5ICogdGhpcy5keSk7XG4gIH1cblxuICBjcm9zc2luZyhwYXJ0aWNsZSkge1xuICAgIGlmICh0aGlzLmNyb3NzVHlwZSA9PT0gXCJkZWFkXCIpIHtcbiAgICAgIGlmICh0aGlzLmRpcmVjdGlvbiA9PT0gXCI+XCIgfHwgdGhpcy5kaXJlY3Rpb24gPT09IFwiUlwiIHx8IHRoaXMuZGlyZWN0aW9uID09PSBcInJpZ2h0XCIgfHwgdGhpcy5kaXJlY3Rpb24gPT09IFwiZG93blwiKSB7XG4gICAgICAgIGlmICghdGhpcy5yYW5nZU91dChwYXJ0aWNsZSkpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuZ2V0RGlyZWN0aW9uKHBhcnRpY2xlLnAueCwgcGFydGljbGUucC55KSkgcGFydGljbGUuZGVhZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIXRoaXMucmFuZ2VPdXQocGFydGljbGUpKSByZXR1cm47XG4gICAgICAgIGlmICghdGhpcy5nZXREaXJlY3Rpb24ocGFydGljbGUucC54LCBwYXJ0aWNsZS5wLnkpKSBwYXJ0aWNsZS5kZWFkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuY3Jvc3NUeXBlID09PSBcImJvdW5kXCIpIHtcbiAgICAgIGlmICghdGhpcy5yYW5nZU91dChwYXJ0aWNsZSkpIHJldHVybjtcblxuICAgICAgaWYgKHRoaXMuZ2V0RGlzdGFuY2UocGFydGljbGUucC54LCBwYXJ0aWNsZS5wLnkpIDw9IHBhcnRpY2xlLnJhZGl1cykge1xuICAgICAgICBpZiAodGhpcy5keCA9PT0gMCkge1xuICAgICAgICAgIHBhcnRpY2xlLnYueCAqPSAtMTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmR5ID09PSAwKSB7XG4gICAgICAgICAgcGFydGljbGUudi55ICo9IC0xO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZ2V0U3ltbWV0cmljKHBhcnRpY2xlLnYpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmNyb3NzVHlwZSA9PT0gXCJjcm9zc1wiKSB7XG4gICAgICBpZiAodGhpcy5hbGVydCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiU29ycnksIExpbmVab25lIGRvZXMgbm90IHN1cHBvcnQgY3Jvc3MgbWV0aG9kIVwiKTtcbiAgICAgICAgdGhpcy5hbGVydCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IFpvbmUgZnJvbSBcIi4vWm9uZVwiO1xuaW1wb3J0IE1hdGhVdGlsIGZyb20gXCIuLi9tYXRoL01hdGhVdGlsXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENpcmNsZVpvbmUgZXh0ZW5kcyBab25lIHtcbiAgY29uc3RydWN0b3IoeCwgeSwgcmFkaXVzKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbiAgICB0aGlzLnJhZGl1cyA9IHJhZGl1cztcbiAgICB0aGlzLmFuZ2xlID0gMDtcbiAgICB0aGlzLmNlbnRlciA9IHsgeCwgeSB9O1xuICB9XG5cbiAgZ2V0UG9zaXRpb24oKSB7XG4gICAgdGhpcy5hbmdsZSA9IE1hdGhVdGlsLlBJeDIgKiBNYXRoLnJhbmRvbSgpO1xuICAgIHRoaXMucmFuZG9tUmFkaXVzID0gTWF0aC5yYW5kb20oKSAqIHRoaXMucmFkaXVzO1xuICAgIHRoaXMudmVjdG9yLnggPSB0aGlzLnggKyB0aGlzLnJhbmRvbVJhZGl1cyAqIE1hdGguY29zKHRoaXMuYW5nbGUpO1xuICAgIHRoaXMudmVjdG9yLnkgPSB0aGlzLnkgKyB0aGlzLnJhbmRvbVJhZGl1cyAqIE1hdGguc2luKHRoaXMuYW5nbGUpO1xuXG4gICAgcmV0dXJuIHRoaXMudmVjdG9yO1xuICB9XG5cbiAgc2V0Q2VudGVyKHgsIHkpIHtcbiAgICB0aGlzLmNlbnRlci54ID0geDtcbiAgICB0aGlzLmNlbnRlci55ID0geTtcbiAgfVxuXG4gIGNyb3NzaW5nKHBhcnRpY2xlKSB7XG4gICAgY29uc3QgZCA9IHBhcnRpY2xlLnAuZGlzdGFuY2VUbyh0aGlzLmNlbnRlcik7XG5cbiAgICBpZiAodGhpcy5jcm9zc1R5cGUgPT09IFwiZGVhZFwiKSB7XG4gICAgICBpZiAoZCAtIHBhcnRpY2xlLnJhZGl1cyA+IHRoaXMucmFkaXVzKSBwYXJ0aWNsZS5kZWFkID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY3Jvc3NUeXBlID09PSBcImJvdW5kXCIpIHtcbiAgICAgIGlmIChkICsgcGFydGljbGUucmFkaXVzID49IHRoaXMucmFkaXVzKSB0aGlzLmdldFN5bW1ldHJpYyhwYXJ0aWNsZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNyb3NzVHlwZSA9PT0gXCJjcm9zc1wiKSB7XG4gICAgICBpZiAodGhpcy5hbGVydCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiU29ycnksIENpcmNsZVpvbmUgZG9lcyBub3Qgc3VwcG9ydCBjcm9zcyBtZXRob2QhXCIpO1xuICAgICAgICB0aGlzLmFsZXJ0ID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0U3ltbWV0cmljKHBhcnRpY2xlKSB7XG4gICAgY29uc3QgdGhhMiA9IHBhcnRpY2xlLnYuZ2V0R3JhZGllbnQoKTtcbiAgICBjb25zdCB0aGExID0gdGhpcy5nZXRHcmFkaWVudChwYXJ0aWNsZSk7XG5cbiAgICBjb25zdCB0aGEgPSAyICogKHRoYTEgLSB0aGEyKTtcbiAgICBjb25zdCBvbGR4ID0gcGFydGljbGUudi54O1xuICAgIGNvbnN0IG9sZHkgPSBwYXJ0aWNsZS52Lnk7XG5cbiAgICBwYXJ0aWNsZS52LnggPSBvbGR4ICogTWF0aC5jb3ModGhhKSAtIG9sZHkgKiBNYXRoLnNpbih0aGEpO1xuICAgIHBhcnRpY2xlLnYueSA9IG9sZHggKiBNYXRoLnNpbih0aGEpICsgb2xkeSAqIE1hdGguY29zKHRoYSk7XG4gIH1cblxuICBnZXRHcmFkaWVudChwYXJ0aWNsZSkge1xuICAgIHJldHVybiAtTWF0aFV0aWwuUElfMiArIE1hdGguYXRhbjIocGFydGljbGUucC55IC0gdGhpcy5jZW50ZXIueSwgcGFydGljbGUucC54IC0gdGhpcy5jZW50ZXIueCk7XG4gIH1cbn1cbiIsImltcG9ydCBab25lIGZyb20gXCIuL1pvbmVcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVjdFpvbmUgZXh0ZW5kcyBab25lIHtcbiAgY29uc3RydWN0b3IoeCwgeSwgd2lkdGgsIGhlaWdodCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG4gICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICB9XG5cbiAgZ2V0UG9zaXRpb24oKSB7XG4gICAgdGhpcy52ZWN0b3IueCA9IHRoaXMueCArIE1hdGgucmFuZG9tKCkgKiB0aGlzLndpZHRoO1xuICAgIHRoaXMudmVjdG9yLnkgPSB0aGlzLnkgKyBNYXRoLnJhbmRvbSgpICogdGhpcy5oZWlnaHQ7XG5cbiAgICByZXR1cm4gdGhpcy52ZWN0b3I7XG4gIH1cblxuICBjcm9zc2luZyhwYXJ0aWNsZSkge1xuICAgIC8vIHBhcnRpY2xlIGRlYWQgem9uZVxuICAgIGlmICh0aGlzLmNyb3NzVHlwZSA9PT0gXCJkZWFkXCIpIHtcbiAgICAgIGlmIChwYXJ0aWNsZS5wLnggKyBwYXJ0aWNsZS5yYWRpdXMgPCB0aGlzLngpIHBhcnRpY2xlLmRlYWQgPSB0cnVlO1xuICAgICAgZWxzZSBpZiAocGFydGljbGUucC54IC0gcGFydGljbGUucmFkaXVzID4gdGhpcy54ICsgdGhpcy53aWR0aCkgcGFydGljbGUuZGVhZCA9IHRydWU7XG5cbiAgICAgIGlmIChwYXJ0aWNsZS5wLnkgKyBwYXJ0aWNsZS5yYWRpdXMgPCB0aGlzLnkpIHBhcnRpY2xlLmRlYWQgPSB0cnVlO1xuICAgICAgZWxzZSBpZiAocGFydGljbGUucC55IC0gcGFydGljbGUucmFkaXVzID4gdGhpcy55ICsgdGhpcy5oZWlnaHQpIHBhcnRpY2xlLmRlYWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIHBhcnRpY2xlIGJvdW5kIHpvbmVcbiAgICBlbHNlIGlmICh0aGlzLmNyb3NzVHlwZSA9PT0gXCJib3VuZFwiKSB7XG4gICAgICBpZiAocGFydGljbGUucC54IC0gcGFydGljbGUucmFkaXVzIDwgdGhpcy54KSB7XG4gICAgICAgIHBhcnRpY2xlLnAueCA9IHRoaXMueCArIHBhcnRpY2xlLnJhZGl1cztcbiAgICAgICAgcGFydGljbGUudi54ICo9IC0xO1xuICAgICAgfSBlbHNlIGlmIChwYXJ0aWNsZS5wLnggKyBwYXJ0aWNsZS5yYWRpdXMgPiB0aGlzLnggKyB0aGlzLndpZHRoKSB7XG4gICAgICAgIHBhcnRpY2xlLnAueCA9IHRoaXMueCArIHRoaXMud2lkdGggLSBwYXJ0aWNsZS5yYWRpdXM7XG4gICAgICAgIHBhcnRpY2xlLnYueCAqPSAtMTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcnRpY2xlLnAueSAtIHBhcnRpY2xlLnJhZGl1cyA8IHRoaXMueSkge1xuICAgICAgICBwYXJ0aWNsZS5wLnkgPSB0aGlzLnkgKyBwYXJ0aWNsZS5yYWRpdXM7XG4gICAgICAgIHBhcnRpY2xlLnYueSAqPSAtMTtcbiAgICAgIH0gZWxzZSBpZiAocGFydGljbGUucC55ICsgcGFydGljbGUucmFkaXVzID4gdGhpcy55ICsgdGhpcy5oZWlnaHQpIHtcbiAgICAgICAgcGFydGljbGUucC55ID0gdGhpcy55ICsgdGhpcy5oZWlnaHQgLSBwYXJ0aWNsZS5yYWRpdXM7XG4gICAgICAgIHBhcnRpY2xlLnYueSAqPSAtMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBwYXJ0aWNsZSBjcm9zcyB6b25lXG4gICAgZWxzZSBpZiAodGhpcy5jcm9zc1R5cGUgPT09IFwiY3Jvc3NcIikge1xuICAgICAgaWYgKHBhcnRpY2xlLnAueCArIHBhcnRpY2xlLnJhZGl1cyA8IHRoaXMueCAmJiBwYXJ0aWNsZS52LnggPD0gMCkge1xuICAgICAgICBwYXJ0aWNsZS5wLnggPSB0aGlzLnggKyB0aGlzLndpZHRoICsgcGFydGljbGUucmFkaXVzO1xuICAgICAgfSBlbHNlIGlmIChwYXJ0aWNsZS5wLnggLSBwYXJ0aWNsZS5yYWRpdXMgPiB0aGlzLnggKyB0aGlzLndpZHRoICYmIHBhcnRpY2xlLnYueCA+PSAwKSB7XG4gICAgICAgIHBhcnRpY2xlLnAueCA9IHRoaXMueCAtIHBhcnRpY2xlLnJhZGl1cztcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcnRpY2xlLnAueSArIHBhcnRpY2xlLnJhZGl1cyA8IHRoaXMueSAmJiBwYXJ0aWNsZS52LnkgPD0gMCkge1xuICAgICAgICBwYXJ0aWNsZS5wLnkgPSB0aGlzLnkgKyB0aGlzLmhlaWdodCArIHBhcnRpY2xlLnJhZGl1cztcbiAgICAgIH0gZWxzZSBpZiAocGFydGljbGUucC55IC0gcGFydGljbGUucmFkaXVzID4gdGhpcy55ICsgdGhpcy5oZWlnaHQgJiYgcGFydGljbGUudi55ID49IDApIHtcbiAgICAgICAgcGFydGljbGUucC55ID0gdGhpcy55IC0gcGFydGljbGUucmFkaXVzO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IFpvbmUgZnJvbSBcIi4vWm9uZVwiO1xuaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW1hZ2Vab25lIGV4dGVuZHMgWm9uZSB7XG4gIGNvbnN0cnVjdG9yKGltYWdlRGF0YSwgeCwgeSwgZCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5yZXNldChpbWFnZURhdGEsIHgsIHksIGQpO1xuICB9XG5cbiAgcmVzZXQoaW1hZ2VEYXRhLCB4LCB5LCBkKSB7XG4gICAgdGhpcy5pbWFnZURhdGEgPSBpbWFnZURhdGE7XG4gICAgdGhpcy54ID0gVXRpbC5pbml0VmFsdWUoeCwgMCk7XG4gICAgdGhpcy55ID0gVXRpbC5pbml0VmFsdWUoeSwgMCk7XG4gICAgdGhpcy5kID0gVXRpbC5pbml0VmFsdWUoZCwgMik7XG5cbiAgICB0aGlzLnZlY3RvcnMgPSBbXTtcbiAgICB0aGlzLnNldFZlY3RvcnMoKTtcbiAgfVxuXG4gIHNldFZlY3RvcnMoKSB7XG4gICAgbGV0IGksIGo7XG4gICAgY29uc3QgbGVuZ3RoMSA9IHRoaXMuaW1hZ2VEYXRhLndpZHRoO1xuICAgIGNvbnN0IGxlbmd0aDIgPSB0aGlzLmltYWdlRGF0YS5oZWlnaHQ7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoMTsgaSArPSB0aGlzLmQpIHtcbiAgICAgIGZvciAoaiA9IDA7IGogPCBsZW5ndGgyOyBqICs9IHRoaXMuZCkge1xuICAgICAgICBsZXQgaW5kZXggPSAoKGogPj4gMCkgKiBsZW5ndGgxICsgKGkgPj4gMCkpICogNDtcblxuICAgICAgICBpZiAodGhpcy5pbWFnZURhdGEuZGF0YVtpbmRleCArIDNdID4gMCkge1xuICAgICAgICAgIHRoaXMudmVjdG9ycy5wdXNoKHsgeDogaSArIHRoaXMueCwgeTogaiArIHRoaXMueSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnZlY3RvcjtcbiAgfVxuXG4gIGdldEJvdW5kKHgsIHkpIHtcbiAgICBjb25zdCBpbmRleCA9ICgoeSA+PiAwKSAqIHRoaXMuaW1hZ2VEYXRhLndpZHRoICsgKHggPj4gMCkpICogNDtcbiAgICBpZiAodGhpcy5pbWFnZURhdGEuZGF0YVtpbmRleCArIDNdID4gMCkgcmV0dXJuIHRydWU7XG4gICAgZWxzZSByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXRQb3NpdGlvbigpIHtcbiAgICBjb25zdCB2ZWN0b3IgPSBVdGlsLmdldFJhbmRGcm9tQXJyYXkodGhpcy52ZWN0b3JzKTtcbiAgICByZXR1cm4gdGhpcy52ZWN0b3IuY29weSh2ZWN0b3IpO1xuICB9XG5cbiAgZ2V0Q29sb3IoeCwgeSkge1xuICAgIHggLT0gdGhpcy54O1xuICAgIHkgLT0gdGhpcy55O1xuICAgIGNvbnN0IGkgPSAoKHkgPj4gMCkgKiB0aGlzLmltYWdlRGF0YS53aWR0aCArICh4ID4+IDApKSAqIDQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcjogdGhpcy5pbWFnZURhdGEuZGF0YVtpXSxcbiAgICAgIGc6IHRoaXMuaW1hZ2VEYXRhLmRhdGFbaSArIDFdLFxuICAgICAgYjogdGhpcy5pbWFnZURhdGEuZGF0YVtpICsgMl0sXG4gICAgICBhOiB0aGlzLmltYWdlRGF0YS5kYXRhW2kgKyAzXVxuICAgIH07XG4gIH1cblxuICBjcm9zc2luZyhwYXJ0aWNsZSkge1xuICAgIGlmICh0aGlzLmNyb3NzVHlwZSA9PT0gXCJkZWFkXCIpIHtcbiAgICAgIGlmICh0aGlzLmdldEJvdW5kKHBhcnRpY2xlLnAueCAtIHRoaXMueCwgcGFydGljbGUucC55IC0gdGhpcy55KSkgcGFydGljbGUuZGVhZCA9IHRydWU7XG4gICAgICBlbHNlIHBhcnRpY2xlLmRlYWQgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY3Jvc3NUeXBlID09PSBcImJvdW5kXCIpIHtcbiAgICAgIGlmICghdGhpcy5nZXRCb3VuZChwYXJ0aWNsZS5wLnggLSB0aGlzLngsIHBhcnRpY2xlLnAueSAtIHRoaXMueSkpIHBhcnRpY2xlLnYubmVnYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgdGhpcy5pbWFnZURhdGEgPSBudWxsO1xuICB9XG59XG4iLCJpbXBvcnQgQ29sb3JVdGlsIGZyb20gXCIuLi91dGlscy9Db2xvclV0aWxcIjtcbmltcG9ydCBDaXJjbGVab25lIGZyb20gXCIuLi96b25lL0NpcmNsZVpvbmVcIjtcbmltcG9ydCBQb2ludFpvbmUgZnJvbSBcIi4uL3pvbmUvUG9pbnRab25lXCI7XG5pbXBvcnQgTGluZVpvbmUgZnJvbSBcIi4uL3pvbmUvTGluZVpvbmVcIjtcbmltcG9ydCBSZWN0Wm9uZSBmcm9tIFwiLi4vem9uZS9SZWN0Wm9uZVwiO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGFkZEV2ZW50TGlzdGVuZXIocHJvdG9uLCBmdW5jKSB7XG4gICAgcHJvdG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJQUk9UT05fVVBEQVRFX0FGVEVSXCIsICgpID0+IGZ1bmMoKSk7XG4gIH0sXG5cbiAgZ2V0U3R5bGUoY29sb3IgPSBcIiNmZjAwMDBcIikge1xuICAgIGNvbnN0IHJnYiA9IENvbG9yVXRpbC5oZXhUb1JnYihjb2xvcik7XG4gICAgcmV0dXJuIGByZ2JhKCR7cmdiLnJ9LCAke3JnYi5nfSwgJHtyZ2IuYn0sIDAuNSlgO1xuICB9LFxuXG4gIGRyYXdab25lKHByb3RvbiwgY2FudmFzLCB6b25lLCBjbGVhcikge1xuICAgIGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgIGNvbnN0IHN0eWxlID0gdGhpcy5nZXRTdHlsZSgpO1xuXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKHByb3RvbiwgKCkgPT4ge1xuICAgICAgaWYgKGNsZWFyKSBjb250ZXh0LmNsZWFyUmVjdCgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xuXG4gICAgICBpZiAoem9uZSBpbnN0YW5jZW9mIFBvaW50Wm9uZSkge1xuICAgICAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IHN0eWxlO1xuICAgICAgICBjb250ZXh0LmFyYyh6b25lLngsIHpvbmUueSwgMTAsIDAsIE1hdGguUEkgKiAyLCB0cnVlKTtcbiAgICAgICAgY29udGV4dC5maWxsKCk7XG4gICAgICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgICB9IGVsc2UgaWYgKHpvbmUgaW5zdGFuY2VvZiBMaW5lWm9uZSkge1xuICAgICAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgICAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gc3R5bGU7XG4gICAgICAgIGNvbnRleHQubW92ZVRvKHpvbmUueDEsIHpvbmUueTEpO1xuICAgICAgICBjb250ZXh0LmxpbmVUbyh6b25lLngyLCB6b25lLnkyKTtcbiAgICAgICAgY29udGV4dC5zdHJva2UoKTtcbiAgICAgICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICAgIH0gZWxzZSBpZiAoem9uZSBpbnN0YW5jZW9mIFJlY3Rab25lKSB7XG4gICAgICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBzdHlsZTtcbiAgICAgICAgY29udGV4dC5kcmF3UmVjdCh6b25lLngsIHpvbmUueSwgem9uZS53aWR0aCwgem9uZS5oZWlnaHQpO1xuICAgICAgICBjb250ZXh0LnN0cm9rZSgpO1xuICAgICAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgICAgfSBlbHNlIGlmICh6b25lIGluc3RhbmNlb2YgQ2lyY2xlWm9uZSkge1xuICAgICAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgICAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gc3R5bGU7XG4gICAgICAgIGNvbnRleHQuYXJjKHpvbmUueCwgem9uZS55LCB6b25lLnJhZGl1cywgMCwgTWF0aC5QSSAqIDIsIHRydWUpO1xuICAgICAgICBjb250ZXh0LnN0cm9rZSgpO1xuICAgICAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuXG4gIGRyYXdFbWl0dGVyKHByb3RvbiwgY2FudmFzLCBlbWl0dGVyLCBjbGVhcikge1xuICAgIGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgIGNvbnN0IHN0eWxlID0gdGhpcy5nZXRTdHlsZSgpO1xuXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKHByb3RvbiwgKCkgPT4ge1xuICAgICAgaWYgKGNsZWFyKSBjb250ZXh0LmNsZWFyUmVjdCgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xuXG4gICAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBzdHlsZTtcbiAgICAgIGNvbnRleHQuYXJjKGVtaXR0ZXIucC54LCBlbWl0dGVyLnAueSwgMTAsIDAsIE1hdGguUEkgKiAyLCB0cnVlKTtcbiAgICAgIGNvbnRleHQuZmlsbCgpO1xuICAgICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICB9KTtcbiAgfVxufTtcbiIsImltcG9ydCBQcm90b24gZnJvbSBcIi4vY29yZS9Qcm90b25cIjtcbmltcG9ydCBQYXJ0aWNsZSBmcm9tIFwiLi9jb3JlL1BhcnRpY2xlXCI7XG5pbXBvcnQgUG9vbCBmcm9tIFwiLi9jb3JlL1Bvb2xcIjtcblxuaW1wb3J0IFV0aWwgZnJvbSBcIi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IENvbG9yVXRpbCBmcm9tIFwiLi91dGlscy9Db2xvclV0aWxcIjtcbmltcG9ydCBNYXRoVXRpbCBmcm9tIFwiLi9tYXRoL01hdGhVdGlsXCI7XG5pbXBvcnQgVmVjdG9yMkQgZnJvbSBcIi4vbWF0aC9WZWN0b3IyRFwiO1xuaW1wb3J0IFBvbGFyMkQgZnJvbSBcIi4vbWF0aC9Qb2xhcjJEXCI7XG5pbXBvcnQgTWF0MyBmcm9tIFwiLi9tYXRoL01hdDNcIjtcbmltcG9ydCBTcGFuIGZyb20gXCIuL21hdGgvU3BhblwiO1xuaW1wb3J0IEFycmF5U3BhbiBmcm9tIFwiLi9tYXRoL0FycmF5U3BhblwiO1xuaW1wb3J0IFJlY3RhbmdsZSBmcm9tIFwiLi9tYXRoL1JlY3RhbmdsZVwiO1xuaW1wb3J0IGVhc2UgZnJvbSBcIi4vbWF0aC9lYXNlXCI7XG5cbmltcG9ydCBSYXRlIGZyb20gXCIuL2luaXRpYWxpemUvUmF0ZVwiO1xuaW1wb3J0IEluaXRpYWxpemUgZnJvbSBcIi4vaW5pdGlhbGl6ZS9Jbml0aWFsaXplXCI7XG5pbXBvcnQgTGlmZSBmcm9tIFwiLi9pbml0aWFsaXplL0xpZmVcIjtcbmltcG9ydCBQb3NpdGlvbiBmcm9tIFwiLi9pbml0aWFsaXplL1Bvc2l0aW9uXCI7XG5pbXBvcnQgVmVsb2NpdHkgZnJvbSBcIi4vaW5pdGlhbGl6ZS9WZWxvY2l0eVwiO1xuaW1wb3J0IE1hc3MgZnJvbSBcIi4vaW5pdGlhbGl6ZS9NYXNzXCI7XG5pbXBvcnQgUmFkaXVzIGZyb20gXCIuL2luaXRpYWxpemUvUmFkaXVzXCI7XG5pbXBvcnQgQm9keSBmcm9tIFwiLi9pbml0aWFsaXplL0JvZHlcIjtcblxuaW1wb3J0IEJlaGF2aW91ciBmcm9tIFwiLi9iZWhhdmlvdXIvQmVoYXZpb3VyXCI7XG5pbXBvcnQgRm9yY2UgZnJvbSBcIi4vYmVoYXZpb3VyL0ZvcmNlXCI7XG5pbXBvcnQgQXR0cmFjdGlvbiBmcm9tIFwiLi9iZWhhdmlvdXIvQXR0cmFjdGlvblwiO1xuaW1wb3J0IFJhbmRvbURyaWZ0IGZyb20gXCIuL2JlaGF2aW91ci9SYW5kb21EcmlmdFwiO1xuaW1wb3J0IEdyYXZpdHkgZnJvbSBcIi4vYmVoYXZpb3VyL0dyYXZpdHlcIjtcbmltcG9ydCBDb2xsaXNpb24gZnJvbSBcIi4vYmVoYXZpb3VyL0NvbGxpc2lvblwiO1xuaW1wb3J0IENyb3NzWm9uZSBmcm9tIFwiLi9iZWhhdmlvdXIvQ3Jvc3Nab25lXCI7XG5pbXBvcnQgQWxwaGEgZnJvbSBcIi4vYmVoYXZpb3VyL0FscGhhXCI7XG5pbXBvcnQgU2NhbGUgZnJvbSBcIi4vYmVoYXZpb3VyL1NjYWxlXCI7XG5pbXBvcnQgUm90YXRlIGZyb20gXCIuL2JlaGF2aW91ci9Sb3RhdGVcIjtcbmltcG9ydCBDb2xvciBmcm9tIFwiLi9iZWhhdmlvdXIvQ29sb3JcIjtcbmltcG9ydCBDeWNsb25lIGZyb20gXCIuL2JlaGF2aW91ci9DeWNsb25lXCI7XG5pbXBvcnQgUmVwdWxzaW9uIGZyb20gXCIuL2JlaGF2aW91ci9SZXB1bHNpb25cIjtcbmltcG9ydCBHcmF2aXR5V2VsbCBmcm9tIFwiLi9iZWhhdmlvdXIvR3Jhdml0eVdlbGxcIjtcblxuaW1wb3J0IEVtaXR0ZXIgZnJvbSBcIi4vZW1pdHRlci9FbWl0dGVyXCI7XG5pbXBvcnQgQmVoYXZpb3VyRW1pdHRlciBmcm9tIFwiLi9lbWl0dGVyL0JlaGF2aW91ckVtaXR0ZXJcIjtcbmltcG9ydCBGb2xsb3dFbWl0dGVyIGZyb20gXCIuL2VtaXR0ZXIvRm9sbG93RW1pdHRlclwiO1xuXG5pbXBvcnQgQ2FudmFzUmVuZGVyZXIgZnJvbSBcIi4vcmVuZGVyL0NhbnZhc1JlbmRlcmVyXCI7XG5pbXBvcnQgRG9tUmVuZGVyZXIgZnJvbSBcIi4vcmVuZGVyL0RvbVJlbmRlcmVyXCI7XG5pbXBvcnQgRWFzZWxSZW5kZXJlciBmcm9tIFwiLi9yZW5kZXIvRWFzZWxSZW5kZXJlclwiO1xuaW1wb3J0IFBpeGVsUmVuZGVyZXIgZnJvbSBcIi4vcmVuZGVyL1BpeGVsUmVuZGVyZXJcIjtcbmltcG9ydCBQaXhpUmVuZGVyZXIgZnJvbSBcIi4vcmVuZGVyL1BpeGlSZW5kZXJlclwiO1xuaW1wb3J0IFdlYkdMUmVuZGVyZXIgZnJvbSBcIi4vcmVuZGVyL1dlYkdMUmVuZGVyZXJcIjtcbmltcG9ydCBDdXN0b21SZW5kZXJlciBmcm9tIFwiLi9yZW5kZXIvQ3VzdG9tUmVuZGVyZXJcIjtcblxuaW1wb3J0IFpvbmUgZnJvbSBcIi4vem9uZS9ab25lXCI7XG5pbXBvcnQgTGluZVpvbmUgZnJvbSBcIi4vem9uZS9MaW5lWm9uZVwiO1xuaW1wb3J0IENpcmNsZVpvbmUgZnJvbSBcIi4vem9uZS9DaXJjbGVab25lXCI7XG5pbXBvcnQgUG9pbnRab25lIGZyb20gXCIuL3pvbmUvUG9pbnRab25lXCI7XG5pbXBvcnQgUmVjdFpvbmUgZnJvbSBcIi4vem9uZS9SZWN0Wm9uZVwiO1xuaW1wb3J0IEltYWdlWm9uZSBmcm9tIFwiLi96b25lL0ltYWdlWm9uZVwiO1xuXG5pbXBvcnQgRGVidWcgZnJvbSBcIi4vZGVidWcvRGVidWdcIjtcblxuLy8gbmFtZXNwYWNlXG5Qcm90b24uUGFydGljbGUgPSBQYXJ0aWNsZTtcblByb3Rvbi5Qb29sID0gUG9vbDtcblxuUHJvdG9uLlV0aWwgPSBVdGlsO1xuUHJvdG9uLkNvbG9yVXRpbCA9IENvbG9yVXRpbDtcblByb3Rvbi5NYXRoVXRpbCA9IE1hdGhVdGlsO1xuUHJvdG9uLlZlY3RvcjJEID0gUHJvdG9uLlZlY3RvciA9IFZlY3RvcjJEO1xuUHJvdG9uLlBvbGFyMkQgPSBQcm90b24uUG9sYXIgPSBQb2xhcjJEO1xuUHJvdG9uLkFycmF5U3BhbiA9IEFycmF5U3BhbjtcblByb3Rvbi5SZWN0YW5nbGUgPSBSZWN0YW5nbGU7XG5Qcm90b24uUmF0ZSA9IFJhdGU7XG5Qcm90b24uZWFzZSA9IGVhc2U7XG5Qcm90b24uU3BhbiA9IFNwYW47XG5Qcm90b24uTWF0MyA9IE1hdDM7XG5Qcm90b24uZ2V0U3BhbiA9IChhLCBiLCBjZW50ZXIpID0+IG5ldyBTcGFuKGEsIGIsIGNlbnRlcik7XG5Qcm90b24uY3JlYXRlQXJyYXlTcGFuID0gQXJyYXlTcGFuLmNyZWF0ZUFycmF5U3BhbjtcblxuUHJvdG9uLkluaXRpYWxpemUgPSBQcm90b24uSW5pdCA9IEluaXRpYWxpemU7XG5Qcm90b24uTGlmZSA9IFByb3Rvbi5MID0gTGlmZTtcblByb3Rvbi5Qb3NpdGlvbiA9IFByb3Rvbi5QID0gUG9zaXRpb247XG5Qcm90b24uVmVsb2NpdHkgPSBQcm90b24uViA9IFZlbG9jaXR5O1xuUHJvdG9uLk1hc3MgPSBQcm90b24uTSA9IE1hc3M7XG5Qcm90b24uUmFkaXVzID0gUHJvdG9uLlIgPSBSYWRpdXM7XG5Qcm90b24uQm9keSA9IFByb3Rvbi5CID0gQm9keTtcblxuUHJvdG9uLkJlaGF2aW91ciA9IEJlaGF2aW91cjtcblByb3Rvbi5Gb3JjZSA9IFByb3Rvbi5GID0gRm9yY2U7XG5Qcm90b24uQXR0cmFjdGlvbiA9IFByb3Rvbi5BID0gQXR0cmFjdGlvbjtcblByb3Rvbi5SYW5kb21EcmlmdCA9IFByb3Rvbi5SRCA9IFJhbmRvbURyaWZ0O1xuUHJvdG9uLkdyYXZpdHkgPSBQcm90b24uRyA9IEdyYXZpdHk7XG5Qcm90b24uQ29sbGlzaW9uID0gQ29sbGlzaW9uO1xuUHJvdG9uLkNyb3NzWm9uZSA9IENyb3NzWm9uZTtcblByb3Rvbi5BbHBoYSA9IEFscGhhO1xuUHJvdG9uLlNjYWxlID0gUHJvdG9uLlMgPSBTY2FsZTtcblByb3Rvbi5Sb3RhdGUgPSBSb3RhdGU7XG5Qcm90b24uQ29sb3IgPSBDb2xvcjtcblByb3Rvbi5SZXB1bHNpb24gPSBSZXB1bHNpb247XG5Qcm90b24uQ3ljbG9uZSA9IEN5Y2xvbmU7XG5Qcm90b24uR3Jhdml0eVdlbGwgPSBHcmF2aXR5V2VsbDtcblxuUHJvdG9uLkVtaXR0ZXIgPSBFbWl0dGVyO1xuUHJvdG9uLkJlaGF2aW91ckVtaXR0ZXIgPSBCZWhhdmlvdXJFbWl0dGVyO1xuUHJvdG9uLkZvbGxvd0VtaXR0ZXIgPSBGb2xsb3dFbWl0dGVyO1xuXG5Qcm90b24uWm9uZSA9IFpvbmU7XG5Qcm90b24uTGluZVpvbmUgPSBMaW5lWm9uZTtcblByb3Rvbi5DaXJjbGVab25lID0gQ2lyY2xlWm9uZTtcblByb3Rvbi5Qb2ludFpvbmUgPSBQb2ludFpvbmU7XG5Qcm90b24uUmVjdFpvbmUgPSBSZWN0Wm9uZTtcblByb3Rvbi5JbWFnZVpvbmUgPSBJbWFnZVpvbmU7XG5cblByb3Rvbi5DYW52YXNSZW5kZXJlciA9IENhbnZhc1JlbmRlcmVyO1xuUHJvdG9uLkRvbVJlbmRlcmVyID0gRG9tUmVuZGVyZXI7XG5Qcm90b24uRWFzZWxSZW5kZXJlciA9IEVhc2VsUmVuZGVyZXI7XG5Qcm90b24uUGl4aVJlbmRlcmVyID0gUGl4aVJlbmRlcmVyO1xuUHJvdG9uLlBpeGVsUmVuZGVyZXIgPSBQaXhlbFJlbmRlcmVyO1xuUHJvdG9uLldlYkdMUmVuZGVyZXIgPSBQcm90b24uV2ViR2xSZW5kZXJlciA9IFdlYkdMUmVuZGVyZXI7XG5Qcm90b24uQ3VzdG9tUmVuZGVyZXIgPSBDdXN0b21SZW5kZXJlcjtcblxuUHJvdG9uLkRlYnVnID0gRGVidWc7XG5VdGlsLmFzc2lnbihQcm90b24sIGVhc2UpO1xuXG4vLyBleHBvcnRcbmV4cG9ydCBkZWZhdWx0IFByb3RvbjtcbiJdLCJuYW1lcyI6WyJpcG90IiwibGVuZ3RoIiwibmhwb3QiLCJpIiwibWFrZVRyYW5zbGF0aW9uIiwidHgiLCJ0eSIsIm1ha2VSb3RhdGlvbiIsImFuZ2xlSW5SYWRpYW5zIiwiYyIsIk1hdGgiLCJjb3MiLCJzIiwic2luIiwibWFrZVNjYWxlIiwic3giLCJzeSIsIm1hdHJpeE11bHRpcGx5IiwiYSIsImIiLCJhMDAiLCJhMDEiLCJhMDIiLCJhMTAiLCJhMTEiLCJhMTIiLCJhMjAiLCJhMjEiLCJhMjIiLCJiMDAiLCJiMDEiLCJiMDIiLCJiMTAiLCJiMTEiLCJiMTIiLCJiMjAiLCJiMjEiLCJiMjIiLCJjcmVhdGVDYW52YXMiLCJpZCIsIndpZHRoIiwiaGVpZ2h0IiwicG9zaXRpb24iLCJkb20iLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJzdHlsZSIsIm9wYWNpdHkiLCJ0cmFuc2Zvcm0iLCJjcmVhdGVEaXYiLCJyZXNpemUiLCJtYXJnaW5MZWZ0IiwibWFyZ2luVG9wIiwiZGl2IiwieCIsInkiLCJzY2FsZSIsInJvdGF0ZSIsIndpbGxDaGFuZ2UiLCJjc3MzIiwidHJhbnNmb3JtM2QiLCJrZXkiLCJ2YWwiLCJia2V5IiwiY2hhckF0IiwidG9VcHBlckNhc2UiLCJzdWJzdHIiLCJpbWdzQ2FjaGUiLCJjYW52YXNDYWNoZSIsImNhbnZhc0lkIiwiZ2V0SW1hZ2VEYXRhIiwiY29udGV4dCIsImltYWdlIiwicmVjdCIsImRyYXdJbWFnZSIsImltYWdlZGF0YSIsImNsZWFyUmVjdCIsImdldEltZ0Zyb21DYWNoZSIsImltZyIsImNhbGxiYWNrIiwicGFyYW0iLCJzcmMiLCJJbWFnZSIsIm9ubG9hZCIsImUiLCJ0YXJnZXQiLCJnZXRDYW52YXNGcm9tQ2FjaGUiLCJXZWJHTFV0aWwiLCJjYW52YXMiLCJEb21VdGlsIiwiZ2V0Q29udGV4dCIsImluaXRWYWx1ZSIsInZhbHVlIiwiZGVmYXVsdHMiLCJ1bmRlZmluZWQiLCJpc0FycmF5IiwiT2JqZWN0IiwicHJvdG90eXBlIiwidG9TdHJpbmciLCJjYWxsIiwiZW1wdHlBcnJheSIsImFyciIsInRvQXJyYXkiLCJnZXRSYW5kRnJvbUFycmF5IiwiZmxvb3IiLCJyYW5kb20iLCJlbXB0eU9iamVjdCIsIm9iaiIsImlnbm9yZSIsImluZGV4T2YiLCJjbGFzc0FwcGx5IiwiY29uc3RydWN0b3IiLCJhcmdzIiwiRmFjdG9yeUZ1bmMiLCJiaW5kIiwiYXBwbHkiLCJjb25jYXQiLCJJbWdVdGlsIiwiZGVzdHJveUFsbCIsImRlc3Ryb3kiLCJhc3NpZ24iLCJzb3VyY2UiLCJoYXNPd25Qcm9wZXJ0eSIsImlkc01hcCIsIlB1aWQiLCJfaW5kZXgiLCJfY2FjaGUiLCJ0eXBlIiwiZ2V0SWQiLCJ1aWQiLCJnZXRJZEZyb21DYWNoZSIsImlzQm9keSIsImlzSW5uZXIiLCJnZXRUYXJnZXQiLCJQb29sIiwibnVtIiwidG90YWwiLCJjYWNoZSIsImdldCIsInBhcmFtcyIsInAiLCJfX3B1aWQiLCJwb3AiLCJjcmVhdGVPckNsb25lIiwiZXhwaXJlIiwiZ2V0Q2FjaGUiLCJwdXNoIiwiY3JlYXRlIiwiVXRpbCIsImNsb25lIiwiZ2V0Q291bnQiLCJjb3VudCIsIlN0YXRzIiwicHJvdG9uIiwiY29udGFpbmVyIiwiZW1pdHRlckluZGV4IiwicmVuZGVyZXJJbmRleCIsInVwZGF0ZSIsImJvZHkiLCJhZGQiLCJlbWl0dGVyIiwiZ2V0RW1pdHRlciIsInJlbmRlcmVyIiwiZ2V0UmVuZGVyZXIiLCJzdHIiLCJlbWl0dGVycyIsImVtaXRTcGVlZCIsImdldEVtaXR0ZXJQb3MiLCJpbml0aWFsaXplcyIsImNvbmNhdEFyciIsImJlaGF2aW91cnMiLCJuYW1lIiwiZ2V0Q3JlYXRlZE51bWJlciIsInBvb2wiLCJpbm5lckhUTUwiLCJjc3NUZXh0Iiwiam9pbiIsImFkZEV2ZW50TGlzdGVuZXIiLCJiZyIsImNvbG9yIiwicGFyZW50Tm9kZSIsImFwcGVuZENoaWxkIiwicmVuZGVyZXJzIiwicmVzdWx0IiwiY3Bvb2wiLCJyb3VuZCIsInJlbW92ZUNoaWxkIiwiRXZlbnREaXNwYXRjaGVyIiwiX2xpc3RlbmVycyIsImRpc3BhdGNoRXZlbnQiLCJoYXNFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzIiwibGlzdGVuZXIiLCJzcGxpY2UiLCJsaXN0ZW5lcnMiLCJoYW5kbGVyIiwiUEkiLCJJTkZJTklUWSIsIkluZmluaXR5IiwiTWF0aFV0aWwiLCJQSXgyIiwiUElfMiIsIlBJXzE4MCIsIk4xODBfUEkiLCJpc0luZmluaXR5IiwicmFuZG9tQVRvQiIsImlzSW50IiwicmFuZG9tRmxvYXRpbmciLCJjZW50ZXIiLCJmIiwicmFuZG9tQ29sb3IiLCJzbGljZSIsInJhbmRvbVpvbmUiLCJkaXNwbGF5IiwiayIsImRpZ2l0cyIsInBvdyIsImRlZ3JlZVRyYW5zZm9ybSIsInRvQ29sb3IxNiIsIkludGVncmF0aW9uIiwiY2FsY3VsYXRlIiwicGFydGljbGVzIiwidGltZSIsImRhbXBpbmciLCJldWxlckludGVncmF0ZSIsInBhcnRpY2xlIiwic2xlZXAiLCJvbGQiLCJjb3B5IiwidiIsIm11bHRpcGx5U2NhbGFyIiwibWFzcyIsImNsZWFyIiwiUHJvdG9uIiwiaW50ZWdyYXRpb25UeXBlIiwibm93IiwidGhlbiIsImVsYXBzZWQiLCJzdGF0cyIsIkVVTEVSIiwiaW50ZWdyYXRvciIsIl9mcHMiLCJfaW50ZXJ2YWwiLCJERUZBVUxUX0lOVEVSVkFMIiwiYWRkUmVuZGVyZXIiLCJyZW5kZXIiLCJpbml0IiwicmVtb3ZlUmVuZGVyZXIiLCJpbmRleCIsInJlbW92ZSIsImFkZEVtaXR0ZXIiLCJwYXJlbnQiLCJFTUlUVEVSX0FEREVEIiwicmVtb3ZlRW1pdHRlciIsIkVNSVRURVJfUkVNT1ZFRCIsIlBST1RPTl9VUERBVEUiLCJVU0VfQ0xPQ0siLCJEYXRlIiwiZ2V0VGltZSIsImFtZW5kQ2hhbmdlVGFic0J1ZyIsImVtaXR0ZXJzVXBkYXRlIiwiUFJPVE9OX1VQREFURV9BRlRFUiIsImdldEFsbFBhcnRpY2xlcyIsImRlc3Ryb3lBbGxFbWl0dGVycyIsImRlc3Ryb3lPdGhlciIsInNldFRpbWVvdXQiLCJmcHMiLCJNRUFTVVJFIiwiUksyIiwiUEFSVElDTEVfQ1JFQVRFRCIsIlBBUlRJQ0xFX1VQREFURSIsIlBBUlRJQ0xFX1NMRUVQIiwiUEFSVElDTEVfREVBRCIsIlJnYiIsInIiLCJnIiwicmVzZXQiLCJoYXNQcm9wIiwic2V0UHJvcCIsInByb3BzIiwicHJvcCIsIlNwYW4iLCJnZXRTcGFuVmFsdWUiLCJzZXRWZWN0b3JWYWwiLCJjb25mIiwiZWFzZUxpbmVhciIsImVhc2VJblF1YWQiLCJlYXNlT3V0UXVhZCIsImVhc2VJbk91dFF1YWQiLCJlYXNlSW5DdWJpYyIsImVhc2VPdXRDdWJpYyIsImVhc2VJbk91dEN1YmljIiwiZWFzZUluUXVhcnQiLCJlYXNlT3V0UXVhcnQiLCJlYXNlSW5PdXRRdWFydCIsImVhc2VJblNpbmUiLCJlYXNlT3V0U2luZSIsImVhc2VJbk91dFNpbmUiLCJlYXNlSW5FeHBvIiwiZWFzZU91dEV4cG8iLCJlYXNlSW5PdXRFeHBvIiwiZWFzZUluQ2lyYyIsInNxcnQiLCJlYXNlT3V0Q2lyYyIsImVhc2VJbk91dENpcmMiLCJlYXNlSW5CYWNrIiwiZWFzZU91dEJhY2siLCJlYXNlSW5PdXRCYWNrIiwiZ2V0RWFzaW5nIiwiZWFzZSIsIlZlY3RvcjJEIiwic2V0Iiwic2V0WCIsInNldFkiLCJnZXRHcmFkaWVudCIsImF0YW4yIiwidyIsImFkZFZlY3RvcnMiLCJhZGRYWSIsInN1YiIsInN1YlZlY3RvcnMiLCJkaXZpZGVTY2FsYXIiLCJuZWdhdGUiLCJkb3QiLCJsZW5ndGhTcSIsIm5vcm1hbGl6ZSIsImRpc3RhbmNlVG8iLCJkaXN0YW5jZVRvU3F1YXJlZCIsInRoYSIsImR4IiwiZHkiLCJsZXJwIiwiYWxwaGEiLCJlcXVhbHMiLCJQYXJ0aWNsZSIsImRhdGEiLCJyZ2IiLCJQcm9wVXRpbCIsImdldERpcmVjdGlvbiIsImxpZmUiLCJhZ2UiLCJkZWFkIiwic3ByaXRlIiwiZW5lcmd5IiwicmFkaXVzIiwicm90YXRpb24iLCJlYXNpbmciLCJyZW1vdmVBbGxCZWhhdmlvdXJzIiwiYXBwbHlCZWhhdmlvdXJzIiwibWF4IiwiYXBwbHlCZWhhdmlvdXIiLCJhZGRCZWhhdmlvdXIiLCJiZWhhdmlvdXIiLCJwYXJlbnRzIiwiaW5pdGlhbGl6ZSIsImFkZEJlaGF2aW91cnMiLCJyZW1vdmVCZWhhdmlvdXIiLCJoZXhUb1JnYiIsImgiLCJoZXgxNiIsInN1YnN0cmluZyIsInBhcnNlSW50IiwicmdiVG9IZXgiLCJyYmciLCJnZXRIZXgxNkZyb21QYXJ0aWNsZSIsIk51bWJlciIsIlBvbGFyMkQiLCJhYnMiLCJzZXRSIiwic2V0VGhhIiwidG9WZWN0b3IiLCJnZXRYIiwiZ2V0WSIsIk1hdDMiLCJtYXQzIiwibWF0IiwiRmxvYXQzMkFycmF5IiwibWF0MSIsIm1hdDIiLCJtdWx0aXBseSIsImludmVyc2UiLCJkIiwibXVsdGlwbHlWZWMyIiwibSIsInZlYyIsImdldFZhbHVlIiwic2V0U3BhblZhbHVlIiwicGFuIiwiQXJyYXlTcGFuIiwiX2FyciIsImNyZWF0ZUFycmF5U3BhbiIsIlJlY3RhbmdsZSIsImJvdHRvbSIsInJpZ2h0IiwiY29udGFpbnMiLCJSYXRlIiwibnVtcGFuIiwidGltZXBhbiIsIm51bVBhbiIsInRpbWVQYW4iLCJzdGFydFRpbWUiLCJuZXh0VGltZSIsIkluaXRpYWxpemUiLCJMaWZlIiwibGlmZVBhbiIsIlpvbmUiLCJ2ZWN0b3IiLCJjcm9zc1R5cGUiLCJhbGVydCIsImdldFBvc2l0aW9uIiwiY3Jvc3NpbmciLCJQb2ludFpvbmUiLCJjb25zb2xlIiwiZXJyb3IiLCJQb3NpdGlvbiIsInpvbmUiLCJWZWxvY2l0eSIsInJwYW4iLCJ0aGFwYW4iLCJyUGFuIiwidGhhUGFuIiwibm9ybWFsaXplVmVsb2NpdHkiLCJ2ciIsInBvbGFyMmQiLCJNYXNzIiwibWFzc1BhbiIsIlJhZGl1cyIsIm9sZFJhZGl1cyIsIkJvZHkiLCJpbWFnZVRhcmdldCIsImlubmVyIiwiQmVoYXZpb3VyIiwibm9ybWFsaXplRm9yY2UiLCJmb3JjZSIsIm5vcm1hbGl6ZVZhbHVlIiwiRm9yY2UiLCJmeCIsImZ5IiwiQXR0cmFjdGlvbiIsInRhcmdldFBvc2l0aW9uIiwicmFkaXVzU3EiLCJhdHRyYWN0aW9uRm9yY2UiLCJSYW5kb21EcmlmdCIsImRyaWZ0WCIsImRyaWZ0WSIsImRlbGF5IiwicGFuRm9jZSIsIkdyYXZpdHkiLCJDb2xsaXNpb24iLCJjb2xsaXNpb25Qb29sIiwiZGVsdGEiLCJuZXdQb29sIiwib3RoZXJQYXJ0aWNsZSIsIm92ZXJsYXAiLCJ0b3RhbE1hc3MiLCJhdmVyYWdlTWFzczEiLCJhdmVyYWdlTWFzczIiLCJkaXN0YW5jZSIsIkNyb3NzWm9uZSIsIkFscGhhIiwic2FtZSIsImFscGhhQSIsImFscGhhQiIsIlNjYWxlIiwic2NhbGVBIiwic2NhbGVCIiwiUm90YXRlIiwiaW5mbHVlbmNlIiwicm90YXRpb25BIiwicm90YXRpb25CIiwiQ29sb3IiLCJjb2xvckEiLCJDb2xvclV0aWwiLCJjb2xvckIiLCJDSEFOR0lORyIsIkN5Y2xvbmUiLCJhbmdsZSIsInNldEFuZ2xlQW5kRm9yY2UiLCJzcGFuIiwiU3RyaW5nIiwidG9Mb3dlckNhc2UiLCJjYW5nbGUiLCJjeWNsb25lIiwiZ3JhZGllbnQiLCJSZXB1bHNpb24iLCJHcmF2aXR5V2VsbCIsImNlbnRlclBvaW50IiwiZGlzdGFuY2VWZWMiLCJkaXN0YW5jZVNxIiwiZmFjdG9yIiwiYmluZEVtaXR0ZXIiLCJFbWl0dGVyIiwiZW1pdFRpbWUiLCJ0b3RhbFRpbWUiLCJyYXRlIiwiZW1pdCIsInN0b3BlZCIsImlzTmFOIiwic3RvcCIsInByZUVtaXQiLCJvbGRTdG9wZWQiLCJvbGRFbWl0VGltZSIsIm9sZFRvdGFsVGltZSIsInN0ZXAiLCJyZW1vdmVBbGxQYXJ0aWNsZXMiLCJhZGRTZWxmSW5pdGlhbGl6ZSIsImluaXRBbGwiLCJhZGRJbml0aWFsaXplIiwicmVzdCIsInJlbW92ZUluaXRpYWxpemUiLCJpbml0aWFsaXplciIsInJlbW92ZUFsbEluaXRpYWxpemVycyIsImFyZ3VtZW50cyIsImVtaXR0aW5nIiwiaW50ZWdyYXRlIiwiZGlzcGF0Y2giLCJldmVudCIsImJpbmRFdmVudCIsImNyZWF0ZVBhcnRpY2xlIiwic2V0dXBQYXJ0aWNsZSIsIkluaXRpYWxpemVVdGlsIiwiQmVoYXZpb3VyRW1pdHRlciIsInNlbGZCZWhhdmlvdXJzIiwiYWRkU2VsZkJlaGF2aW91ciIsInJlbW92ZVNlbGZCZWhhdmlvdXIiLCJGb2xsb3dFbWl0dGVyIiwibW91c2VUYXJnZXQiLCJ3aW5kb3ciLCJfYWxsb3dFbWl0dGluZyIsImluaXRFdmVudEhhbmRsZXIiLCJtb3VzZW1vdmVIYW5kbGVyIiwibW91c2Vtb3ZlIiwibW91c2Vkb3duSGFuZGxlciIsIm1vdXNlZG93biIsIm1vdXNldXBIYW5kbGVyIiwibW91c2V1cCIsImxheWVyWCIsImxheWVyWSIsIm9mZnNldFgiLCJvZmZzZXRZIiwiaXNJbWFnZSIsInRhZ05hbWUiLCJub2RlTmFtZSIsImlzU3RyaW5nIiwiQmFzZVJlbmRlcmVyIiwiZWxlbWVudCIsInN0cm9rZSIsImNpcmNsZUNvbmYiLCJpc0NpcmNsZSIsInNldFN0cm9rZSIsInRoaW5rbmVzcyIsIl9wcm90b25VcGRhdGVIYW5kbGVyIiwib25Qcm90b25VcGRhdGUiLCJfcHJvdG9uVXBkYXRlQWZ0ZXJIYW5kbGVyIiwib25Qcm90b25VcGRhdGVBZnRlciIsIl9lbWl0dGVyQWRkZWRIYW5kbGVyIiwib25FbWl0dGVyQWRkZWQiLCJfZW1pdHRlclJlbW92ZWRIYW5kbGVyIiwib25FbWl0dGVyUmVtb3ZlZCIsIl9wYXJ0aWNsZUNyZWF0ZWRIYW5kbGVyIiwib25QYXJ0aWNsZUNyZWF0ZWQiLCJfcGFydGljbGVVcGRhdGVIYW5kbGVyIiwib25QYXJ0aWNsZVVwZGF0ZSIsIl9wYXJ0aWNsZURlYWRIYW5kbGVyIiwib25QYXJ0aWNsZURlYWQiLCJDYW52YXNSZW5kZXJlciIsImJ1ZmZlckNhY2hlIiwiYWRkSW1nMkJvZHkiLCJUeXBlcyIsImRyYXdDaXJjbGUiLCJidWZmZXIiLCJjcmVhdGVCdWZmZXIiLCJidWZDb250ZXh0IiwiZ2xvYmFsQWxwaGEiLCJnbG9iYWxDb21wb3NpdGVPcGVyYXRpb24iLCJmaWxsU3R5bGUiLCJmaWxsUmVjdCIsInNhdmUiLCJ0cmFuc2xhdGUiLCJyZXN0b3JlIiwiYmVnaW5QYXRoIiwiYXJjIiwic3Ryb2tlU3R5bGUiLCJsaW5lV2lkdGgiLCJjbG9zZVBhdGgiLCJmaWxsIiwic2l6ZSIsIkRvbVJlbmRlcmVyIiwiY3JlYXRlQm9keSIsImJvZHlSZWFkeSIsImJhY2tncm91bmRDb2xvciIsImNyZWF0ZUNpcmNsZSIsImNyZWF0ZVNwcml0ZSIsImJvcmRlclJhZGl1cyIsImJvcmRlckNvbG9yIiwiYm9yZGVyV2lkdGgiLCJ1cmwiLCJiYWNrZ3JvdW5kSW1hZ2UiLCJFYXNlbFJlbmRlcmVyIiwiYWRkQ2hpbGQiLCJzY2FsZVgiLCJzY2FsZVkiLCJncmFwaGljcyIsInJlZ1giLCJyZWdZIiwiY3JlYXRlanMiLCJHcmFwaGljcyIsImJlZ2luU3Ryb2tlIiwiYmVnaW5GaWxsIiwic2hhcGUiLCJTaGFwZSIsIlBpeGVsUmVuZGVyZXIiLCJyZWN0YW5nbGUiLCJpbWFnZURhdGEiLCJjcmVhdGVJbWFnZURhdGEiLCJwdXRJbWFnZURhdGEiLCJzZXRQaXhlbCIsImVsZW1lbnR3aWR0aCIsIlBJWElDbGFzcyIsIlBpeGlSZW5kZXJlciIsInNldENvbG9yIiwiYmxlbmRNb2RlIiwic2V0UElYSSIsIlBJWEkiLCJTcHJpdGUiLCJjcmVhdGVGcm9tSW1hZ2UiLCJmcm9tIiwiZnJvbUltYWdlIiwidGludCIsImFuY2hvciIsImVuZEZpbGwiLCJNU3RhY2siLCJtYXRzIiwidG9wIiwiV2ViR0xSZW5kZXJlciIsImdsIiwiYW50aWFsaWFzIiwic3RlbmNpbCIsImRlcHRoIiwiaW5pdFZhciIsInNldE1heFJhZGl1cyIsImluaXRTaGFkZXJzIiwiaW5pdEJ1ZmZlcnMiLCJibGVuZEVxdWF0aW9uIiwiRlVOQ19BREQiLCJibGVuZEZ1bmMiLCJTUkNfQUxQSEEiLCJPTkVfTUlOVVNfU1JDX0FMUEhBIiwiZW5hYmxlIiwiQkxFTkQiLCJ1bWF0Iiwic21hdCIsIm1zdGFjayIsInZpZXdwb3J0IiwiY2lyY2xlQ2FudmFzVVJMIiwiZ2V0VmVydGV4U2hhZGVyIiwidnNTb3VyY2UiLCJnZXRGcmFnbWVudFNoYWRlciIsImZzU291cmNlIiwidGV4dHVyZWJ1ZmZlcnMiLCJBIiwiQiIsImdldFNoYWRlciIsImZzIiwic2hhZGVyIiwiY3JlYXRlU2hhZGVyIiwiRlJBR01FTlRfU0hBREVSIiwiVkVSVEVYX1NIQURFUiIsInNoYWRlclNvdXJjZSIsImNvbXBpbGVTaGFkZXIiLCJnZXRTaGFkZXJQYXJhbWV0ZXIiLCJDT01QSUxFX1NUQVRVUyIsImdldFNoYWRlckluZm9Mb2ciLCJmcmFnbWVudFNoYWRlciIsInZlcnRleFNoYWRlciIsInNwcm9ncmFtIiwiY3JlYXRlUHJvZ3JhbSIsImF0dGFjaFNoYWRlciIsImxpbmtQcm9ncmFtIiwiZ2V0UHJvZ3JhbVBhcmFtZXRlciIsIkxJTktfU1RBVFVTIiwidXNlUHJvZ3JhbSIsInZwYSIsImdldEF0dHJpYkxvY2F0aW9uIiwidGNhIiwiZW5hYmxlVmVydGV4QXR0cmliQXJyYXkiLCJ0TWF0VW5pZm9ybSIsImdldFVuaWZvcm1Mb2NhdGlvbiIsInNhbXBsZXJVbmlmb3JtIiwidXNlVGV4IiwidW5pZm9ybTFpIiwidnMiLCJpZHgiLCJ1bml0SUJ1ZmZlciIsImJpbmRCdWZmZXIiLCJFTEVNRU5UX0FSUkFZX0JVRkZFUiIsImJ1ZmZlckRhdGEiLCJVaW50MTZBcnJheSIsIlNUQVRJQ19EUkFXIiwiaWRzIiwidW5pdEkzMyIsInN0cmlwQnVmZmVyIiwicmFpZHVzIiwiY2lyY2xlQ2FudmFzUmFkaXVzIiwidG9EYXRhVVJMIiwiZHJhd0ltZzJDYW52YXMiLCJfdyIsIl9oIiwiX3dpZHRoIiwiX2hlaWdodCIsIl9zY2FsZVgiLCJfc2NhbGVZIiwiY3JlYXRlVGV4dHVyZSIsInRleHR1cmUiLCJ2Y0J1ZmZlciIsInRjQnVmZmVyIiwiQVJSQVlfQlVGRkVSIiwiYmluZFRleHR1cmUiLCJURVhUVVJFXzJEIiwidGV4SW1hZ2UyRCIsIlJHQkEiLCJVTlNJR05FRF9CWVRFIiwidGV4UGFyYW1ldGVyaSIsIlRFWFRVUkVfTUFHX0ZJTFRFUiIsIkxJTkVBUiIsIlRFWFRVUkVfTUlOX0ZJTFRFUiIsIkxJTkVBUl9NSVBNQVBfTkVBUkVTVCIsImdlbmVyYXRlTWlwbWFwIiwidGV4dHVyZUxvYWRlZCIsInRleHR1cmVXaWR0aCIsInRleHR1cmVIZWlnaHQiLCJ0bWF0IiwiaW1hdCIsIm9sZFNjYWxlIiwidXBkYXRlTWF0cml4IiwidW5pZm9ybTNmIiwidW5pZm9ybU1hdHJpeDNmdiIsInZlcnRleEF0dHJpYlBvaW50ZXIiLCJGTE9BVCIsImRyYXdFbGVtZW50cyIsIlRSSUFOR0xFUyIsIlVOU0lHTkVEX1NIT1JUIiwibW92ZU9yaWdpbk1hdHJpeCIsInRyYW5zbGF0aW9uTWF0cml4IiwiYW5nZWwiLCJyb3RhdGlvbk1hdHJpeCIsInNjYWxlTWF0cml4IiwibWF0cml4IiwiQ3VzdG9tUmVuZGVyZXIiLCJMaW5lWm9uZSIsIngxIiwieTEiLCJ4MiIsInkyIiwiZGlyZWN0aW9uIiwibWlueCIsIm1pbiIsIm1pbnkiLCJtYXh4IiwibWF4eSIsInh4eXkiLCJnZXRMZW5ndGgiLCJDIiwiRCIsImdldERpc3RhbmNlIiwiZ2V0U3ltbWV0cmljIiwidGhhMiIsInRoYTEiLCJvbGR4Iiwib2xkeSIsInJhbmdlT3V0IiwiQ2lyY2xlWm9uZSIsInJhbmRvbVJhZGl1cyIsInNldENlbnRlciIsIlJlY3Rab25lIiwiSW1hZ2Vab25lIiwidmVjdG9ycyIsInNldFZlY3RvcnMiLCJqIiwibGVuZ3RoMSIsImxlbmd0aDIiLCJnZXRCb3VuZCIsImdldENvbG9yIiwiZnVuYyIsImdldFN0eWxlIiwiZHJhd1pvbmUiLCJtb3ZlVG8iLCJsaW5lVG8iLCJkcmF3UmVjdCIsImRyYXdFbWl0dGVyIiwiVmVjdG9yIiwiUG9sYXIiLCJnZXRTcGFuIiwiSW5pdCIsIkwiLCJQIiwiViIsIk0iLCJSIiwiRiIsIlJEIiwiRyIsIlMiLCJXZWJHbFJlbmRlcmVyIiwiRGVidWciXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxrQkFBZTtFQUNiO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDRUEsRUFBQUEsSUFaYSxnQkFZUkMsTUFaUSxFQVlBO0VBQ1gsV0FBTyxDQUFDQSxNQUFNLEdBQUlBLE1BQU0sR0FBRyxDQUFwQixNQUE0QixDQUFuQztFQUNELEdBZFk7O0VBZ0JiO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDRUMsRUFBQUEsS0EzQmEsaUJBMkJQRCxNQTNCTyxFQTJCQztFQUNaLE1BQUVBLE1BQUY7O0VBQ0EsU0FBSyxJQUFJRSxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHLEVBQXBCLEVBQXdCQSxDQUFDLEtBQUssQ0FBOUIsRUFBaUM7RUFDL0JGLE1BQUFBLE1BQU0sR0FBR0EsTUFBTSxH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 diff --git a/build/proton.min.js b/build/proton.min.js index 7a6fda5..a313017 100755 --- a/build/proton.min.js +++ b/build/proton.min.js @@ -1,5 +1,5 @@ /*! -* Proton v5.2.5 +* Proton v5.2.7 * https://github.com/drawcall/Proton * * Copyright 2013-2021, drawcall @@ -7,5 +7,5 @@ * http://www.opensource.org/licenses/mit-license * */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Proton=e()}(this,(function(){"use strict";function t(t,e){for(var i=0;i>e;return t+1},a=function(t,e){return[1,0,0,0,1,0,t,e,1]},s=function(t){var e=Math.cos(t),i=Math.sin(t);return[e,-i,0,i,e,0,0,0,1]},o=function(t,e){return[t,0,0,0,e,0,0,0,1]},h=function(t,e){var i=t[0],n=t[1],r=t[2],a=t[3],s=t[4],o=t[5],h=t[6],l=t[7],c=t[8],u=e[0],d=e[1],p=e[2],f=e[3],g=e[4],y=e[5],m=e[6],v=e[7],b=e[8];return[i*u+n*f+r*m,i*d+n*g+r*v,i*p+n*y+r*b,a*u+s*f+o*m,a*d+s*g+o*v,a*p+s*y+o*b,h*u+l*f+c*m,h*d+l*g+c*v,h*p+l*y+c*b]},l={createCanvas:function(t,e,i,n){void 0===n&&(n="absolute");var r=document.createElement("canvas");return r.id=t,r.width=e,r.height=i,r.style.opacity=0,r.style.position=n,this.transform(r,-500,-500,0,0),r},createDiv:function(t,e,i){var n=document.createElement("div");return n.id=t,n.style.position="absolute",this.resize(n,e,i),n},resize:function(t,e,i){t.style.width=e+"px",t.style.height=i+"px",t.style.marginLeft=-e/2+"px",t.style.marginTop=-i/2+"px"},transform:function(t,e,i,n,r){t.style.willChange="transform";var a="translate("+e+"px, "+i+"px) scale("+n+") rotate("+r+"deg)";this.css3(t,"transform",a)},transform3d:function(t,e,i,n,r){t.style.willChange="transform";var a="translate3d("+e+"px, "+i+"px, 0) scale("+n+") rotate("+r+"deg)";this.css3(t,"backfaceVisibility","hidden"),this.css3(t,"transform",a)},css3:function(t,e,i){var n=e.charAt(0).toUpperCase()+e.substr(1);t.style["Webkit"+n]=i,t.style["Moz"+n]=i,t.style["O"+n]=i,t.style["ms"+n]=i,t.style[""+e]=i}},c={},u={},d=0,p=function(t,e,i){t.drawImage(e,i.x,i.y);var n=t.getImageData(i.x,i.y,i.width,i.height);return t.clearRect(i.x,i.y,i.width,i.height),n},f=function(t,e,i){var n="string"==typeof t?t:t.src;if(c[n])e(c[n],i);else{var r=new Image;r.onload=function(t){c[n]=t.target,e(c[n],i)},r.src=n}},g=function(t,e,i){var n=t.src;if(!u[n]){var a=r(t.width),s=r(t.height),o=l.createCanvas("proton_canvas_cache_"+ ++d,a,s);o.getContext("2d").drawImage(t,0,0,t.width,t.height),u[n]=o}return e&&e(u[n],i),u[n]},y={initValue:function(t,e){return t=null!=t?t:e},isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)},emptyArray:function(t){t&&(t.length=0)},toArray:function(t){return this.isArray(t)?t:[t]},getRandFromArray:function(t){return t?t[Math.floor(t.length*Math.random())]:null},emptyObject:function(t,e){for(var i in void 0===e&&(e=null),t)e&&e.indexOf(i)>-1||delete t[i]},classApply:function(t,e){return void 0===e&&(e=null),e?new(t.bind.apply(t,[null].concat(e))):new t},getImageData:function(t,e,i){return p(t,e,i)},destroyAll:function(t,e){void 0===e&&(e=null);for(var i=t.length;i--;){try{t[i].destroy(e)}catch(t){}delete t[i]}t.length=0},assign:function(t,e){if("function"!=typeof Object.assign){for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i]);return t}return Object.assign(t,e)}},m={},v={_index:0,_cache:{},id:function(t){return void 0!==m[t]&&null!==m[t]||(m[t]=0),t+"_"+m[t]++},getId:function(t){var e=this.getIdFromCache(t);return e||(e="PUID_"+this._index++,this._cache[e]=t,e)},getIdFromCache:function(t){var e,i;for(i in this._cache){if((e=this._cache[i])===t)return i;if(this.isBody(e,t)&&e.src===t.src)return i}return null},isBody:function(t,e){return"object"==typeof t&&"object"==typeof e&&t.isInner&&e.isInner},getTarget:function(t){return this._cache[t]}},b=function(){function t(t){this.total=0,this.cache={}}var e=t.prototype;return e.get=function(t,e,i){var n;return i=i||t.__puid||v.getId(t),(n=this.cache[i]&&this.cache[i].length>0?this.cache[i].pop():this.createOrClone(t,e)).__puid=t.__puid||i,n},e.expire=function(t){return this.getCache(t.__puid).push(t)},e.createOrClone=function(t,e){return this.total++,this.create?this.create(t,e):"function"==typeof t?y.classApply(t,e):t.clone()},e.getCount=function(){var t=0;for(var e in this.cache)t+=this.cache[e].length;return t++},e.destroy=function(){for(var t in this.cache)this.cache[t].length=0,delete this.cache[t]},e.getCache=function(t){return void 0===t&&(t="default"),this.cache[t]||(this.cache[t]=[]),this.cache[t]},t}(),x=function(){function t(t){this.proton=t,this.container=null,this.type=1,this.emitterIndex=0,this.rendererIndex=0}var e=t.prototype;return e.update=function(t,e){this.add(t,e);var i=this.getEmitter(),n=this.getRenderer(),r="";switch(this.type){case 2:r+="emitter:"+this.proton.emitters.length+"
",i&&(r+="em speed:"+i.emitSpeed+"
"),i&&(r+="pos:"+this.getEmitterPos(i));break;case 3:i&&(r+="initializes:"+i.initializes.length+"
"),i&&(r+=''+this.concatArr(i.initializes)+"
"),i&&(r+="behaviours:"+i.behaviours.length+"
"),i&&(r+=''+this.concatArr(i.behaviours)+"
");break;case 4:n&&(r+=n.name+"
"),n&&(r+="body:"+this.getCreatedNumber(n)+"
");break;default:r+="particles:"+this.proton.getCount()+"
",r+="pool:"+this.proton.pool.getCount()+"
",r+="total:"+this.proton.pool.total}this.container.innerHTML=r},e.add=function(t,e){var i=this;if(!this.container){var n,r;switch(this.type=1,this.container=document.createElement("div"),this.container.style.cssText=["position:absolute;bottom:0px;left:0;cursor:pointer;","opacity:0.9;z-index:10000;padding:10px;font-size:12px;font-family:Helvetica,Arial,sans-serif;","width:120px;height:50px;background-color:#002;color:#0ff;"].join(""),this.container.addEventListener("click",(function(t){i.type++,i.type>4&&(i.type=1)}),!1),t){case 2:n="#201",r="#f08";break;case 3:n="#020",r="#0f0";break;default:n="#002",r="#0ff"}this.container.style["background-color"]=n,this.container.style.color=r}this.container.parentNode||(e=e||this.body||document.body).appendChild(this.container)},e.getEmitter=function(){return this.proton.emitters[this.emitterIndex]},e.getRenderer=function(){return this.proton.renderers[this.rendererIndex]},e.concatArr=function(t){var e="";if(!t||!t.length)return e;for(var i=0;i>0)+t:t+Math.random()*(e-t)},randomFloating:function(t,e,i){return this.randomAToB(t-e,t+e,i)},randomColor:function(){return"#"+("00000"+(16777216*Math.random()<<0).toString(16)).slice(-6)},randomZone:function(t){},floor:function(t,e){void 0===e&&(e=4);var i=Math.pow(10,e);return Math.floor(t*i)/i},degreeTransform:function(t){return t*A/180},toColor16:function(t){return"#"+t.toString(16)}},T=function(){function t(t){this.type=t}var e=t.prototype;return e.calculate=function(t,e,i){this.eulerIntegrate(t,e,i)},e.eulerIntegrate=function(t,e,i){t.sleep||(t.old.p.copy(t.p),t.old.v.copy(t.v),t.a.multiplyScalar(1/t.mass),t.v.add(t.a.multiplyScalar(e)),t.p.add(t.old.v.multiplyScalar(e)),i&&t.v.multiplyScalar(i),t.a.clear())},t}(),R=function(){function e(t){this.emitters=[],this.renderers=[],this.time=0,this.now=0,this.then=0,this.elapsed=0,this.stats=new x(this),this.pool=new b(80),this.integrationType=y.initValue(t,e.EULER),this.integrator=new T(this.integrationType),this._fps="auto",this._interval=e.DEFAULT_INTERVAL}var i,n,r,a=e.prototype;return a.addRenderer=function(t){t.init(this),this.renderers.push(t)},a.removeRenderer=function(t){var e=this.renderers.indexOf(t);this.renderers.splice(e,1),t.remove(this)},a.addEmitter=function(t){this.emitters.push(t),t.parent=this,this.dispatchEvent(e.EMITTER_ADDED,t)},a.removeEmitter=function(t){var i=this.emitters.indexOf(t);this.emitters.splice(i,1),t.parent=null,this.dispatchEvent(e.EMITTER_REMOVED,t)},a.update=function(){"auto"===this._fps?(this.dispatchEvent(e.PROTON_UPDATE),e.USE_CLOCK?(this.then||(this.then=(new Date).getTime()),this.now=(new Date).getTime(),this.elapsed=.001*(this.now-this.then),this.amendChangeTabsBug(),this.elapsed>0&&this.emittersUpdate(this.elapsed),this.then=this.now):this.emittersUpdate(e.DEFAULT_INTERVAL),this.dispatchEvent(e.PROTON_UPDATE_AFTER)):(this.then||(this.then=(new Date).getTime()),this.now=(new Date).getTime(),this.elapsed=.001*(this.now-this.then),this.elapsed>this._interval&&(this.dispatchEvent(e.PROTON_UPDATE),this.emittersUpdate(this._interval),this.then=this.now-this.elapsed%this._interval*1e3,this.dispatchEvent(e.PROTON_UPDATE_AFTER)))},a.emittersUpdate=function(t){for(var e=this.emitters.length;e--;)this.emitters[e].update(t)},a.amendChangeTabsBug=function(){e.amendChangeTabsBug&&this.elapsed>.5&&(this.then=(new Date).getTime(),this.elapsed=0)},a.getCount=function(){for(var t=0,e=this.emitters.length;e--;)t+=this.emitters[e].particles.length;return t},a.getAllParticles=function(){for(var t=[],e=this.emitters.length;e--;)t=t.concat(this.emitters[e].particles);return t},a.destroyAllEmitters=function(){y.destroyAll(this.emitters)},a.destroy=function(t){var e=this;void 0===t&&(t=!1);var i=function(){e.time=0,e.then=0,e.pool.destroy(),y.destroyAll(e.emitters),y.destroyAll(e.renderers,e.getAllParticles())};t?setTimeout(i,200):i()},i=e,(n=[{key:"fps",get:function(){return this._fps},set:function(t){this._fps=t,this._interval="auto"===t?e.DEFAULT_INTERVAL:P.floor(1/t,7)}}])&&t(i.prototype,n),r&&t(i,r),e}();R.USE_CLOCK=!1,R.MEASURE=100,R.EULER="euler",R.RK2="runge-kutta2",R.PARTICLE_CREATED="PARTICLE_CREATED",R.PARTICLE_UPDATE="PARTICLE_UPDATE",R.PARTICLE_SLEEP="PARTICLE_SLEEP",R.PARTICLE_DEAD="PARTICLE_DEAD",R.EMITTER_ADDED="EMITTER_ADDED",R.EMITTER_REMOVED="EMITTER_REMOVED",R.PROTON_UPDATE="PROTON_UPDATE",R.PROTON_UPDATE_AFTER="PROTON_UPDATE_AFTER",R.DEFAULT_INTERVAL=.0167,R.amendChangeTabsBug=!0,E.bind(R);var _=function(){function t(t,e,i){void 0===t&&(t=255),void 0===e&&(e=255),void 0===i&&(i=255),this.r=t,this.g=e,this.b=i}return t.prototype.reset=function(){this.r=255,this.g=255,this.b=255},t}(),w={hasProp:function(t,e){return!!t&&void 0!==t[e]},setProp:function(t,e){for(var i in e)t.hasOwnProperty(i)&&(t[i]=Span.getSpanValue(e[i]));return t},setVectorVal:function(t,e){void 0===e&&(e=null),e&&(this.hasProp(e,"x")&&(t.p.x=e.x),this.hasProp(e,"y")&&(t.p.y=e.y),this.hasProp(e,"vx")&&(t.v.x=e.vx),this.hasProp(e,"vy")&&(t.v.y=e.vy),this.hasProp(e,"ax")&&(t.a.x=e.ax),this.hasProp(e,"ay")&&(t.a.y=e.ay),this.hasProp(e,"p")&&t.p.copy(e.p),this.hasProp(e,"v")&&t.v.copy(e.v),this.hasProp(e,"a")&&t.a.copy(e.a),this.hasProp(e,"position")&&t.p.copy(e.position),this.hasProp(e,"velocity")&&t.v.copy(e.velocity),this.hasProp(e,"accelerate")&&t.a.copy(e.accelerate))}},C={easeLinear:function(t){return t},easeInQuad:function(t){return Math.pow(t,2)},easeOutQuad:function(t){return-(Math.pow(t-1,2)-1)},easeInOutQuad:function(t){return(t/=.5)<1?.5*Math.pow(t,2):-.5*((t-=2)*t-2)},easeInCubic:function(t){return Math.pow(t,3)},easeOutCubic:function(t){return Math.pow(t-1,3)+1},easeInOutCubic:function(t){return(t/=.5)<1?.5*Math.pow(t,3):.5*(Math.pow(t-2,3)+2)},easeInQuart:function(t){return Math.pow(t,4)},easeOutQuart:function(t){return-(Math.pow(t-1,4)-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*Math.pow(t,4):-.5*((t-=2)*Math.pow(t,3)-2)},easeInSine:function(t){return 1-Math.cos(t*P.PI_2)},easeOutSine:function(t){return Math.sin(t*P.PI_2)},easeInOutSine:function(t){return-.5*(Math.cos(Math.PI*t)-1)},easeInExpo:function(t){return 0===t?0:Math.pow(2,10*(t-1))},easeOutExpo:function(t){return 1===t?1:1-Math.pow(2,-10*t)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(2-Math.pow(2,-10*--t))},easeInCirc:function(t){return-(Math.sqrt(1-t*t)-1)},easeOutCirc:function(t){return Math.sqrt(1-Math.pow(t-1,2))},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInBack:function(t){var e=1.70158;return t*t*((e+1)*t-e)},easeOutBack:function(t){var e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},getEasing:function(t){return"function"==typeof t?t:this[t]||this.easeLinear}},I=function(){function t(t,e){this.x=t||0,this.y=e||0}var e=t.prototype;return e.set=function(t,e){return this.x=t,this.y=e,this},e.setX=function(t){return this.x=t,this},e.setY=function(t){return this.y=t,this},e.getGradient=function(){return 0!==this.x?Math.atan2(this.y,this.x):this.y>0?P.PI_2:this.y<0?-P.PI_2:void 0},e.copy=function(t){return this.x=t.x,this.y=t.y,this},e.add=function(t,e){return void 0!==e?this.addVectors(t,e):(this.x+=t.x,this.y+=t.y,this)},e.addXY=function(t,e){return this.x+=t,this.y+=e,this},e.addVectors=function(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this},e.sub=function(t,e){return void 0!==e?this.subVectors(t,e):(this.x-=t.x,this.y-=t.y,this)},e.subVectors=function(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this},e.divideScalar=function(t){return 0!==t?(this.x/=t,this.y/=t):this.set(0,0),this},e.multiplyScalar=function(t){return this.x*=t,this.y*=t,this},e.negate=function(){return this.multiplyScalar(-1)},e.dot=function(t){return this.x*t.x+this.y*t.y},e.lengthSq=function(){return this.x*this.x+this.y*this.y},e.length=function(){return Math.sqrt(this.x*this.x+this.y*this.y)},e.normalize=function(){return this.divideScalar(this.length())},e.distanceTo=function(t){return Math.sqrt(this.distanceToSquared(t))},e.rotate=function(t){var e=this.x,i=this.y;return this.x=e*Math.cos(t)+i*Math.sin(t),this.y=-e*Math.sin(t)+i*Math.cos(t),this},e.distanceToSquared=function(t){var e=this.x-t.x,i=this.y-t.y;return e*e+i*i},e.lerp=function(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this},e.equals=function(t){return t.x===this.x&&t.y===this.y},e.clear=function(){return this.x=0,this.y=0,this},e.clone=function(){return new t(this.x,this.y)},t}(),S=function(){function t(t){this.id="",this.old={},this.data={},this.behaviours=[],this.p=[],this.v=[],this.a=[],this.rgb={},this.name="Particle",this.id=v.id(this.name),this.old={},this.data={},this.behaviours=[],this.p=new I,this.v=new I,this.a=new I,this.old.p=new I,this.old.v=new I,this.old.a=new I,this.rgb=new _,this.reset(),t&&w.setProp(this,t)}var e=t.prototype;return e.getDirection=function(){return Math.atan2(this.v.x,-this.v.y)*P.N180_PI},e.reset=function(){return this.life=1/0,this.age=0,this.dead=!1,this.sleep=!1,this.body=null,this.sprite=null,this.parent=null,this.energy=1,this.mass=1,this.radius=10,this.alpha=1,this.scale=1,this.rotation=0,this.color=null,this.p.set(0,0),this.v.set(0,0),this.a.set(0,0),this.old.p.set(0,0),this.old.v.set(0,0),this.old.a.set(0,0),this.easing=C.easeLinear,this.rgb.reset(),y.emptyObject(this.data),this.removeAllBehaviours(),this},e.update=function(t,e){if(this.sleep||(this.age+=t,this.applyBehaviours(t,e)),this.age-1&&(this.behaviours.splice(e,1).parents=null)},e.removeAllBehaviours=function(){y.emptyArray(this.behaviours)},e.destroy=function(){this.removeAllBehaviours(),this.energy=0,this.dead=!0,this.parent=null},t}(),D={hexToRgb:function(t){var e="#"===t.charAt(0)?t.substring(1,7):t;return{r:parseInt(e.substring(0,2),16),g:parseInt(e.substring(2,4),16),b:parseInt(e.substring(4,6),16)}},rgbToHex:function(t){return"rgb("+t.r+", "+t.g+", "+t.b+")"},getHex16FromParticle:function(t){return 65536*Number(t.rgb.r)+256*Number(t.rgb.g)+Number(t.rgb.b)}},V=function(){function t(t,e){this.r=Math.abs(t)||0,this.tha=e||0}var e=t.prototype;return e.set=function(t,e){return this.r=t,this.tha=e,this},e.setR=function(t){return this.r=t,this},e.setTha=function(t){return this.tha=t,this},e.copy=function(t){return this.r=t.r,this.tha=t.tha,this},e.toVector=function(){return new I(this.getX(),this.getY())},e.getX=function(){return this.r*Math.sin(this.tha)},e.getY=function(){return-this.r*Math.cos(this.tha)},e.normalize=function(){return this.r=1,this},e.equals=function(t){return t.r===this.r&&t.tha===this.tha},e.clear=function(){return this.r=0,this.tha=0,this},e.clone=function(){return new t(this.r,this.tha)},t}(),M={create:function(t){var e=new Float32Array(9);return t&&this.set(t,e),e},set:function(t,e){for(var i=0;i<9;i++)e[i]=t[i];return e},multiply:function(t,e,i){var n=t[0],r=t[1],a=t[2],s=t[3],o=t[4],h=t[6],l=t[7],c=e[0],u=e[1],d=e[2],p=e[3],f=e[4],g=e[6],y=e[7];return i[0]=c*n+u*s,i[1]=c*r+u*o,i[2]=a*d,i[3]=p*n+f*s,i[4]=p*r+f*o,i[6]=g*n+y*s+h,i[7]=g*r+y*o+l,i},inverse:function(t,e){var i,n=t[0],r=t[1],a=t[3],s=t[4],o=t[6],h=t[7],l=s,c=-a,u=h*a-s*o;return i=1/(n*l+r*c),e[0]=l*i,e[1]=-r*i,e[3]=c*i,e[4]=n*i,e[6]=u*i,e[7]=(-h*n+r*o)*i,e},multiplyVec2:function(t,e,i){var n=e[0],r=e[1];return i[0]=n*t[0]+r*t[3]+t[6],i[1]=n*t[1]+r*t[4]+t[7],i}},B=function(){function t(t,e,i){y.isArray(t)?(this.isArray=!0,this.a=t):(this.isArray=!1,this.a=y.initValue(t,1),this.b=y.initValue(e,this.a),this.center=y.initValue(i,!1))}return t.prototype.getValue=function(t){return void 0===t&&(t=!1),this.isArray?y.getRandFromArray(this.a):this.center?P.randomFloating(this.a,this.b,t):P.randomAToB(this.a,this.b,t)},t.setSpanValue=function(e,i,n){return e instanceof t?e:void 0===i?new t(e):void 0===n?new t(e,i):new t(e,i,n)},t.getSpanValue=function(e){return e instanceof t?e.getValue():e},t}(),L=function(t){function i(e){var i;return(i=t.call(this)||this)._arr=y.toArray(e),i}return e(i,t),i.prototype.getValue=function(){var t=y.getRandFromArray(this._arr);return"random"===t||"Random"===t?P.randomColor():t},i.createArraySpan=function(t){return t?t instanceof i?t:new i(t):null},i}(B),U=function(){function t(t,e,i,n){this.x=t,this.y=e,this.width=i,this.height=n,this.bottom=this.y+this.height,this.right=this.x+this.width}return t.prototype.contains=function(t,e){return t<=this.right&&t>=this.x&&e<=this.bottom&&e>=this.y},t}(),F=function(){function t(t,e){this.numPan=B.setSpanValue(y.initValue(t,1)),this.timePan=B.setSpanValue(y.initValue(e,1)),this.startTime=0,this.nextTime=0,this.init()}var e=t.prototype;return e.init=function(){this.startTime=0,this.nextTime=this.timePan.getValue()},e.getValue=function(t){return this.startTime+=t,this.startTime>=this.nextTime?(this.startTime=0,this.nextTime=this.timePan.getValue(),1===this.numPan.b?this.numPan.getValue(!1)>.5?1:0:this.numPan.getValue(!0)):0},t}(),z=function(){function t(){}var e=t.prototype;return e.reset=function(){},e.init=function(t,e){e?this.initialize(e):this.initialize(t)},e.initialize=function(t){},t}(),O=function(t){function i(e,i,n){var r;return(r=t.call(this)||this).lifePan=B.setSpanValue(e,i,n),r.name="Life",r}return e(i,t),i.prototype.initialize=function(t){this.lifePan.a===1/0?t.life=1/0:t.life=this.lifePan.getValue()},i}(z),k=function(){function t(){this.vector=new I(0,0),this.random=0,this.crossType="dead",this.alert=!0}var e=t.prototype;return e.getPosition=function(){},e.crossing=function(t){},e.destroy=function(){this.vector=null},t}(),N=function(t){function i(e,i){var n;return(n=t.call(this)||this).x=e,n.y=i,n}e(i,t);var n=i.prototype;return n.getPosition=function(){return this.vector.x=this.x,this.vector.y=this.y,this.vector},n.crossing=function(t){this.alert&&(console.error("Sorry, PointZone does not support crossing method!"),this.alert=!1)},i}(k),H=function(t){function i(e){var i;return(i=t.call(this)||this).zone=y.initValue(e,new N),i.name="Position",i}e(i,t);var n=i.prototype;return n.reset=function(t){this.zone=y.initValue(t,new N)},n.initialize=function(t){this.zone.getPosition(),t.p.x=this.zone.vector.x,t.p.y=this.zone.vector.y},i}(z),q=function(t){function i(e,i,n){var r;return(r=t.call(this)||this).rPan=B.setSpanValue(e),r.thaPan=B.setSpanValue(i),r.type=y.initValue(n,"vector"),r.name="Velocity",r}e(i,t);var n=i.prototype;return n.reset=function(t,e,i){this.rPan=B.setSpanValue(t),this.thaPan=B.setSpanValue(e),this.type=y.initValue(i,"vector")},n.normalizeVelocity=function(t){return t*R.MEASURE},n.initialize=function(t){if("p"===this.type||"P"===this.type||"polar"===this.type){var e=new V(this.normalizeVelocity(this.rPan.getValue()),this.thaPan.getValue()*P.PI_180);t.v.x=e.getX(),t.v.y=e.getY()}else t.v.x=this.normalizeVelocity(this.rPan.getValue()),t.v.y=this.normalizeVelocity(this.thaPan.getValue())},i}(z),G=function(t){function i(e,i,n){var r;return(r=t.call(this)||this).massPan=B.setSpanValue(e,i,n),r.name="Mass",r}return e(i,t),i.prototype.initialize=function(t){t.mass=this.massPan.getValue()},i}(z),X=function(t){function i(e,i,n){var r;return(r=t.call(this)||this).radius=B.setSpanValue(e,i,n),r.name="Radius",r}e(i,t);var n=i.prototype;return n.reset=function(t,e,i){this.radius=B.setSpanValue(t,e,i)},n.initialize=function(t){t.radius=this.radius.getValue(),t.data.oldRadius=t.radius},i}(z),Y=function(t){function i(e,i,n){var r;return(r=t.call(this)||this).image=r.setSpanValue(e),r.w=y.initValue(i,20),r.h=y.initValue(n,r.w),r.name="Body",r}e(i,t);var n=i.prototype;return n.initialize=function(t){var e=this.image.getValue();t.body="string"==typeof e?{width:this.w,height:this.h,src:e,isInner:!0,inner:!0}:e},n.setSpanValue=function(t){return t instanceof L?t:new L(t)},i}(z),j=function(){function t(e,i){this.life=y.initValue(e,1/0),this.easing=C.getEasing(i),this.age=0,this.energy=1,this.dead=!1,this.parents=[],this.id="Behaviour_"+t.id++,this.name="Behaviour"}var e=t.prototype;return e.reset=function(t,e){this.life=y.initValue(t,1/0),this.easing=C.getEasing(e)},e.normalizeForce=function(t){return t.multiplyScalar(R.MEASURE)},e.normalizeValue=function(t){return t*R.MEASURE},e.initialize=function(t){},e.calculate=function(t,e,i){if(this.age+=e,this.age>=this.life||this.dead)this.energy=0,this.dead=!0,this.destroy();else{var n=this.easing(t.age/t.life);this.energy=Math.max(1-n,0)}},e.destroy=function(){for(var t=this.parents.length;t--;)this.parents[t].removeBehaviour(this);this.parents.length=0},t}();j.id=0;var W=function(t){function i(e,i,n,r){var a;return(a=t.call(this,n,r)||this).force=a.normalizeForce(new I(e,i)),a.name="Force",a}e(i,t);var n=i.prototype;return n.reset=function(e,i,n,r){this.force=this.normalizeForce(new I(e,i)),n&&t.prototype.reset.call(this,n,r)},n.applyBehaviour=function(t,e,i){this.calculate(t,e,i),t.a.add(this.force)},i}(j),Z=function(t){function i(e,i,n,r,a){var s;return(s=t.call(this,r,a)||this).targetPosition=y.initValue(e,new I),s.radius=y.initValue(n,1e3),s.force=y.initValue(s.normalizeValue(i),100),s.radiusSq=s.radius*s.radius,s.attractionForce=new I,s.lengthSq=0,s.name="Attraction",s}e(i,t);var n=i.prototype;return n.reset=function(e,i,n,r,a){this.targetPosition=y.initValue(e,new I),this.radius=y.initValue(n,1e3),this.force=y.initValue(this.normalizeValue(i),100),this.radiusSq=this.radius*this.radius,this.attractionForce=new I,this.lengthSq=0,r&&t.prototype.reset.call(this,r,a)},n.applyBehaviour=function(t,e,i){this.calculate(t,e,i),this.attractionForce.copy(this.targetPosition),this.attractionForce.sub(t.p),this.lengthSq=this.attractionForce.lengthSq(),this.lengthSq>4e-5&&this.lengthSq=this.delay&&(t.a.addXY(P.randomAToB(-this.panFoce.x,this.panFoce.x),P.randomAToB(-this.panFoce.y,this.panFoce.y)),t.data.time=0)},i}(j),K=function(t){function i(e,i,n){var r;return(r=t.call(this,0,e,i,n)||this).name="Gravity",r}return e(i,t),i.prototype.reset=function(e,i,n){t.prototype.reset.call(this,0,e,i,n)},i}(W),J=function(t){function i(e,i,n,r,a){var s;return(s=t.call(this,r,a)||this).reset(e,i,n),s.name="Collision",s}e(i,t);var n=i.prototype;return n.reset=function(e,i,n,r,a){this.emitter=y.initValue(e,null),this.mass=y.initValue(i,!0),this.callback=y.initValue(n,null),this.collisionPool=[],this.delta=new I,r&&t.prototype.reset.call(this,r,a)},n.applyBehaviour=function(t,e,i){var n,r,a,s,o,h,l,c=this.emitter?this.emitter.particles.slice(i):this.pool.slice(i),u=c.length;for(l=0;lr;)t-=r,this.update(r);this.stoped=e,this.emitTime=i+Math.max(t,0),this.totalTime=n},n.removeAllParticles=function(){for(var t=this.particles.length;t--;)this.particles[t].dead=!0},n.addSelfInitialize=function(t){t.init?t.init(this):this.initAll()},n.addInitialize=function(){for(var t=arguments.length,e=new Array(t),i=0;i-1&&this.initializes.splice(e,1)},n.removeAllInitializers=function(){y.emptyArray(this.initializes)},n.addBehaviour=function(){for(var t=arguments.length,e=new Array(t),i=0;i=this.life||this.dead)&&this.destroy(),this.emitting(t),this.integrate(t)},n.integrate=function(t){if(this.parent){var e,i,n=1-this.damping;for(this.parent.integrator.calculate(this,t,n),e=this.particles.length-1;e>=0;e--)(i=this.particles[e]).update(t,e),this.parent.integrator.calculate(i,t,n),this.dispatch("PARTICLE_UPDATE",i),i.dead&&(this.dispatch("PARTICLE_DEAD",i),this.parent.pool.expire(i),this.particles.splice(e,1))}},n.dispatch=function(t,e){this.parent&&this.parent.dispatchEvent(t,e),this.bindEvent&&this.dispatchEvent(t,e)},n.emitting=function(t){if("once"===this.totalTime){var e,i=this.rate.getValue(99999);for(i>0&&(this.emitSpeed=i),e=0;e0&&(this.emitSpeed=r),n=0;n-1&&this.selfBehaviours.splice(e,1)},n.update=function(e){if(t.prototype.update.call(this,e),!this.sleep){var i,n=this.selfBehaviours.length;for(i=0;i>0,t.p.y-this.rectangle.y>>0,t)},n.setPixel=function(t,e,i,n){var r=n.rgb;if(!(e<0||e>this.element.width||i<0||i>this.elementwidth)){var a=4*((i>>0)*t.width+(e>>0));t.data[a]=r.r,t.data[a+1]=r.g,t.data[a+2]=r.b,t.data[a+3]=255*n.alpha}},n.onParticleDead=function(t){},n.destroy=function(){t.prototype.destroy.call(this),this.stroke=null,this.context=null,this.imageData=null,this.rectangle=null},i}(gt),xt=function(t){function i(e,i){var n;return(n=t.call(this,e)||this).stroke=i,n.color=!1,n.setColor=!1,n.blendMode=null,n.pool.create=function(t,e){return n.createBody(t,e)},n.setPIXI(window.PIXI),n.name="PixiRenderer",n}e(i,t);var n=i.prototype;return n.setPIXI=function(t){try{ct=t||{Sprite:{}},this.createFromImage=ct.Sprite.from||ct.Sprite.fromImage}catch(t){}},n.onProtonUpdate=function(){},n.onParticleCreated=function(t){t.body?t.body=this.pool.get(t.body,t):t.body=this.pool.get(this.circleConf,t),this.blendMode&&(t.body.blendMode=this.blendMode),this.element.addChild(t.body)},n.onParticleUpdate=function(t){this.transform(t,t.body),!0!==this.setColor&&!0!==this.color||(t.body.tint=D.getHex16FromParticle(t))},n.onParticleDead=function(t){this.element.removeChild(t.body),this.pool.expire(t.body),t.body=null},n.transform=function(t,e){e.x=t.p.x,e.y=t.p.y,e.alpha=t.alpha,e.scale.x=t.scale,e.scale.y=t.scale,e.rotation=t.rotation*P.PI_180},n.createBody=function(t,e){return t.isCircle?this.createCircle(e):this.createSprite(t)},n.createSprite=function(t){var e=t.isInner?this.createFromImage(t.src):new ct.Sprite(t);return e.anchor.x=.5,e.anchor.y=.5,e},n.createCircle=function(t){var e=new ct.Graphics;if(this.stroke){var i=ft(this.stroke)?this.stroke:0;e.beginStroke(i)}return e.beginFill(t.color||36077),e.drawCircle(0,0,t.radius),e.endFill(),e},n.destroy=function(e){t.prototype.destroy.call(this);for(var i=e.length;i--;){var n=e[i];n.body&&this.element.removeChild(n.body)}},i}(gt),Et=function(){function t(){this.mats=[],this.size=0;for(var t=0;t<20;t++)this.mats.push(M.create([0,0,0,0,0,0,0,0,0]))}var e=t.prototype;return e.set=function(t,e){0===e?M.set(t,this.mats[0]):M.multiply(this.mats[e-1],t,this.mats[e]),this.size=Math.max(this.size,e+1)},e.push=function(t){0===this.size?M.set(t,this.mats[0]):M.multiply(this.mats[this.size-1],t,this.mats[this.size]),this.size++},e.pop=function(){this.size>0&&this.size--},e.top=function(){return this.mats[this.size-1]},t}(),At=function(t){function i(e){var i;return(i=t.call(this,e)||this).gl=i.element.getContext("experimental-webgl",{antialias:!0,stencil:!1,depth:!1}),i.gl||alert("Sorry your browser do not suppest WebGL!"),i.initVar(),i.setMaxRadius(),i.initShaders(),i.initBuffers(),i.gl.blendEquation(i.gl.FUNC_ADD),i.gl.blendFunc(i.gl.SRC_ALPHA,i.gl.ONE_MINUS_SRC_ALPHA),i.gl.enable(i.gl.BLEND),i.addImg2Body=i.addImg2Body.bind(n(i)),i.name="WebGLRenderer",i}e(i,t);var c=i.prototype;return c.init=function(e){t.prototype.init.call(this,e),this.resize(this.element.width,this.element.height)},c.resize=function(t,e){this.umat[4]=-2,this.umat[7]=1,this.smat[0]=1/t,this.smat[4]=1/e,this.mstack.set(this.umat,0),this.mstack.set(this.smat,1),this.gl.viewport(0,0,t,e),this.element.width=t,this.element.height=e},c.setMaxRadius=function(t){this.circleCanvasURL=this.createCircle(t)},c.getVertexShader=function(){return["uniform vec2 viewport;","attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","uniform mat3 tMat;","varying vec2 vTextureCoord;","varying float alpha;","void main() {","vec3 v = tMat * vec3(aVertexPosition, 1.0);","gl_Position = vec4(v.x, v.y, 0, 1);","vTextureCoord = aTextureCoord;","alpha = tMat[0][2];","}"].join("\n")},c.getFragmentShader=function(){return["precision mediump float;","varying vec2 vTextureCoord;","varying float alpha;","uniform sampler2D uSampler;","uniform vec4 color;","uniform bool useTexture;","uniform vec3 uColor;","void main() {","vec4 textureColor = texture2D(uSampler, vTextureCoord);","gl_FragColor = textureColor * vec4(uColor, 1.0);","gl_FragColor.w *= alpha;","}"].join("\n")},c.initVar=function(){this.mstack=new Et,this.umat=M.create([2,0,1,0,-2,0,-1,1,1]),this.smat=M.create([.01,0,1,0,.01,0,0,0,1]),this.texturebuffers={}},c.blendEquation=function(t){this.gl.blendEquation(this.gl[t])},c.blendFunc=function(t,e){this.gl.blendFunc(this.gl[t],this.gl[e])},c.getShader=function(t,e,i){var n=i?t.createShader(t.FRAGMENT_SHADER):t.createShader(t.VERTEX_SHADER);return t.shaderSource(n,e),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},c.initShaders=function(){var t=this.getShader(this.gl,this.getFragmentShader(),!0),e=this.getShader(this.gl,this.getVertexShader(),!1);this.sprogram=this.gl.createProgram(),this.gl.attachShader(this.sprogram,e),this.gl.attachShader(this.sprogram,t),this.gl.linkProgram(this.sprogram),this.gl.getProgramParameter(this.sprogram,this.gl.LINK_STATUS)||alert("Could not initialise shaders"),this.gl.useProgram(this.sprogram),this.sprogram.vpa=this.gl.getAttribLocation(this.sprogram,"aVertexPosition"),this.sprogram.tca=this.gl.getAttribLocation(this.sprogram,"aTextureCoord"),this.gl.enableVertexAttribArray(this.sprogram.tca),this.gl.enableVertexAttribArray(this.sprogram.vpa),this.sprogram.tMatUniform=this.gl.getUniformLocation(this.sprogram,"tMat"),this.sprogram.samplerUniform=this.gl.getUniformLocation(this.sprogram,"uSampler"),this.sprogram.useTex=this.gl.getUniformLocation(this.sprogram,"useTexture"),this.sprogram.color=this.gl.getUniformLocation(this.sprogram,"uColor"),this.gl.uniform1i(this.sprogram.useTex,1)},c.initBuffers=function(){var t,e;this.unitIBuffer=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER,this.unitIBuffer),this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER,new Uint16Array([0,3,1,0,2,3]),this.gl.STATIC_DRAW);var i=[];for(e=0;e<100;e++)i.push(e);for(t=new Uint16Array(i),this.unitI33=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER,this.unitI33),this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER,t,this.gl.STATIC_DRAW),i=[],e=0;e<100;e++)i.push(e,e+1,e+2);t=new Uint16Array(i),this.stripBuffer=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER,this.stripBuffer),this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER,t,this.gl.STATIC_DRAW)},c.createCircle=function(t){this.circleCanvasRadius=r(y.initValue(t,32));var e=l.createCanvas("circle_canvas",2*this.circleCanvasRadius,2*this.circleCanvasRadius),i=e.getContext("2d");return i.beginPath(),i.arc(this.circleCanvasRadius,this.circleCanvasRadius,this.circleCanvasRadius,0,2*Math.PI,!0),i.closePath(),i.fillStyle="#FFF",i.fill(),e.toDataURL()},c.drawImg2Canvas=function(t){var e=t.body.width,i=t.body.height,n=r(t.body.width),a=r(t.body.height),s=t.body.width/n,o=t.body.height/a;this.texturebuffers[t.data.src]||(this.texturebuffers[t.data.src]=[this.gl.createTexture(),this.gl.createBuffer(),this.gl.createBuffer()]),t.data.texture=this.texturebuffers[t.data.src][0],t.data.vcBuffer=this.texturebuffers[t.data.src][1],t.data.tcBuffer=this.texturebuffers[t.data.src][2],this.gl.bindBuffer(this.gl.ARRAY_BUFFER,t.data.tcBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array([0,0,s,0,0,o,o,o]),this.gl.STATIC_DRAW),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,t.data.vcBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array([0,0,e,0,0,i,e,i]),this.gl.STATIC_DRAW);var h=t.data.canvas.getContext("2d").getImageData(0,0,n,a);this.gl.bindTexture(this.gl.TEXTURE_2D,t.data.texture),this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,this.gl.RGBA,this.gl.UNSIGNED_BYTE,h),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MAG_FILTER,this.gl.LINEAR),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MIN_FILTER,this.gl.LINEAR_MIPMAP_NEAREST),this.gl.generateMipmap(this.gl.TEXTURE_2D),t.data.textureLoaded=!0,t.data.textureWidth=e,t.data.textureHeight=i},c.onProtonUpdate=function(){},c.onParticleCreated=function(t){t.data.textureLoaded=!1,t.data.tmat=M.create(),t.data.tmat[8]=1,t.data.imat=M.create(),t.data.imat[8]=1,t.body?f(t.body,this.addImg2Body,t):(f(this.circleCanvasURL,this.addImg2Body,t),t.data.oldScale=t.radius/this.circleCanvasRadius)},c.addImg2Body=function(t,e){e.dead||(e.body=t,e.data.src=t.src,e.data.canvas=g(t),e.data.oldScale=1,this.drawImg2Canvas(e))},c.onParticleUpdate=function(t){t.data.textureLoaded&&(this.updateMatrix(t),this.gl.uniform3f(this.sprogram.color,t.rgb.r/255,t.rgb.g/255,t.rgb.b/255),this.gl.uniformMatrix3fv(this.sprogram.tMatUniform,!1,this.mstack.top()),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,t.data.vcBuffer),this.gl.vertexAttribPointer(this.sprogram.vpa,2,this.gl.FLOAT,!1,0,0),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,t.data.tcBuffer),this.gl.vertexAttribPointer(this.sprogram.tca,2,this.gl.FLOAT,!1,0,0),this.gl.bindTexture(this.gl.TEXTURE_2D,t.data.texture),this.gl.uniform1i(this.sprogram.samplerUniform,0),this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER,this.unitIBuffer),this.gl.drawElements(this.gl.TRIANGLES,6,this.gl.UNSIGNED_SHORT,0),this.mstack.pop())},c.onParticleDead=function(t){},c.updateMatrix=function(t){var e=a(-t.data.textureWidth/2,-t.data.textureHeight/2),i=a(t.p.x,t.p.y),n=t.rotation*P.PI_180,r=s(n),l=t.scale*t.data.oldScale,c=o(l,l),u=h(e,c);u=h(u,r),u=h(u,i),M.inverse(u,t.data.imat),u[2]=t.alpha,this.mstack.push(u)},c.destroy=function(){t.prototype.destroy.call(this),this.gl=null,this.mstack=null,this.umat=null,this.smat=null,this.texturebuffers=null},i}(gt),Pt=function(t){function i(e){var i;return(i=t.call(this,e)||this).name="CustomRenderer",i}return e(i,t),i}(gt),Tt=function(t){function i(e,i,n,r,a){var s;return s=t.call(this)||this,n-e>=0?(s.x1=e,s.y1=i,s.x2=n,s.y2=r):(s.x1=n,s.y1=r,s.x2=e,s.y2=i),s.dx=s.x2-s.x1,s.dy=s.y2-s.y1,s.minx=Math.min(s.x1,s.x2),s.miny=Math.min(s.y1,s.y2),s.maxx=Math.max(s.x1,s.x2),s.maxy=Math.max(s.y1,s.y2),s.dot=s.x2*s.y1-s.x1*s.y2,s.xxyy=s.dx*s.dx+s.dy*s.dy,s.gradient=s.getGradient(),s.length=s.getLength(),s.direction=y.initValue(a,">"),s}e(i,t);var n=i.prototype;return n.getPosition=function(){return this.random=Math.random(),this.vector.x=this.x1+this.random*this.length*Math.cos(this.gradient),this.vector.y=this.y1+this.random*this.length*Math.sin(this.gradient),this.vector},n.getDirection=function(t,e){var i=this.dy,n=-this.dx;return(i*t+n*e+this.dot)*(0===n?1:n)>0},n.getDistance=function(t,e){return(this.dy*t+-this.dx*e+this.dot)/Math.sqrt(this.xxyy)},n.getSymmetric=function(t){var e=t.getGradient(),i=2*(this.getGradient()-e),n=t.x,r=t.y;return t.x=n*Math.cos(i)-r*Math.sin(i),t.y=n*Math.sin(i)+r*Math.cos(i),t},n.getGradient=function(){return Math.atan2(this.dy,this.dx)},n.rangeOut=function(t){if(Math.abs(this.getGradient())<=P.PI/4){if(t.p.x<=this.maxx&&t.p.x>=this.minx)return!0}else if(t.p.y<=this.maxy&&t.p.y>=this.miny)return!0;return!1},n.getLength=function(){return Math.sqrt(this.dx*this.dx+this.dy*this.dy)},n.crossing=function(t){if("dead"===this.crossType)if(">"===this.direction||"R"===this.direction||"right"===this.direction||"down"===this.direction){if(!this.rangeOut(t))return;this.getDirection(t.p.x,t.p.y)&&(t.dead=!0)}else{if(!this.rangeOut(t))return;this.getDirection(t.p.x,t.p.y)||(t.dead=!0)}else if("bound"===this.crossType){if(!this.rangeOut(t))return;this.getDistance(t.p.x,t.p.y)<=t.radius&&(0===this.dx?t.v.x*=-1:0===this.dy?t.v.y*=-1:this.getSymmetric(t.v))}else"cross"===this.crossType&&this.alert&&(console.error("Sorry, LineZone does not support cross method!"),this.alert=!1)},i}(k),Rt=function(t){function i(e,i,n){var r;return(r=t.call(this)||this).x=e,r.y=i,r.radius=n,r.angle=0,r.center={x:e,y:i},r}e(i,t);var n=i.prototype;return n.getPosition=function(){return this.angle=P.PIx2*Math.random(),this.randomRadius=Math.random()*this.radius,this.vector.x=this.x+this.randomRadius*Math.cos(this.angle),this.vector.y=this.y+this.randomRadius*Math.sin(this.angle),this.vector},n.setCenter=function(t,e){this.center.x=t,this.center.y=e},n.crossing=function(t){var e=t.p.distanceTo(this.center);"dead"===this.crossType?e-t.radius>this.radius&&(t.dead=!0):"bound"===this.crossType?e+t.radius>=this.radius&&this.getSymmetric(t):"cross"===this.crossType&&this.alert&&(console.error("Sorry, CircleZone does not support cross method!"),this.alert=!1)},n.getSymmetric=function(t){var e=t.v.getGradient(),i=2*(this.getGradient(t)-e),n=t.v.x,r=t.v.y;t.v.x=n*Math.cos(i)-r*Math.sin(i),t.v.y=n*Math.sin(i)+r*Math.cos(i)},n.getGradient=function(t){return-P.PI_2+Math.atan2(t.p.y-this.center.y,t.p.x-this.center.x)},i}(k),_t=function(t){function i(e,i,n,r){var a;return(a=t.call(this)||this).x=e,a.y=i,a.width=n,a.height=r,a}e(i,t);var n=i.prototype;return n.getPosition=function(){return this.vector.x=this.x+Math.random()*this.width,this.vector.y=this.y+Math.random()*this.height,this.vector},n.crossing=function(t){"dead"===this.crossType?((t.p.x+t.radiusthis.x+this.width)&&(t.dead=!0),(t.p.y+t.radiusthis.y+this.height)&&(t.dead=!0)):"bound"===this.crossType?(t.p.x-t.radiusthis.x+this.width&&(t.p.x=this.x+this.width-t.radius,t.v.x*=-1),t.p.y-t.radiusthis.y+this.height&&(t.p.y=this.y+this.height-t.radius,t.v.y*=-1)):"cross"===this.crossType&&(t.p.x+t.radiusthis.x+this.width&&t.v.x>=0&&(t.p.x=this.x-t.radius),t.p.y+t.radiusthis.y+this.height&&t.v.y>=0&&(t.p.y=this.y-t.radius))},i}(k),wt=function(t){function i(e,i,n,r){var a;return(a=t.call(this)||this).reset(e,i,n,r),a}e(i,t);var n=i.prototype;return n.reset=function(t,e,i,n){this.imageData=t,this.x=y.initValue(e,0),this.y=y.initValue(i,0),this.d=y.initValue(n,2),this.vectors=[],this.setVectors()},n.setVectors=function(){var t,e,i=this.imageData.width,n=this.imageData.height;for(t=0;t>0)*i+(t>>0));this.imageData.data[r+3]>0&&this.vectors.push({x:t+this.x,y:e+this.y})}return this.vector},n.getBound=function(t,e){var i=4*((e>>0)*this.imageData.width+(t>>0));return this.imageData.data[i+3]>0},n.getPosition=function(){var t=y.getRandFromArray(this.vectors);return this.vector.copy(t)},n.getColor=function(t,e){t-=this.x;var i=4*(((e-=this.y)>>0)*this.imageData.width+(t>>0));return{r:this.imageData.data[i],g:this.imageData.data[i+1],b:this.imageData.data[i+2],a:this.imageData.data[i+3]}},n.crossing=function(t){"dead"===this.crossType?this.getBound(t.p.x-this.x,t.p.y-this.y)?t.dead=!0:t.dead=!1:"bound"===this.crossType&&(this.getBound(t.p.x-this.x,t.p.y-this.y)||t.v.negate())},n.destroy=function(){t.prototype.destroy.call(this),this.imageData=null},i}(k),Ct={addEventListener:function(t,e){t.addEventListener("PROTON_UPDATE_AFTER",(function(){return e()}))},getStyle:function(t){void 0===t&&(t="#ff0000");var e=D.hexToRgb(t);return"rgba("+e.r+", "+e.g+", "+e.b+", 0.5)"},drawZone:function(t,e,i,n){var r=e.getContext("2d"),a=this.getStyle();this.addEventListener(t,(function(){n&&r.clearRect(0,0,e.width,e.height),i instanceof N?(r.beginPath(),r.fillStyle=a,r.arc(i.x,i.y,10,0,2*Math.PI,!0),r.fill(),r.closePath()):i instanceof Tt?(r.beginPath(),r.strokeStyle=a,r.moveTo(i.x1,i.y1),r.lineTo(i.x2,i.y2),r.stroke(),r.closePath()):i instanceof _t?(r.beginPath(),r.strokeStyle=a,r.drawRect(i.x,i.y,i.width,i.height),r.stroke(),r.closePath()):i instanceof Rt&&(r.beginPath(),r.strokeStyle=a,r.arc(i.x,i.y,i.radius,0,2*Math.PI,!0),r.stroke(),r.closePath())}))},drawEmitter:function(t,e,i,n){var r=e.getContext("2d"),a=this.getStyle();this.addEventListener(t,(function(){n&&r.clearRect(0,0,e.width,e.height),r.beginPath(),r.fillStyle=a,r.arc(i.p.x,i.p.y,10,0,2*Math.PI,!0),r.fill(),r.closePath()}))}};return R.Particle=S,R.Pool=b,R.Util=y,R.ColorUtil=D,R.MathUtil=P,R.Vector2D=R.Vector=I,R.Polar2D=R.Polar=V,R.ArraySpan=L,R.Rectangle=U,R.Rate=F,R.ease=C,R.Span=B,R.Mat3=M,R.getSpan=function(t,e,i){return new B(t,e,i)},R.createArraySpan=L.createArraySpan,R.Initialize=R.Init=z,R.Life=R.L=O,R.Position=R.P=H,R.Velocity=R.V=q,R.Mass=R.M=G,R.Radius=R.R=X,R.Body=R.B=Y,R.Behaviour=j,R.Force=R.F=W,R.Attraction=R.A=Z,R.RandomDrift=R.RD=Q,R.Gravity=R.G=K,R.Collision=J,R.CrossZone=$,R.Alpha=tt,R.Scale=R.S=et,R.Rotate=it,R.Color=nt,R.Repulsion=st,R.Cyclone=at,R.GravityWell=ot,R.Emitter=lt,R.BehaviourEmitter=ut,R.FollowEmitter=dt,R.Zone=k,R.LineZone=Tt,R.CircleZone=Rt,R.PointZone=N,R.RectZone=_t,R.ImageZone=wt,R.CanvasRenderer=yt,R.DomRenderer=mt,R.EaselRenderer=vt,R.PixiRenderer=xt,R.PixelRenderer=bt,R.WebGLRenderer=R.WebGlRenderer=At,R.CustomRenderer=Pt,R.Debug=Ct,y.assign(R,C),R})); +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Proton=e()}(this,(function(){"use strict";function t(t,e){for(var i=0;i>e;return t+1},a=function(t,e){return[1,0,0,0,1,0,t,e,1]},s=function(t){var e=Math.cos(t),i=Math.sin(t);return[e,-i,0,i,e,0,0,0,1]},o=function(t,e){return[t,0,0,0,e,0,0,0,1]},h=function(t,e){var i=t[0],n=t[1],r=t[2],a=t[3],s=t[4],o=t[5],h=t[6],l=t[7],c=t[8],u=e[0],d=e[1],p=e[2],f=e[3],g=e[4],y=e[5],m=e[6],v=e[7],b=e[8];return[i*u+n*f+r*m,i*d+n*g+r*v,i*p+n*y+r*b,a*u+s*f+o*m,a*d+s*g+o*v,a*p+s*y+o*b,h*u+l*f+c*m,h*d+l*g+c*v,h*p+l*y+c*b]},l={createCanvas:function(t,e,i,n){void 0===n&&(n="absolute");var r=document.createElement("canvas");return r.id=t,r.width=e,r.height=i,r.style.opacity=0,r.style.position=n,this.transform(r,-500,-500,0,0),r},createDiv:function(t,e,i){var n=document.createElement("div");return n.id=t,n.style.position="absolute",this.resize(n,e,i),n},resize:function(t,e,i){t.style.width=e+"px",t.style.height=i+"px",t.style.marginLeft=-e/2+"px",t.style.marginTop=-i/2+"px"},transform:function(t,e,i,n,r){t.style.willChange="transform";var a="translate("+e+"px, "+i+"px) scale("+n+") rotate("+r+"deg)";this.css3(t,"transform",a)},transform3d:function(t,e,i,n,r){t.style.willChange="transform";var a="translate3d("+e+"px, "+i+"px, 0) scale("+n+") rotate("+r+"deg)";this.css3(t,"backfaceVisibility","hidden"),this.css3(t,"transform",a)},css3:function(t,e,i){var n=e.charAt(0).toUpperCase()+e.substr(1);t.style["Webkit"+n]=i,t.style["Moz"+n]=i,t.style["O"+n]=i,t.style["ms"+n]=i,t.style[""+e]=i}},c={},u={},d=0,p=function(t,e,i){t.drawImage(e,i.x,i.y);var n=t.getImageData(i.x,i.y,i.width,i.height);return t.clearRect(i.x,i.y,i.width,i.height),n},f=function(t,e,i){var n="string"==typeof t?t:t.src;if(c[n])e(c[n],i);else{var r=new Image;r.onload=function(t){c[n]=t.target,e(c[n],i)},r.src=n}},g=function(t,e,i){var n=t.src;if(!u[n]){var a=r(t.width),s=r(t.height),o=l.createCanvas("proton_canvas_cache_"+ ++d,a,s);o.getContext("2d").drawImage(t,0,0,t.width,t.height),u[n]=o}return e&&e(u[n],i),u[n]},y={initValue:function(t,e){return t=null!=t?t:e},isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)},emptyArray:function(t){t&&(t.length=0)},toArray:function(t){return this.isArray(t)?t:[t]},getRandFromArray:function(t){return t?t[Math.floor(t.length*Math.random())]:null},emptyObject:function(t,e){for(var i in void 0===e&&(e=null),t)e&&e.indexOf(i)>-1||delete t[i]},classApply:function(t,e){return void 0===e&&(e=null),e?new(t.bind.apply(t,[null].concat(e))):new t},getImageData:function(t,e,i){return p(t,e,i)},destroyAll:function(t,e){void 0===e&&(e=null);for(var i=t.length;i--;){try{t[i].destroy(e)}catch(t){}delete t[i]}t.length=0},assign:function(t,e){if("function"!=typeof Object.assign){for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i]);return t}return Object.assign(t,e)}},m={},v={_index:0,_cache:{},id:function(t){return void 0!==m[t]&&null!==m[t]||(m[t]=0),t+"_"+m[t]++},getId:function(t){var e=this.getIdFromCache(t);return e||(e="PUID_"+this._index++,this._cache[e]=t,e)},getIdFromCache:function(t){var e,i;for(i in this._cache){if((e=this._cache[i])===t)return i;if(this.isBody(e,t)&&e.src===t.src)return i}return null},isBody:function(t,e){return"object"==typeof t&&"object"==typeof e&&t.isInner&&e.isInner},getTarget:function(t){return this._cache[t]}},b=function(){function t(t){this.total=0,this.cache={}}var e=t.prototype;return e.get=function(t,e,i){var n;return i=i||t.__puid||v.getId(t),(n=this.cache[i]&&this.cache[i].length>0?this.cache[i].pop():this.createOrClone(t,e)).__puid=t.__puid||i,n},e.expire=function(t){return this.getCache(t.__puid).push(t)},e.createOrClone=function(t,e){return this.total++,this.create?this.create(t,e):"function"==typeof t?y.classApply(t,e):t.clone()},e.getCount=function(){var t=0;for(var e in this.cache)t+=this.cache[e].length;return t++},e.destroy=function(){for(var t in this.cache)this.cache[t].length=0,delete this.cache[t]},e.getCache=function(t){return void 0===t&&(t="default"),this.cache[t]||(this.cache[t]=[]),this.cache[t]},t}(),x=function(){function t(t){this.proton=t,this.container=null,this.type=1,this.emitterIndex=0,this.rendererIndex=0}var e=t.prototype;return e.update=function(t,e){this.add(t,e);var i=this.getEmitter(),n=this.getRenderer(),r="";switch(this.type){case 2:r+="emitter:"+this.proton.emitters.length+"
",i&&(r+="em speed:"+i.emitSpeed+"
"),i&&(r+="pos:"+this.getEmitterPos(i));break;case 3:i&&(r+="initializes:"+i.initializes.length+"
"),i&&(r+=''+this.concatArr(i.initializes)+"
"),i&&(r+="behaviours:"+i.behaviours.length+"
"),i&&(r+=''+this.concatArr(i.behaviours)+"
");break;case 4:n&&(r+=n.name+"
"),n&&(r+="body:"+this.getCreatedNumber(n)+"
");break;default:r+="particles:"+this.proton.getCount()+"
",r+="pool:"+this.proton.pool.getCount()+"
",r+="total:"+this.proton.pool.total}this.container.innerHTML=r},e.add=function(t,e){var i=this;if(!this.container){var n,r;switch(this.type=1,this.container=document.createElement("div"),this.container.style.cssText=["position:absolute;bottom:0px;left:0;cursor:pointer;","opacity:0.9;z-index:10000;padding:10px;font-size:12px;font-family:Helvetica,Arial,sans-serif;","width:120px;height:50px;background-color:#002;color:#0ff;"].join(""),this.container.addEventListener("click",(function(t){i.type++,i.type>4&&(i.type=1)}),!1),t){case 2:n="#201",r="#f08";break;case 3:n="#020",r="#0f0";break;default:n="#002",r="#0ff"}this.container.style["background-color"]=n,this.container.style.color=r}this.container.parentNode||(e=e||this.body||document.body).appendChild(this.container)},e.getEmitter=function(){return this.proton.emitters[this.emitterIndex]},e.getRenderer=function(){return this.proton.renderers[this.rendererIndex]},e.concatArr=function(t){var e="";if(!t||!t.length)return e;for(var i=0;i>0)+t:t+Math.random()*(e-t)},randomFloating:function(t,e,i){return this.randomAToB(t-e,t+e,i)},randomColor:function(){return"#"+("00000"+(16777216*Math.random()<<0).toString(16)).slice(-6)},randomZone:function(t){},floor:function(t,e){void 0===e&&(e=4);var i=Math.pow(10,e);return Math.floor(t*i)/i},degreeTransform:function(t){return t*A/180},toColor16:function(t){return"#"+t.toString(16)}},T=function(){function t(t){this.type=t}var e=t.prototype;return e.calculate=function(t,e,i){this.eulerIntegrate(t,e,i)},e.eulerIntegrate=function(t,e,i){t.sleep||(t.old.p.copy(t.p),t.old.v.copy(t.v),t.a.multiplyScalar(1/t.mass),t.v.add(t.a.multiplyScalar(e)),t.p.add(t.old.v.multiplyScalar(e)),i&&t.v.multiplyScalar(i),t.a.clear())},t}(),R=function(){function e(t){this.emitters=[],this.renderers=[],this.time=0,this.now=0,this.then=0,this.elapsed=0,this.stats=new x(this),this.pool=new b(80),this.integrationType=y.initValue(t,e.EULER),this.integrator=new T(this.integrationType),this._fps="auto",this._interval=e.DEFAULT_INTERVAL}var i,n,r,a=e.prototype;return a.addRenderer=function(t){t.init(this),this.renderers.push(t)},a.removeRenderer=function(t){var e=this.renderers.indexOf(t);this.renderers.splice(e,1),t.remove(this)},a.addEmitter=function(t){this.emitters.push(t),t.parent=this,this.dispatchEvent(e.EMITTER_ADDED,t)},a.removeEmitter=function(t){var i=this.emitters.indexOf(t);this.emitters.splice(i,1),t.parent=null,this.dispatchEvent(e.EMITTER_REMOVED,t)},a.update=function(){"auto"===this._fps?(this.dispatchEvent(e.PROTON_UPDATE),e.USE_CLOCK?(this.then||(this.then=(new Date).getTime()),this.now=(new Date).getTime(),this.elapsed=.001*(this.now-this.then),this.amendChangeTabsBug(),this.elapsed>0&&this.emittersUpdate(this.elapsed),this.then=this.now):this.emittersUpdate(e.DEFAULT_INTERVAL),this.dispatchEvent(e.PROTON_UPDATE_AFTER)):(this.then||(this.then=(new Date).getTime()),this.now=(new Date).getTime(),this.elapsed=.001*(this.now-this.then),this.elapsed>this._interval&&(this.dispatchEvent(e.PROTON_UPDATE),this.emittersUpdate(this._interval),this.then=this.now-this.elapsed%this._interval*1e3,this.dispatchEvent(e.PROTON_UPDATE_AFTER)))},a.emittersUpdate=function(t){for(var e=this.emitters.length;e--;)this.emitters[e].update(t)},a.amendChangeTabsBug=function(){e.amendChangeTabsBug&&this.elapsed>.5&&(this.then=(new Date).getTime(),this.elapsed=0)},a.getCount=function(){for(var t=0,e=this.emitters.length;e--;)t+=this.emitters[e].particles.length;return t},a.getAllParticles=function(){for(var t=[],e=this.emitters.length;e--;)t=t.concat(this.emitters[e].particles);return t},a.destroyAllEmitters=function(){y.destroyAll(this.emitters)},a.destroy=function(t){var e=this;void 0===t&&(t=!1);var i=function(){e.time=0,e.then=0,e.pool.destroy(),e.stats.destroy(),y.destroyAll(e.emitters),y.destroyAll(e.renderers,e.getAllParticles()),e.integrator=null,e.renderers=null,e.emitters=null,e.stats=null,e.pool=null};t?setTimeout(i,200):i()},i=e,(n=[{key:"fps",get:function(){return this._fps},set:function(t){this._fps=t,this._interval="auto"===t?e.DEFAULT_INTERVAL:P.floor(1/t,7)}}])&&t(i.prototype,n),r&&t(i,r),e}();R.USE_CLOCK=!1,R.MEASURE=100,R.EULER="euler",R.RK2="runge-kutta2",R.PARTICLE_CREATED="PARTICLE_CREATED",R.PARTICLE_UPDATE="PARTICLE_UPDATE",R.PARTICLE_SLEEP="PARTICLE_SLEEP",R.PARTICLE_DEAD="PARTICLE_DEAD",R.EMITTER_ADDED="EMITTER_ADDED",R.EMITTER_REMOVED="EMITTER_REMOVED",R.PROTON_UPDATE="PROTON_UPDATE",R.PROTON_UPDATE_AFTER="PROTON_UPDATE_AFTER",R.DEFAULT_INTERVAL=.0167,R.amendChangeTabsBug=!0,E.bind(R);var _=function(){function t(t,e,i){void 0===t&&(t=255),void 0===e&&(e=255),void 0===i&&(i=255),this.r=t,this.g=e,this.b=i}return t.prototype.reset=function(){this.r=255,this.g=255,this.b=255},t}(),w={hasProp:function(t,e){return!!t&&void 0!==t[e]},setProp:function(t,e){for(var i in e)t.hasOwnProperty(i)&&(t[i]=Span.getSpanValue(e[i]));return t},setVectorVal:function(t,e){void 0===e&&(e=null),e&&(this.hasProp(e,"x")&&(t.p.x=e.x),this.hasProp(e,"y")&&(t.p.y=e.y),this.hasProp(e,"vx")&&(t.v.x=e.vx),this.hasProp(e,"vy")&&(t.v.y=e.vy),this.hasProp(e,"ax")&&(t.a.x=e.ax),this.hasProp(e,"ay")&&(t.a.y=e.ay),this.hasProp(e,"p")&&t.p.copy(e.p),this.hasProp(e,"v")&&t.v.copy(e.v),this.hasProp(e,"a")&&t.a.copy(e.a),this.hasProp(e,"position")&&t.p.copy(e.position),this.hasProp(e,"velocity")&&t.v.copy(e.velocity),this.hasProp(e,"accelerate")&&t.a.copy(e.accelerate))}},C={easeLinear:function(t){return t},easeInQuad:function(t){return Math.pow(t,2)},easeOutQuad:function(t){return-(Math.pow(t-1,2)-1)},easeInOutQuad:function(t){return(t/=.5)<1?.5*Math.pow(t,2):-.5*((t-=2)*t-2)},easeInCubic:function(t){return Math.pow(t,3)},easeOutCubic:function(t){return Math.pow(t-1,3)+1},easeInOutCubic:function(t){return(t/=.5)<1?.5*Math.pow(t,3):.5*(Math.pow(t-2,3)+2)},easeInQuart:function(t){return Math.pow(t,4)},easeOutQuart:function(t){return-(Math.pow(t-1,4)-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*Math.pow(t,4):-.5*((t-=2)*Math.pow(t,3)-2)},easeInSine:function(t){return 1-Math.cos(t*P.PI_2)},easeOutSine:function(t){return Math.sin(t*P.PI_2)},easeInOutSine:function(t){return-.5*(Math.cos(Math.PI*t)-1)},easeInExpo:function(t){return 0===t?0:Math.pow(2,10*(t-1))},easeOutExpo:function(t){return 1===t?1:1-Math.pow(2,-10*t)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(2-Math.pow(2,-10*--t))},easeInCirc:function(t){return-(Math.sqrt(1-t*t)-1)},easeOutCirc:function(t){return Math.sqrt(1-Math.pow(t-1,2))},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInBack:function(t){var e=1.70158;return t*t*((e+1)*t-e)},easeOutBack:function(t){var e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},getEasing:function(t){return"function"==typeof t?t:this[t]||this.easeLinear}},I=function(){function t(t,e){this.x=t||0,this.y=e||0}var e=t.prototype;return e.set=function(t,e){return this.x=t,this.y=e,this},e.setX=function(t){return this.x=t,this},e.setY=function(t){return this.y=t,this},e.getGradient=function(){return 0!==this.x?Math.atan2(this.y,this.x):this.y>0?P.PI_2:this.y<0?-P.PI_2:void 0},e.copy=function(t){return this.x=t.x,this.y=t.y,this},e.add=function(t,e){return void 0!==e?this.addVectors(t,e):(this.x+=t.x,this.y+=t.y,this)},e.addXY=function(t,e){return this.x+=t,this.y+=e,this},e.addVectors=function(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this},e.sub=function(t,e){return void 0!==e?this.subVectors(t,e):(this.x-=t.x,this.y-=t.y,this)},e.subVectors=function(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this},e.divideScalar=function(t){return 0!==t?(this.x/=t,this.y/=t):this.set(0,0),this},e.multiplyScalar=function(t){return this.x*=t,this.y*=t,this},e.negate=function(){return this.multiplyScalar(-1)},e.dot=function(t){return this.x*t.x+this.y*t.y},e.lengthSq=function(){return this.x*this.x+this.y*this.y},e.length=function(){return Math.sqrt(this.x*this.x+this.y*this.y)},e.normalize=function(){return this.divideScalar(this.length())},e.distanceTo=function(t){return Math.sqrt(this.distanceToSquared(t))},e.rotate=function(t){var e=this.x,i=this.y;return this.x=e*Math.cos(t)+i*Math.sin(t),this.y=-e*Math.sin(t)+i*Math.cos(t),this},e.distanceToSquared=function(t){var e=this.x-t.x,i=this.y-t.y;return e*e+i*i},e.lerp=function(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this},e.equals=function(t){return t.x===this.x&&t.y===this.y},e.clear=function(){return this.x=0,this.y=0,this},e.clone=function(){return new t(this.x,this.y)},t}(),S=function(){function t(t){this.id="",this.old={},this.data={},this.behaviours=[],this.p=[],this.v=[],this.a=[],this.rgb={},this.name="Particle",this.id=v.id(this.name),this.old={},this.data={},this.behaviours=[],this.p=new I,this.v=new I,this.a=new I,this.old.p=new I,this.old.v=new I,this.old.a=new I,this.rgb=new _,this.reset(),t&&w.setProp(this,t)}var e=t.prototype;return e.getDirection=function(){return Math.atan2(this.v.x,-this.v.y)*P.N180_PI},e.reset=function(){return this.life=1/0,this.age=0,this.dead=!1,this.sleep=!1,this.body=null,this.sprite=null,this.parent=null,this.energy=1,this.mass=1,this.radius=10,this.alpha=1,this.scale=1,this.rotation=0,this.color=null,this.p.set(0,0),this.v.set(0,0),this.a.set(0,0),this.old.p.set(0,0),this.old.v.set(0,0),this.old.a.set(0,0),this.easing=C.easeLinear,this.rgb.reset(),y.emptyObject(this.data),this.removeAllBehaviours(),this},e.update=function(t,e){if(this.sleep||(this.age+=t,this.applyBehaviours(t,e)),this.age-1&&(this.behaviours.splice(e,1).parents=null)},e.removeAllBehaviours=function(){y.emptyArray(this.behaviours)},e.destroy=function(){this.removeAllBehaviours(),this.energy=0,this.dead=!0,this.parent=null},t}(),D={hexToRgb:function(t){var e="#"===t.charAt(0)?t.substring(1,7):t;return{r:parseInt(e.substring(0,2),16),g:parseInt(e.substring(2,4),16),b:parseInt(e.substring(4,6),16)}},rgbToHex:function(t){return"rgb("+t.r+", "+t.g+", "+t.b+")"},getHex16FromParticle:function(t){return 65536*Number(t.rgb.r)+256*Number(t.rgb.g)+Number(t.rgb.b)}},V=function(){function t(t,e){this.r=Math.abs(t)||0,this.tha=e||0}var e=t.prototype;return e.set=function(t,e){return this.r=t,this.tha=e,this},e.setR=function(t){return this.r=t,this},e.setTha=function(t){return this.tha=t,this},e.copy=function(t){return this.r=t.r,this.tha=t.tha,this},e.toVector=function(){return new I(this.getX(),this.getY())},e.getX=function(){return this.r*Math.sin(this.tha)},e.getY=function(){return-this.r*Math.cos(this.tha)},e.normalize=function(){return this.r=1,this},e.equals=function(t){return t.r===this.r&&t.tha===this.tha},e.clear=function(){return this.r=0,this.tha=0,this},e.clone=function(){return new t(this.r,this.tha)},t}(),M={create:function(t){var e=new Float32Array(9);return t&&this.set(t,e),e},set:function(t,e){for(var i=0;i<9;i++)e[i]=t[i];return e},multiply:function(t,e,i){var n=t[0],r=t[1],a=t[2],s=t[3],o=t[4],h=t[6],l=t[7],c=e[0],u=e[1],d=e[2],p=e[3],f=e[4],g=e[6],y=e[7];return i[0]=c*n+u*s,i[1]=c*r+u*o,i[2]=a*d,i[3]=p*n+f*s,i[4]=p*r+f*o,i[6]=g*n+y*s+h,i[7]=g*r+y*o+l,i},inverse:function(t,e){var i,n=t[0],r=t[1],a=t[3],s=t[4],o=t[6],h=t[7],l=s,c=-a,u=h*a-s*o;return i=1/(n*l+r*c),e[0]=l*i,e[1]=-r*i,e[3]=c*i,e[4]=n*i,e[6]=u*i,e[7]=(-h*n+r*o)*i,e},multiplyVec2:function(t,e,i){var n=e[0],r=e[1];return i[0]=n*t[0]+r*t[3]+t[6],i[1]=n*t[1]+r*t[4]+t[7],i}},B=function(){function t(t,e,i){y.isArray(t)?(this.isArray=!0,this.a=t):(this.isArray=!1,this.a=y.initValue(t,1),this.b=y.initValue(e,this.a),this.center=y.initValue(i,!1))}return t.prototype.getValue=function(t){return void 0===t&&(t=!1),this.isArray?y.getRandFromArray(this.a):this.center?P.randomFloating(this.a,this.b,t):P.randomAToB(this.a,this.b,t)},t.setSpanValue=function(e,i,n){return e instanceof t?e:void 0===i?new t(e):void 0===n?new t(e,i):new t(e,i,n)},t.getSpanValue=function(e){return e instanceof t?e.getValue():e},t}(),L=function(t){function i(e){var i;return(i=t.call(this)||this)._arr=y.toArray(e),i}return e(i,t),i.prototype.getValue=function(){var t=y.getRandFromArray(this._arr);return"random"===t||"Random"===t?P.randomColor():t},i.createArraySpan=function(t){return t?t instanceof i?t:new i(t):null},i}(B),U=function(){function t(t,e,i,n){this.x=t,this.y=e,this.width=i,this.height=n,this.bottom=this.y+this.height,this.right=this.x+this.width}return t.prototype.contains=function(t,e){return t<=this.right&&t>=this.x&&e<=this.bottom&&e>=this.y},t}(),F=function(){function t(t,e){this.numPan=B.setSpanValue(y.initValue(t,1)),this.timePan=B.setSpanValue(y.initValue(e,1)),this.startTime=0,this.nextTime=0,this.init()}var e=t.prototype;return e.init=function(){this.startTime=0,this.nextTime=this.timePan.getValue()},e.getValue=function(t){return this.startTime+=t,this.startTime>=this.nextTime?(this.startTime=0,this.nextTime=this.timePan.getValue(),1===this.numPan.b?this.numPan.getValue(!1)>.5?1:0:this.numPan.getValue(!0)):0},t}(),z=function(){function t(){}var e=t.prototype;return e.reset=function(){},e.init=function(t,e){e?this.initialize(e):this.initialize(t)},e.initialize=function(t){},t}(),O=function(t){function i(e,i,n){var r;return(r=t.call(this)||this).lifePan=B.setSpanValue(e,i,n),r.name="Life",r}return e(i,t),i.prototype.initialize=function(t){this.lifePan.a===1/0?t.life=1/0:t.life=this.lifePan.getValue()},i}(z),k=function(){function t(){this.vector=new I(0,0),this.random=0,this.crossType="dead",this.alert=!0}var e=t.prototype;return e.getPosition=function(){},e.crossing=function(t){},e.destroy=function(){this.vector=null},t}(),N=function(t){function i(e,i){var n;return(n=t.call(this)||this).x=e,n.y=i,n}e(i,t);var n=i.prototype;return n.getPosition=function(){return this.vector.x=this.x,this.vector.y=this.y,this.vector},n.crossing=function(t){this.alert&&(console.error("Sorry, PointZone does not support crossing method!"),this.alert=!1)},i}(k),H=function(t){function i(e){var i;return(i=t.call(this)||this).zone=y.initValue(e,new N),i.name="Position",i}e(i,t);var n=i.prototype;return n.reset=function(t){this.zone=y.initValue(t,new N)},n.initialize=function(t){this.zone.getPosition(),t.p.x=this.zone.vector.x,t.p.y=this.zone.vector.y},i}(z),q=function(t){function i(e,i,n){var r;return(r=t.call(this)||this).rPan=B.setSpanValue(e),r.thaPan=B.setSpanValue(i),r.type=y.initValue(n,"vector"),r.name="Velocity",r}e(i,t);var n=i.prototype;return n.reset=function(t,e,i){this.rPan=B.setSpanValue(t),this.thaPan=B.setSpanValue(e),this.type=y.initValue(i,"vector")},n.normalizeVelocity=function(t){return t*R.MEASURE},n.initialize=function(t){if("p"===this.type||"P"===this.type||"polar"===this.type){var e=new V(this.normalizeVelocity(this.rPan.getValue()),this.thaPan.getValue()*P.PI_180);t.v.x=e.getX(),t.v.y=e.getY()}else t.v.x=this.normalizeVelocity(this.rPan.getValue()),t.v.y=this.normalizeVelocity(this.thaPan.getValue())},i}(z),G=function(t){function i(e,i,n){var r;return(r=t.call(this)||this).massPan=B.setSpanValue(e,i,n),r.name="Mass",r}return e(i,t),i.prototype.initialize=function(t){t.mass=this.massPan.getValue()},i}(z),X=function(t){function i(e,i,n){var r;return(r=t.call(this)||this).radius=B.setSpanValue(e,i,n),r.name="Radius",r}e(i,t);var n=i.prototype;return n.reset=function(t,e,i){this.radius=B.setSpanValue(t,e,i)},n.initialize=function(t){t.radius=this.radius.getValue(),t.data.oldRadius=t.radius},i}(z),Y=function(t){function i(e,i,n){var r;return(r=t.call(this)||this).image=r.setSpanValue(e),r.w=y.initValue(i,20),r.h=y.initValue(n,r.w),r.name="Body",r}e(i,t);var n=i.prototype;return n.initialize=function(t){var e=this.image.getValue();t.body="string"==typeof e?{width:this.w,height:this.h,src:e,isInner:!0,inner:!0}:e},n.setSpanValue=function(t){return t instanceof L?t:new L(t)},i}(z),j=function(){function t(e,i){this.life=y.initValue(e,1/0),this.easing=C.getEasing(i),this.age=0,this.energy=1,this.dead=!1,this.parents=[],this.id="Behaviour_"+t.id++,this.name="Behaviour"}var e=t.prototype;return e.reset=function(t,e){this.life=y.initValue(t,1/0),this.easing=C.getEasing(e)},e.normalizeForce=function(t){return t.multiplyScalar(R.MEASURE)},e.normalizeValue=function(t){return t*R.MEASURE},e.initialize=function(t){},e.calculate=function(t,e,i){if(this.age+=e,this.age>=this.life||this.dead)this.energy=0,this.dead=!0,this.destroy();else{var n=this.easing(t.age/t.life);this.energy=Math.max(1-n,0)}},e.destroy=function(){for(var t=this.parents.length;t--;)this.parents[t].removeBehaviour(this);this.parents.length=0},t}();j.id=0;var W=function(t){function i(e,i,n,r){var a;return(a=t.call(this,n,r)||this).force=a.normalizeForce(new I(e,i)),a.name="Force",a}e(i,t);var n=i.prototype;return n.reset=function(e,i,n,r){this.force=this.normalizeForce(new I(e,i)),n&&t.prototype.reset.call(this,n,r)},n.applyBehaviour=function(t,e,i){this.calculate(t,e,i),t.a.add(this.force)},i}(j),Z=function(t){function i(e,i,n,r,a){var s;return(s=t.call(this,r,a)||this).targetPosition=y.initValue(e,new I),s.radius=y.initValue(n,1e3),s.force=y.initValue(s.normalizeValue(i),100),s.radiusSq=s.radius*s.radius,s.attractionForce=new I,s.lengthSq=0,s.name="Attraction",s}e(i,t);var n=i.prototype;return n.reset=function(e,i,n,r,a){this.targetPosition=y.initValue(e,new I),this.radius=y.initValue(n,1e3),this.force=y.initValue(this.normalizeValue(i),100),this.radiusSq=this.radius*this.radius,this.attractionForce=new I,this.lengthSq=0,r&&t.prototype.reset.call(this,r,a)},n.applyBehaviour=function(t,e,i){this.calculate(t,e,i),this.attractionForce.copy(this.targetPosition),this.attractionForce.sub(t.p),this.lengthSq=this.attractionForce.lengthSq(),this.lengthSq>4e-5&&this.lengthSq=this.delay&&(t.a.addXY(P.randomAToB(-this.panFoce.x,this.panFoce.x),P.randomAToB(-this.panFoce.y,this.panFoce.y)),t.data.time=0)},i}(j),K=function(t){function i(e,i,n){var r;return(r=t.call(this,0,e,i,n)||this).name="Gravity",r}return e(i,t),i.prototype.reset=function(e,i,n){t.prototype.reset.call(this,0,e,i,n)},i}(W),J=function(t){function i(e,i,n,r,a){var s;return(s=t.call(this,r,a)||this).reset(e,i,n),s.name="Collision",s}e(i,t);var n=i.prototype;return n.reset=function(e,i,n,r,a){this.emitter=y.initValue(e,null),this.mass=y.initValue(i,!0),this.callback=y.initValue(n,null),this.collisionPool=[],this.delta=new I,r&&t.prototype.reset.call(this,r,a)},n.applyBehaviour=function(t,e,i){var n,r,a,s,o,h,l,c=this.emitter?this.emitter.particles.slice(i):this.pool.slice(i),u=c.length;for(l=0;lr;)t-=r,this.update(r);this.stoped=e,this.emitTime=i+Math.max(t,0),this.totalTime=n},n.removeAllParticles=function(){for(var t=this.particles.length;t--;)this.particles[t].dead=!0},n.addSelfInitialize=function(t){t.init?t.init(this):this.initAll()},n.addInitialize=function(){for(var t=arguments.length,e=new Array(t),i=0;i-1&&this.initializes.splice(e,1)},n.removeAllInitializers=function(){y.emptyArray(this.initializes)},n.addBehaviour=function(){for(var t=arguments.length,e=new Array(t),i=0;i=this.life||this.dead)&&this.destroy(),this.emitting(t),this.integrate(t)},n.integrate=function(t){if(this.parent){var e,i,n=1-this.damping;for(this.parent.integrator.calculate(this,t,n),e=this.particles.length-1;e>=0;e--)(i=this.particles[e]).update(t,e),this.parent.integrator.calculate(i,t,n),this.dispatch("PARTICLE_UPDATE",i),i.dead&&(this.dispatch("PARTICLE_DEAD",i),this.parent.pool.expire(i),this.particles.splice(e,1))}},n.dispatch=function(t,e){this.parent&&this.parent.dispatchEvent(t,e),this.bindEvent&&this.dispatchEvent(t,e)},n.emitting=function(t){if("once"===this.totalTime){var e,i=this.rate.getValue(99999);for(i>0&&(this.emitSpeed=i),e=0;e0&&(this.emitSpeed=r),n=0;n-1&&this.selfBehaviours.splice(e,1)},n.update=function(e){if(t.prototype.update.call(this,e),!this.sleep){var i,n=this.selfBehaviours.length;for(i=0;i>0,t.p.y-this.rectangle.y>>0,t)},n.setPixel=function(t,e,i,n){var r=n.rgb;if(!(e<0||e>this.element.width||i<0||i>this.elementwidth)){var a=4*((i>>0)*t.width+(e>>0));t.data[a]=r.r,t.data[a+1]=r.g,t.data[a+2]=r.b,t.data[a+3]=255*n.alpha}},n.onParticleDead=function(t){},n.destroy=function(){t.prototype.destroy.call(this),this.stroke=null,this.context=null,this.imageData=null,this.rectangle=null},i}(gt),xt=function(t){function i(e,i){var n;return(n=t.call(this,e)||this).stroke=i,n.color=!1,n.setColor=!1,n.blendMode=null,n.pool.create=function(t,e){return n.createBody(t,e)},n.setPIXI(window.PIXI),n.name="PixiRenderer",n}e(i,t);var n=i.prototype;return n.setPIXI=function(t){try{ct=t||{Sprite:{}},this.createFromImage=ct.Sprite.from||ct.Sprite.fromImage}catch(t){}},n.onProtonUpdate=function(){},n.onParticleCreated=function(t){t.body?t.body=this.pool.get(t.body,t):t.body=this.pool.get(this.circleConf,t),this.blendMode&&(t.body.blendMode=this.blendMode),this.element.addChild(t.body)},n.onParticleUpdate=function(t){this.transform(t,t.body),!0!==this.setColor&&!0!==this.color||(t.body.tint=D.getHex16FromParticle(t))},n.onParticleDead=function(t){this.element.removeChild(t.body),this.pool.expire(t.body),t.body=null},n.transform=function(t,e){e.x=t.p.x,e.y=t.p.y,e.alpha=t.alpha,e.scale.x=t.scale,e.scale.y=t.scale,e.rotation=t.rotation*P.PI_180},n.createBody=function(t,e){return t.isCircle?this.createCircle(e):this.createSprite(t)},n.createSprite=function(t){var e=t.isInner?this.createFromImage(t.src):new ct.Sprite(t);return e.anchor.x=.5,e.anchor.y=.5,e},n.createCircle=function(t){var e=new ct.Graphics;if(this.stroke){var i=ft(this.stroke)?this.stroke:0;e.beginStroke(i)}return e.beginFill(t.color||36077),e.drawCircle(0,0,t.radius),e.endFill(),e},n.destroy=function(e){t.prototype.destroy.call(this);for(var i=e.length;i--;){var n=e[i];n.body&&this.element.removeChild(n.body)}},i}(gt),Et=function(){function t(){this.mats=[],this.size=0;for(var t=0;t<20;t++)this.mats.push(M.create([0,0,0,0,0,0,0,0,0]))}var e=t.prototype;return e.set=function(t,e){0===e?M.set(t,this.mats[0]):M.multiply(this.mats[e-1],t,this.mats[e]),this.size=Math.max(this.size,e+1)},e.push=function(t){0===this.size?M.set(t,this.mats[0]):M.multiply(this.mats[this.size-1],t,this.mats[this.size]),this.size++},e.pop=function(){this.size>0&&this.size--},e.top=function(){return this.mats[this.size-1]},t}(),At=function(t){function i(e){var i;return(i=t.call(this,e)||this).gl=i.element.getContext("experimental-webgl",{antialias:!0,stencil:!1,depth:!1}),i.gl||alert("Sorry your browser do not suppest WebGL!"),i.initVar(),i.setMaxRadius(),i.initShaders(),i.initBuffers(),i.gl.blendEquation(i.gl.FUNC_ADD),i.gl.blendFunc(i.gl.SRC_ALPHA,i.gl.ONE_MINUS_SRC_ALPHA),i.gl.enable(i.gl.BLEND),i.addImg2Body=i.addImg2Body.bind(n(i)),i.name="WebGLRenderer",i}e(i,t);var c=i.prototype;return c.init=function(e){t.prototype.init.call(this,e),this.resize(this.element.width,this.element.height)},c.resize=function(t,e){this.umat[4]=-2,this.umat[7]=1,this.smat[0]=1/t,this.smat[4]=1/e,this.mstack.set(this.umat,0),this.mstack.set(this.smat,1),this.gl.viewport(0,0,t,e),this.element.width=t,this.element.height=e},c.setMaxRadius=function(t){this.circleCanvasURL=this.createCircle(t)},c.getVertexShader=function(){return["uniform vec2 viewport;","attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","uniform mat3 tMat;","varying vec2 vTextureCoord;","varying float alpha;","void main() {","vec3 v = tMat * vec3(aVertexPosition, 1.0);","gl_Position = vec4(v.x, v.y, 0, 1);","vTextureCoord = aTextureCoord;","alpha = tMat[0][2];","}"].join("\n")},c.getFragmentShader=function(){return["precision mediump float;","varying vec2 vTextureCoord;","varying float alpha;","uniform sampler2D uSampler;","uniform vec4 color;","uniform bool useTexture;","uniform vec3 uColor;","void main() {","vec4 textureColor = texture2D(uSampler, vTextureCoord);","gl_FragColor = textureColor * vec4(uColor, 1.0);","gl_FragColor.w *= alpha;","}"].join("\n")},c.initVar=function(){this.mstack=new Et,this.umat=M.create([2,0,1,0,-2,0,-1,1,1]),this.smat=M.create([.01,0,1,0,.01,0,0,0,1]),this.texturebuffers={}},c.blendEquation=function(t){this.gl.blendEquation(this.gl[t])},c.blendFunc=function(t,e){this.gl.blendFunc(this.gl[t],this.gl[e])},c.getShader=function(t,e,i){var n=i?t.createShader(t.FRAGMENT_SHADER):t.createShader(t.VERTEX_SHADER);return t.shaderSource(n,e),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},c.initShaders=function(){var t=this.getShader(this.gl,this.getFragmentShader(),!0),e=this.getShader(this.gl,this.getVertexShader(),!1);this.sprogram=this.gl.createProgram(),this.gl.attachShader(this.sprogram,e),this.gl.attachShader(this.sprogram,t),this.gl.linkProgram(this.sprogram),this.gl.getProgramParameter(this.sprogram,this.gl.LINK_STATUS)||alert("Could not initialise shaders"),this.gl.useProgram(this.sprogram),this.sprogram.vpa=this.gl.getAttribLocation(this.sprogram,"aVertexPosition"),this.sprogram.tca=this.gl.getAttribLocation(this.sprogram,"aTextureCoord"),this.gl.enableVertexAttribArray(this.sprogram.tca),this.gl.enableVertexAttribArray(this.sprogram.vpa),this.sprogram.tMatUniform=this.gl.getUniformLocation(this.sprogram,"tMat"),this.sprogram.samplerUniform=this.gl.getUniformLocation(this.sprogram,"uSampler"),this.sprogram.useTex=this.gl.getUniformLocation(this.sprogram,"useTexture"),this.sprogram.color=this.gl.getUniformLocation(this.sprogram,"uColor"),this.gl.uniform1i(this.sprogram.useTex,1)},c.initBuffers=function(){var t,e;this.unitIBuffer=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER,this.unitIBuffer),this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER,new Uint16Array([0,3,1,0,2,3]),this.gl.STATIC_DRAW);var i=[];for(e=0;e<100;e++)i.push(e);for(t=new Uint16Array(i),this.unitI33=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER,this.unitI33),this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER,t,this.gl.STATIC_DRAW),i=[],e=0;e<100;e++)i.push(e,e+1,e+2);t=new Uint16Array(i),this.stripBuffer=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER,this.stripBuffer),this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER,t,this.gl.STATIC_DRAW)},c.createCircle=function(t){this.circleCanvasRadius=r(y.initValue(t,32));var e=l.createCanvas("circle_canvas",2*this.circleCanvasRadius,2*this.circleCanvasRadius),i=e.getContext("2d");return i.beginPath(),i.arc(this.circleCanvasRadius,this.circleCanvasRadius,this.circleCanvasRadius,0,2*Math.PI,!0),i.closePath(),i.fillStyle="#FFF",i.fill(),e.toDataURL()},c.drawImg2Canvas=function(t){var e=t.body.width,i=t.body.height,n=r(t.body.width),a=r(t.body.height),s=t.body.width/n,o=t.body.height/a;this.texturebuffers[t.data.src]||(this.texturebuffers[t.data.src]=[this.gl.createTexture(),this.gl.createBuffer(),this.gl.createBuffer()]),t.data.texture=this.texturebuffers[t.data.src][0],t.data.vcBuffer=this.texturebuffers[t.data.src][1],t.data.tcBuffer=this.texturebuffers[t.data.src][2],this.gl.bindBuffer(this.gl.ARRAY_BUFFER,t.data.tcBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array([0,0,s,0,0,o,o,o]),this.gl.STATIC_DRAW),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,t.data.vcBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array([0,0,e,0,0,i,e,i]),this.gl.STATIC_DRAW);var h=t.data.canvas.getContext("2d").getImageData(0,0,n,a);this.gl.bindTexture(this.gl.TEXTURE_2D,t.data.texture),this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,this.gl.RGBA,this.gl.UNSIGNED_BYTE,h),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MAG_FILTER,this.gl.LINEAR),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MIN_FILTER,this.gl.LINEAR_MIPMAP_NEAREST),this.gl.generateMipmap(this.gl.TEXTURE_2D),t.data.textureLoaded=!0,t.data.textureWidth=e,t.data.textureHeight=i},c.onProtonUpdate=function(){},c.onParticleCreated=function(t){t.data.textureLoaded=!1,t.data.tmat=M.create(),t.data.tmat[8]=1,t.data.imat=M.create(),t.data.imat[8]=1,t.body?f(t.body,this.addImg2Body,t):(f(this.circleCanvasURL,this.addImg2Body,t),t.data.oldScale=t.radius/this.circleCanvasRadius)},c.addImg2Body=function(t,e){e.dead||(e.body=t,e.data.src=t.src,e.data.canvas=g(t),e.data.oldScale=1,this.drawImg2Canvas(e))},c.onParticleUpdate=function(t){t.data.textureLoaded&&(this.updateMatrix(t),this.gl.uniform3f(this.sprogram.color,t.rgb.r/255,t.rgb.g/255,t.rgb.b/255),this.gl.uniformMatrix3fv(this.sprogram.tMatUniform,!1,this.mstack.top()),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,t.data.vcBuffer),this.gl.vertexAttribPointer(this.sprogram.vpa,2,this.gl.FLOAT,!1,0,0),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,t.data.tcBuffer),this.gl.vertexAttribPointer(this.sprogram.tca,2,this.gl.FLOAT,!1,0,0),this.gl.bindTexture(this.gl.TEXTURE_2D,t.data.texture),this.gl.uniform1i(this.sprogram.samplerUniform,0),this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER,this.unitIBuffer),this.gl.drawElements(this.gl.TRIANGLES,6,this.gl.UNSIGNED_SHORT,0),this.mstack.pop())},c.onParticleDead=function(t){},c.updateMatrix=function(t){var e=a(-t.data.textureWidth/2,-t.data.textureHeight/2),i=a(t.p.x,t.p.y),n=t.rotation*P.PI_180,r=s(n),l=t.scale*t.data.oldScale,c=o(l,l),u=h(e,c);u=h(u,r),u=h(u,i),M.inverse(u,t.data.imat),u[2]=t.alpha,this.mstack.push(u)},c.destroy=function(){t.prototype.destroy.call(this),this.gl=null,this.mstack=null,this.umat=null,this.smat=null,this.texturebuffers=null},i}(gt),Pt=function(t){function i(e){var i;return(i=t.call(this,e)||this).name="CustomRenderer",i}return e(i,t),i}(gt),Tt=function(t){function i(e,i,n,r,a){var s;return s=t.call(this)||this,n-e>=0?(s.x1=e,s.y1=i,s.x2=n,s.y2=r):(s.x1=n,s.y1=r,s.x2=e,s.y2=i),s.dx=s.x2-s.x1,s.dy=s.y2-s.y1,s.minx=Math.min(s.x1,s.x2),s.miny=Math.min(s.y1,s.y2),s.maxx=Math.max(s.x1,s.x2),s.maxy=Math.max(s.y1,s.y2),s.dot=s.x2*s.y1-s.x1*s.y2,s.xxyy=s.dx*s.dx+s.dy*s.dy,s.gradient=s.getGradient(),s.length=s.getLength(),s.direction=y.initValue(a,">"),s}e(i,t);var n=i.prototype;return n.getPosition=function(){return this.random=Math.random(),this.vector.x=this.x1+this.random*this.length*Math.cos(this.gradient),this.vector.y=this.y1+this.random*this.length*Math.sin(this.gradient),this.vector},n.getDirection=function(t,e){var i=this.dy,n=-this.dx;return(i*t+n*e+this.dot)*(0===n?1:n)>0},n.getDistance=function(t,e){return(this.dy*t+-this.dx*e+this.dot)/Math.sqrt(this.xxyy)},n.getSymmetric=function(t){var e=t.getGradient(),i=2*(this.getGradient()-e),n=t.x,r=t.y;return t.x=n*Math.cos(i)-r*Math.sin(i),t.y=n*Math.sin(i)+r*Math.cos(i),t},n.getGradient=function(){return Math.atan2(this.dy,this.dx)},n.rangeOut=function(t){if(Math.abs(this.getGradient())<=P.PI/4){if(t.p.x<=this.maxx&&t.p.x>=this.minx)return!0}else if(t.p.y<=this.maxy&&t.p.y>=this.miny)return!0;return!1},n.getLength=function(){return Math.sqrt(this.dx*this.dx+this.dy*this.dy)},n.crossing=function(t){if("dead"===this.crossType)if(">"===this.direction||"R"===this.direction||"right"===this.direction||"down"===this.direction){if(!this.rangeOut(t))return;this.getDirection(t.p.x,t.p.y)&&(t.dead=!0)}else{if(!this.rangeOut(t))return;this.getDirection(t.p.x,t.p.y)||(t.dead=!0)}else if("bound"===this.crossType){if(!this.rangeOut(t))return;this.getDistance(t.p.x,t.p.y)<=t.radius&&(0===this.dx?t.v.x*=-1:0===this.dy?t.v.y*=-1:this.getSymmetric(t.v))}else"cross"===this.crossType&&this.alert&&(console.error("Sorry, LineZone does not support cross method!"),this.alert=!1)},i}(k),Rt=function(t){function i(e,i,n){var r;return(r=t.call(this)||this).x=e,r.y=i,r.radius=n,r.angle=0,r.center={x:e,y:i},r}e(i,t);var n=i.prototype;return n.getPosition=function(){return this.angle=P.PIx2*Math.random(),this.randomRadius=Math.random()*this.radius,this.vector.x=this.x+this.randomRadius*Math.cos(this.angle),this.vector.y=this.y+this.randomRadius*Math.sin(this.angle),this.vector},n.setCenter=function(t,e){this.center.x=t,this.center.y=e},n.crossing=function(t){var e=t.p.distanceTo(this.center);"dead"===this.crossType?e-t.radius>this.radius&&(t.dead=!0):"bound"===this.crossType?e+t.radius>=this.radius&&this.getSymmetric(t):"cross"===this.crossType&&this.alert&&(console.error("Sorry, CircleZone does not support cross method!"),this.alert=!1)},n.getSymmetric=function(t){var e=t.v.getGradient(),i=2*(this.getGradient(t)-e),n=t.v.x,r=t.v.y;t.v.x=n*Math.cos(i)-r*Math.sin(i),t.v.y=n*Math.sin(i)+r*Math.cos(i)},n.getGradient=function(t){return-P.PI_2+Math.atan2(t.p.y-this.center.y,t.p.x-this.center.x)},i}(k),_t=function(t){function i(e,i,n,r){var a;return(a=t.call(this)||this).x=e,a.y=i,a.width=n,a.height=r,a}e(i,t);var n=i.prototype;return n.getPosition=function(){return this.vector.x=this.x+Math.random()*this.width,this.vector.y=this.y+Math.random()*this.height,this.vector},n.crossing=function(t){"dead"===this.crossType?((t.p.x+t.radiusthis.x+this.width)&&(t.dead=!0),(t.p.y+t.radiusthis.y+this.height)&&(t.dead=!0)):"bound"===this.crossType?(t.p.x-t.radiusthis.x+this.width&&(t.p.x=this.x+this.width-t.radius,t.v.x*=-1),t.p.y-t.radiusthis.y+this.height&&(t.p.y=this.y+this.height-t.radius,t.v.y*=-1)):"cross"===this.crossType&&(t.p.x+t.radiusthis.x+this.width&&t.v.x>=0&&(t.p.x=this.x-t.radius),t.p.y+t.radiusthis.y+this.height&&t.v.y>=0&&(t.p.y=this.y-t.radius))},i}(k),wt=function(t){function i(e,i,n,r){var a;return(a=t.call(this)||this).reset(e,i,n,r),a}e(i,t);var n=i.prototype;return n.reset=function(t,e,i,n){this.imageData=t,this.x=y.initValue(e,0),this.y=y.initValue(i,0),this.d=y.initValue(n,2),this.vectors=[],this.setVectors()},n.setVectors=function(){var t,e,i=this.imageData.width,n=this.imageData.height;for(t=0;t>0)*i+(t>>0));this.imageData.data[r+3]>0&&this.vectors.push({x:t+this.x,y:e+this.y})}return this.vector},n.getBound=function(t,e){var i=4*((e>>0)*this.imageData.width+(t>>0));return this.imageData.data[i+3]>0},n.getPosition=function(){var t=y.getRandFromArray(this.vectors);return this.vector.copy(t)},n.getColor=function(t,e){t-=this.x;var i=4*(((e-=this.y)>>0)*this.imageData.width+(t>>0));return{r:this.imageData.data[i],g:this.imageData.data[i+1],b:this.imageData.data[i+2],a:this.imageData.data[i+3]}},n.crossing=function(t){"dead"===this.crossType?this.getBound(t.p.x-this.x,t.p.y-this.y)?t.dead=!0:t.dead=!1:"bound"===this.crossType&&(this.getBound(t.p.x-this.x,t.p.y-this.y)||t.v.negate())},n.destroy=function(){t.prototype.destroy.call(this),this.imageData=null},i}(k),Ct={addEventListener:function(t,e){t.addEventListener("PROTON_UPDATE_AFTER",(function(){return e()}))},getStyle:function(t){void 0===t&&(t="#ff0000");var e=D.hexToRgb(t);return"rgba("+e.r+", "+e.g+", "+e.b+", 0.5)"},drawZone:function(t,e,i,n){var r=e.getContext("2d"),a=this.getStyle();this.addEventListener(t,(function(){n&&r.clearRect(0,0,e.width,e.height),i instanceof N?(r.beginPath(),r.fillStyle=a,r.arc(i.x,i.y,10,0,2*Math.PI,!0),r.fill(),r.closePath()):i instanceof Tt?(r.beginPath(),r.strokeStyle=a,r.moveTo(i.x1,i.y1),r.lineTo(i.x2,i.y2),r.stroke(),r.closePath()):i instanceof _t?(r.beginPath(),r.strokeStyle=a,r.drawRect(i.x,i.y,i.width,i.height),r.stroke(),r.closePath()):i instanceof Rt&&(r.beginPath(),r.strokeStyle=a,r.arc(i.x,i.y,i.radius,0,2*Math.PI,!0),r.stroke(),r.closePath())}))},drawEmitter:function(t,e,i,n){var r=e.getContext("2d"),a=this.getStyle();this.addEventListener(t,(function(){n&&r.clearRect(0,0,e.width,e.height),r.beginPath(),r.fillStyle=a,r.arc(i.p.x,i.p.y,10,0,2*Math.PI,!0),r.fill(),r.closePath()}))}};return R.Particle=S,R.Pool=b,R.Util=y,R.ColorUtil=D,R.MathUtil=P,R.Vector2D=R.Vector=I,R.Polar2D=R.Polar=V,R.ArraySpan=L,R.Rectangle=U,R.Rate=F,R.ease=C,R.Span=B,R.Mat3=M,R.getSpan=function(t,e,i){return new B(t,e,i)},R.createArraySpan=L.createArraySpan,R.Initialize=R.Init=z,R.Life=R.L=O,R.Position=R.P=H,R.Velocity=R.V=q,R.Mass=R.M=G,R.Radius=R.R=X,R.Body=R.B=Y,R.Behaviour=j,R.Force=R.F=W,R.Attraction=R.A=Z,R.RandomDrift=R.RD=Q,R.Gravity=R.G=K,R.Collision=J,R.CrossZone=$,R.Alpha=tt,R.Scale=R.S=et,R.Rotate=it,R.Color=nt,R.Repulsion=st,R.Cyclone=at,R.GravityWell=ot,R.Emitter=lt,R.BehaviourEmitter=ut,R.FollowEmitter=dt,R.Zone=k,R.LineZone=Tt,R.CircleZone=Rt,R.PointZone=N,R.RectZone=_t,R.ImageZone=wt,R.CanvasRenderer=yt,R.DomRenderer=mt,R.EaselRenderer=vt,R.PixiRenderer=xt,R.PixelRenderer=bt,R.WebGLRenderer=R.WebGlRenderer=At,R.CustomRenderer=Pt,R.Debug=Ct,y.assign(R,C),R})); //# sourceMappingURL=proton.min.js.map diff --git a/build/proton.min.js.map b/build/proton.min.js.map index d614ed9..6689f4b 100755 --- a/build/proton.min.js.map +++ b/build/proton.min.js.map @@ -1 +1 @@ -{"version":3,"file":"proton.min.js","sources":["../src/utils/WebGLUtil.js","../src/utils/DomUtil.js","../src/utils/ImgUtil.js","../src/utils/Util.js","../src/utils/Puid.js","../src/core/Pool.js","../src/debug/Stats.js","../src/events/EventDispatcher.js","../src/math/MathUtil.js","../src/math/Integration.js","../src/core/Proton.js","../src/utils/Rgb.js","../src/utils/PropUtil.js","../src/math/ease.js","../src/math/Vector2D.js","../src/core/Particle.js","../src/utils/ColorUtil.js","../src/math/Polar2D.js","../src/math/Mat3.js","../src/math/Span.js","../src/math/ArraySpan.js","../src/math/Rectangle.js","../src/initialize/Rate.js","../src/initialize/Initialize.js","../src/initialize/Life.js","../src/zone/Zone.js","../src/zone/PointZone.js","../src/initialize/Position.js","../src/initialize/Velocity.js","../src/initialize/Mass.js","../src/initialize/Radius.js","../src/initialize/Body.js","../src/behaviour/Behaviour.js","../src/behaviour/Force.js","../src/behaviour/Attraction.js","../src/behaviour/RandomDrift.js","../src/behaviour/Gravity.js","../src/behaviour/Collision.js","../src/behaviour/CrossZone.js","../src/behaviour/Alpha.js","../src/behaviour/Scale.js","../src/behaviour/Rotate.js","../src/behaviour/Color.js","../src/behaviour/Cyclone.js","../src/behaviour/Repulsion.js","../src/behaviour/GravityWell.js","../src/initialize/InitializeUtil.js","../src/emitter/Emitter.js","../src/render/PixiRenderer.js","../src/emitter/BehaviourEmitter.js","../src/emitter/FollowEmitter.js","../src/utils/Types.js","../src/render/BaseRenderer.js","../src/render/CanvasRenderer.js","../src/render/DomRenderer.js","../src/render/EaselRenderer.js","../src/render/PixelRenderer.js","../src/utils/MStack.js","../src/render/WebGLRenderer.js","../src/render/CustomRenderer.js","../src/zone/LineZone.js","../src/zone/CircleZone.js","../src/zone/RectZone.js","../src/zone/ImageZone.js","../src/debug/Debug.js","../src/index.js"],"sourcesContent":["export default {\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method ipot\n *\n * @todo add description\n * @todo add length description\n *\n * @param {Number} length\n *\n * @return {Boolean}\n */\n ipot(length) {\n return (length & (length - 1)) === 0;\n },\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method nhpot\n *\n * @todo add description\n * @todo add length description\n *\n * @param {Number} length\n *\n * @return {Number}\n */\n nhpot(length) {\n --length;\n for (let i = 1; i < 32; i <<= 1) {\n length = length | (length >> i);\n }\n\n return length + 1;\n },\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method makeTranslation\n *\n * @todo add description\n * @todo add tx, ty description\n * @todo add return description\n *\n * @param {Number} tx either 0 or 1\n * @param {Number} ty either 0 or 1\n *\n * @return {Object}\n */\n makeTranslation(tx, ty) {\n return [1, 0, 0, 0, 1, 0, tx, ty, 1];\n },\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method makeRotation\n *\n * @todo add description\n * @todo add return description\n *\n * @param {Number} angleInRadians\n *\n * @return {Object}\n */\n makeRotation(angleInRadians) {\n let c = Math.cos(angleInRadians);\n let s = Math.sin(angleInRadians);\n\n return [c, -s, 0, s, c, 0, 0, 0, 1];\n },\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method makeScale\n *\n * @todo add description\n * @todo add tx, ty description\n * @todo add return description\n *\n * @param {Number} sx either 0 or 1\n * @param {Number} sy either 0 or 1\n *\n * @return {Object}\n */\n makeScale(sx, sy) {\n return [sx, 0, 0, 0, sy, 0, 0, 0, 1];\n },\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method matrixMultiply\n *\n * @todo add description\n * @todo add a, b description\n * @todo add return description\n *\n * @param {Object} a\n * @param {Object} b\n *\n * @return {Object}\n */\n matrixMultiply(a, b) {\n let a00 = a[0 * 3 + 0];\n let a01 = a[0 * 3 + 1];\n let a02 = a[0 * 3 + 2];\n let a10 = a[1 * 3 + 0];\n let a11 = a[1 * 3 + 1];\n let a12 = a[1 * 3 + 2];\n let a20 = a[2 * 3 + 0];\n let a21 = a[2 * 3 + 1];\n let a22 = a[2 * 3 + 2];\n let b00 = b[0 * 3 + 0];\n let b01 = b[0 * 3 + 1];\n let b02 = b[0 * 3 + 2];\n let b10 = b[1 * 3 + 0];\n let b11 = b[1 * 3 + 1];\n let b12 = b[1 * 3 + 2];\n let b20 = b[2 * 3 + 0];\n let b21 = b[2 * 3 + 1];\n let b22 = b[2 * 3 + 2];\n\n return [\n a00 * b00 + a01 * b10 + a02 * b20,\n a00 * b01 + a01 * b11 + a02 * b21,\n a00 * b02 + a01 * b12 + a02 * b22,\n a10 * b00 + a11 * b10 + a12 * b20,\n a10 * b01 + a11 * b11 + a12 * b21,\n a10 * b02 + a11 * b12 + a12 * b22,\n a20 * b00 + a21 * b10 + a22 * b20,\n a20 * b01 + a21 * b11 + a22 * b21,\n a20 * b02 + a21 * b12 + a22 * b22\n ];\n }\n};\n","export default {\n /**\n * Creates and returns a new canvas. The opacity is by default set to 0\n *\n * @memberof Proton#Proton.DomUtil\n * @method createCanvas\n *\n * @param {String} $id the canvas' id\n * @param {Number} $width the canvas' width\n * @param {Number} $height the canvas' height\n * @param {String} [$position=absolute] the canvas' position, default is 'absolute'\n *\n * @return {Object}\n */\n createCanvas(id, width, height, position = \"absolute\") {\n const dom = document.createElement(\"canvas\");\n\n dom.id = id;\n dom.width = width;\n dom.height = height;\n dom.style.opacity = 0;\n dom.style.position = position;\n this.transform(dom, -500, -500, 0, 0);\n\n return dom;\n },\n\n createDiv(id, width, height) {\n const dom = document.createElement(\"div\");\n\n dom.id = id;\n dom.style.position = \"absolute\";\n this.resize(dom, width, height);\n\n return dom;\n },\n\n resize(dom, width, height) {\n dom.style.width = width + \"px\";\n dom.style.height = height + \"px\";\n dom.style.marginLeft = -width / 2 + \"px\";\n dom.style.marginTop = -height / 2 + \"px\";\n },\n\n /**\n * Adds a transform: translate(), scale(), rotate() to a given div dom for all browsers\n *\n * @memberof Proton#Proton.DomUtil\n * @method transform\n *\n * @param {HTMLDivElement} div\n * @param {Number} $x\n * @param {Number} $y\n * @param {Number} $scale\n * @param {Number} $rotate\n */\n transform(div, x, y, scale, rotate) {\n div.style.willChange = \"transform\";\n const transform = `translate(${x}px, ${y}px) scale(${scale}) rotate(${rotate}deg)`;\n this.css3(div, \"transform\", transform);\n },\n\n transform3d(div, x, y, scale, rotate) {\n div.style.willChange = \"transform\";\n const transform = `translate3d(${x}px, ${y}px, 0) scale(${scale}) rotate(${rotate}deg)`;\n this.css3(div, \"backfaceVisibility\", \"hidden\");\n this.css3(div, \"transform\", transform);\n },\n\n css3(div, key, val) {\n const bkey = key.charAt(0).toUpperCase() + key.substr(1);\n\n div.style[`Webkit${bkey}`] = val;\n div.style[`Moz${bkey}`] = val;\n div.style[`O${bkey}`] = val;\n div.style[`ms${bkey}`] = val;\n div.style[`${key}`] = val;\n }\n};\n","import WebGLUtil from \"./WebGLUtil\";\nimport DomUtil from \"./DomUtil\";\n\nconst imgsCache = {};\nconst canvasCache = {};\nlet canvasId = 0;\n\nexport default {\n /**\n * This will get the image data. It could be necessary to create a Proton.Zone.\n *\n * @memberof Proton#Proton.Util\n * @method getImageData\n *\n * @param {HTMLCanvasElement} context any canvas, must be a 2dContext 'canvas.getContext('2d')'\n * @param {Object} image could be any dom image, e.g. document.getElementById('thisIsAnImgTag');\n * @param {Proton.Rectangle} rect\n */\n getImageData(context, image, rect) {\n context.drawImage(image, rect.x, rect.y);\n const imagedata = context.getImageData(rect.x, rect.y, rect.width, rect.height);\n context.clearRect(rect.x, rect.y, rect.width, rect.height);\n\n return imagedata;\n },\n\n /**\n * @memberof Proton#Proton.Util\n * @method getImgFromCache\n *\n * @todo add description\n * @todo describe func\n *\n * @param {Mixed} img\n * @param {Proton.Particle} particle\n * @param {Boolean} drawCanvas set to true if a canvas should be saved into particle.data.canvas\n * @param {Boolean} func\n */\n getImgFromCache(img, callback, param) {\n const src = typeof img === \"string\" ? img : img.src;\n\n if (imgsCache[src]) {\n callback(imgsCache[src], param);\n } else {\n const image = new Image();\n image.onload = e => {\n imgsCache[src] = e.target;\n callback(imgsCache[src], param);\n };\n\n image.src = src;\n }\n },\n\n getCanvasFromCache(img, callback, param) {\n const src = img.src;\n\n if (!canvasCache[src]) {\n const width = WebGLUtil.nhpot(img.width);\n const height = WebGLUtil.nhpot(img.height);\n\n const canvas = DomUtil.createCanvas(`proton_canvas_cache_${++canvasId}`, width, height);\n const context = canvas.getContext(\"2d\");\n context.drawImage(img, 0, 0, img.width, img.height);\n\n canvasCache[src] = canvas;\n }\n\n callback && callback(canvasCache[src], param);\n\n return canvasCache[src];\n }\n};\n","import ImgUtil from \"./ImgUtil\";\n\nexport default {\n /**\n * Returns the default if the value is null or undefined\n *\n * @memberof Proton#Proton.Util\n * @method initValue\n *\n * @param {Mixed} value a specific value, could be everything but null or undefined\n * @param {Mixed} defaults the default if the value is null or undefined\n */\n initValue(value, defaults) {\n value = value !== null && value !== undefined ? value : defaults;\n return value;\n },\n\n /**\n * Checks if the value is a valid array\n *\n * @memberof Proton#Proton.Util\n * @method isArray\n *\n * @param {Array} value Any array\n *\n * @returns {Boolean}\n */\n isArray(value) {\n return Object.prototype.toString.call(value) === \"[object Array]\";\n },\n\n /**\n * Destroyes the given array\n *\n * @memberof Proton#Proton.Util\n * @method emptyArray\n *\n * @param {Array} array Any array\n */\n emptyArray(arr) {\n if (arr) arr.length = 0;\n },\n\n toArray(arr) {\n return this.isArray(arr) ? arr : [arr];\n },\n\n getRandFromArray(arr) {\n if (!arr) return null;\n return arr[Math.floor(arr.length * Math.random())];\n },\n\n /**\n * Destroyes the given object\n *\n * @memberof Proton#Proton.Util\n * @method emptyObject\n *\n * @param {Object} obj Any object\n */\n emptyObject(obj, ignore = null) {\n for (let key in obj) {\n if (ignore && ignore.indexOf(key) > -1) continue;\n delete obj[key];\n }\n },\n\n /**\n * Makes an instance of a class and binds the given array\n *\n * @memberof Proton#Proton.Util\n * @method classApply\n *\n * @param {Function} constructor A class to make an instance from\n * @param {Array} [args] Any array to bind it to the constructor\n *\n * @return {Object} The instance of constructor, optionally bind with args\n */\n classApply(constructor, args = null) {\n if (!args) {\n return new constructor();\n } else {\n const FactoryFunc = constructor.bind.apply(constructor, [null].concat(args));\n return new FactoryFunc();\n }\n },\n\n /**\n * This will get the image data. It could be necessary to create a Proton.Zone.\n *\n * @memberof Proton#Proton.Util\n * @method getImageData\n *\n * @param {HTMLCanvasElement} context any canvas, must be a 2dContext 'canvas.getContext('2d')'\n * @param {Object} image could be any dom image, e.g. document.getElementById('thisIsAnImgTag');\n * @param {Proton.Rectangle} rect\n */\n getImageData(context, image, rect) {\n return ImgUtil.getImageData(context, image, rect);\n },\n\n destroyAll(arr, param = null) {\n let i = arr.length;\n\n while (i--) {\n try {\n arr[i].destroy(param);\n } catch (e) {}\n\n delete arr[i];\n }\n\n arr.length = 0;\n },\n\n assign(target, source) {\n if (typeof Object.assign !== \"function\") {\n for (let key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n\n return target;\n } else {\n return Object.assign(target, source);\n }\n }\n};\n","const idsMap = {};\n\nconst Puid = {\n _index: 0,\n _cache: {},\n\n id(type) {\n if (idsMap[type] === undefined || idsMap[type] === null) idsMap[type] = 0;\n return `${type}_${idsMap[type]++}`;\n },\n\n getId(target) {\n let uid = this.getIdFromCache(target);\n if (uid) return uid;\n\n uid = `PUID_${this._index++}`;\n this._cache[uid] = target;\n return uid;\n },\n\n getIdFromCache(target) {\n let obj, id;\n\n for (id in this._cache) {\n obj = this._cache[id];\n\n if (obj === target) return id;\n if (this.isBody(obj, target) && obj.src === target.src) return id;\n }\n\n return null;\n },\n\n isBody(obj, target) {\n return typeof obj === \"object\" && typeof target === \"object\" && obj.isInner && target.isInner;\n },\n\n getTarget(uid) {\n return this._cache[uid];\n }\n};\n\nexport default Puid;\n","/**\n * Pool is the cache pool of the proton engine, it is very important.\n *\n * get(target, params, uid)\n * Class\n * uid = Puid.getId -> Puid save target cache\n * target.__puid = uid\n *\n * body\n * uid = Puid.getId -> Puid save target cache\n *\n *\n * expire(target)\n * cache[target.__puid] push target\n *\n */\nimport Util from \"../utils/Util\";\nimport Puid from \"../utils/Puid\";\n\nexport default class Pool {\n /**\n * @memberof! Proton#\n * @constructor\n * @alias Proton.Pool\n *\n * @todo add description\n * @todo add description of properties\n *\n * @property {Number} total\n * @property {Object} cache\n */\n constructor(num) {\n this.total = 0;\n this.cache = {};\n }\n\n /**\n * @todo add description\n *\n * @method get\n * @memberof Proton#Proton.Pool\n *\n * @param {Object|Function} target\n * @param {Object} [params] just add if `target` is a function\n *\n * @return {Object}\n */\n get(target, params, uid) {\n let p;\n uid = uid || target.__puid || Puid.getId(target);\n\n if (this.cache[uid] && this.cache[uid].length > 0) {\n p = this.cache[uid].pop();\n } else {\n p = this.createOrClone(target, params);\n }\n\n p.__puid = target.__puid || uid;\n return p;\n }\n\n /**\n * @todo add description\n *\n * @method set\n * @memberof Proton#Proton.Pool\n *\n * @param {Object} target\n *\n * @return {Object}\n */\n expire(target) {\n return this.getCache(target.__puid).push(target);\n }\n\n /**\n * Creates a new class instance\n *\n * @todo add more documentation\n *\n * @method create\n * @memberof Proton#Proton.Pool\n *\n * @param {Object|Function} target any Object or Function\n * @param {Object} [params] just add if `target` is a function\n *\n * @return {Object}\n */\n createOrClone(target, params) {\n this.total++;\n\n if (this.create) {\n return this.create(target, params);\n } else if (typeof target === \"function\") {\n return Util.classApply(target, params);\n } else {\n return target.clone();\n }\n }\n\n /**\n * @todo add description - what is in the cache?\n *\n * @method getCount\n * @memberof Proton#Proton.Pool\n *\n * @return {Number}\n */\n getCount() {\n let count = 0;\n for (let id in this.cache) count += this.cache[id].length;\n return count++;\n }\n\n /**\n * Destroyes all items from Pool.cache\n *\n * @method destroy\n * @memberof Proton#Proton.Pool\n */\n destroy() {\n for (let id in this.cache) {\n this.cache[id].length = 0;\n delete this.cache[id];\n }\n }\n\n /**\n * Returns Pool.cache\n *\n * @method getCache\n * @memberof Proton#Proton.Pool\n * @private\n *\n * @param {Number} uid the unique id\n *\n * @return {Object}\n */\n getCache(uid = \"default\") {\n if (!this.cache[uid]) this.cache[uid] = [];\n return this.cache[uid];\n }\n}\n","export default class Stats {\n constructor(proton) {\n this.proton = proton;\n this.container = null;\n this.type = 1;\n\n this.emitterIndex = 0;\n this.rendererIndex = 0;\n }\n\n update(style, body) {\n this.add(style, body);\n\n const emitter = this.getEmitter();\n const renderer = this.getRenderer();\n let str = \"\";\n\n switch (this.type) {\n case 2:\n str += \"emitter:\" + this.proton.emitters.length + \"
\";\n if (emitter) str += \"em speed:\" + emitter.emitSpeed + \"
\";\n if (emitter) str += \"pos:\" + this.getEmitterPos(emitter);\n break;\n\n case 3:\n if (emitter) str += \"initializes:\" + emitter.initializes.length + \"
\";\n if (emitter)\n str += '' + this.concatArr(emitter.initializes) + \"
\";\n if (emitter) str += \"behaviours:\" + emitter.behaviours.length + \"
\";\n if (emitter) str += '' + this.concatArr(emitter.behaviours) + \"
\";\n break;\n\n case 4:\n if (renderer) str += renderer.name + \"
\";\n if (renderer) str += \"body:\" + this.getCreatedNumber(renderer) + \"
\";\n break;\n\n default:\n str += \"particles:\" + this.proton.getCount() + \"
\";\n str += \"pool:\" + this.proton.pool.getCount() + \"
\";\n str += \"total:\" + this.proton.pool.total;\n }\n\n this.container.innerHTML = str;\n }\n\n add(style, body) {\n if (!this.container) {\n this.type = 1;\n\n this.container = document.createElement(\"div\");\n this.container.style.cssText = [\n \"position:absolute;bottom:0px;left:0;cursor:pointer;\",\n \"opacity:0.9;z-index:10000;padding:10px;font-size:12px;font-family:Helvetica,Arial,sans-serif;\",\n \"width:120px;height:50px;background-color:#002;color:#0ff;\"\n ].join(\"\");\n\n this.container.addEventListener(\n \"click\",\n e => {\n this.type++;\n if (this.type > 4) this.type = 1;\n },\n false\n );\n\n let bg, color;\n switch (style) {\n case 2:\n bg = \"#201\";\n color = \"#f08\";\n break;\n\n case 3:\n bg = \"#020\";\n color = \"#0f0\";\n break;\n\n default:\n bg = \"#002\";\n color = \"#0ff\";\n }\n\n this.container.style[\"background-color\"] = bg;\n this.container.style[\"color\"] = color;\n }\n\n if (!this.container.parentNode) {\n body = body || this.body || document.body;\n body.appendChild(this.container);\n }\n }\n\n getEmitter() {\n return this.proton.emitters[this.emitterIndex];\n }\n\n getRenderer() {\n return this.proton.renderers[this.rendererIndex];\n }\n\n concatArr(arr) {\n let result = \"\";\n if (!arr || !arr.length) return result;\n\n for (let i = 0; i < arr.length; i++) {\n result += (arr[i].name || \"\").substr(0, 1) + \".\";\n }\n\n return result;\n }\n\n getCreatedNumber(renderer) {\n return renderer.pool.total || (renderer.cpool && renderer.cpool.total) || 0;\n }\n\n getEmitterPos(e) {\n return Math.round(e.p.x) + \",\" + Math.round(e.p.y);\n }\n}\n","/*\n * EventDispatcher\n * This code reference since http://createjs.com/.\n *\n **/\n\nexport default class EventDispatcher {\n constructor() {\n this._listeners = null;\n }\n\n static bind(target) {\n target.prototype.dispatchEvent = EventDispatcher.prototype.dispatchEvent;\n target.prototype.hasEventListener = EventDispatcher.prototype.hasEventListener;\n target.prototype.addEventListener = EventDispatcher.prototype.addEventListener;\n target.prototype.removeEventListener = EventDispatcher.prototype.removeEventListener;\n target.prototype.removeAllEventListeners = EventDispatcher.prototype.removeAllEventListeners;\n }\n\n addEventListener(type, listener) {\n if (!this._listeners) {\n this._listeners = {};\n } else {\n this.removeEventListener(type, listener);\n }\n\n if (!this._listeners[type]) this._listeners[type] = [];\n this._listeners[type].push(listener);\n\n return listener;\n }\n\n removeEventListener(type, listener) {\n if (!this._listeners) return;\n if (!this._listeners[type]) return;\n\n const arr = this._listeners[type];\n const length = arr.length;\n\n for (let i = 0; i < length; i++) {\n if (arr[i] === listener) {\n if (length === 1) {\n delete this._listeners[type];\n }\n\n // allows for faster checks.\n else {\n arr.splice(i, 1);\n }\n\n break;\n }\n }\n }\n\n removeAllEventListeners(type) {\n if (!type) this._listeners = null;\n else if (this._listeners) delete this._listeners[type];\n }\n\n dispatchEvent(type, args) {\n let result = false;\n const listeners = this._listeners;\n\n if (type && listeners) {\n let arr = listeners[type];\n if (!arr) return result;\n\n // arr = arr.slice();\n // to avoid issues with items being removed or added during the dispatch\n\n let handler;\n let i = arr.length;\n while (i--) {\n handler = arr[i];\n result = result || handler(args);\n }\n }\n\n return !!result;\n }\n\n hasEventListener(type) {\n const listeners = this._listeners;\n return !!(listeners && listeners[type]);\n }\n}\n","const PI = 3.1415926;\nconst INFINITY = Infinity;\n\nconst MathUtil = {\n PI: PI,\n PIx2: PI * 2,\n PI_2: PI / 2,\n PI_180: PI / 180,\n N180_PI: 180 / PI,\n Infinity: -999,\n\n isInfinity(num) {\n return num === this.Infinity || num === INFINITY;\n },\n\n randomAToB(a, b, isInt = false) {\n if (!isInt) return a + Math.random() * (b - a);\n else return ((Math.random() * (b - a)) >> 0) + a;\n },\n\n randomFloating(center, f, isInt) {\n return this.randomAToB(center - f, center + f, isInt);\n },\n\n randomColor() {\n return \"#\" + (\"00000\" + ((Math.random() * 0x1000000) << 0).toString(16)).slice(-6);\n },\n\n randomZone(display) {},\n\n floor(num, k = 4) {\n const digits = Math.pow(10, k);\n return Math.floor(num * digits) / digits;\n },\n\n degreeTransform(a) {\n return (a * PI) / 180;\n },\n\n toColor16(num) {\n return `#${num.toString(16)}`;\n }\n};\n\nexport default MathUtil;\n","export default class Integration {\n constructor(type) {\n this.type = type;\n }\n\n calculate(particles, time, damping) {\n this.eulerIntegrate(particles, time, damping);\n }\n\n // Euler Integrate\n // https://rosettacode.org/wiki/Euler_method\n eulerIntegrate(particle, time, damping) {\n if (!particle.sleep) {\n particle.old.p.copy(particle.p);\n particle.old.v.copy(particle.v);\n\n particle.a.multiplyScalar(1 / particle.mass);\n particle.v.add(particle.a.multiplyScalar(time));\n particle.p.add(particle.old.v.multiplyScalar(time));\n\n if (damping) particle.v.multiplyScalar(damping);\n\n particle.a.clear();\n }\n }\n}\n","import Pool from \"./Pool\";\nimport Util from \"../utils/Util\";\nimport Stats from \"../debug/Stats\";\nimport EventDispatcher from \"../events/EventDispatcher\";\nimport MathUtil from \"../math/MathUtil\";\nimport Integration from \"../math/Integration\";\n\nexport default class Proton {\n static USE_CLOCK = false;\n\n // measure 1:100\n static MEASURE = 100;\n static EULER = \"euler\";\n static RK2 = \"runge-kutta2\";\n\n // event name\n static PARTICLE_CREATED = \"PARTICLE_CREATED\";\n static PARTICLE_UPDATE = \"PARTICLE_UPDATE\";\n static PARTICLE_SLEEP = \"PARTICLE_SLEEP\";\n static PARTICLE_DEAD = \"PARTICLE_DEAD\";\n\n static EMITTER_ADDED = \"EMITTER_ADDED\";\n static EMITTER_REMOVED = \"EMITTER_REMOVED\";\n\n static PROTON_UPDATE = \"PROTON_UPDATE\";\n static PROTON_UPDATE_AFTER = \"PROTON_UPDATE_AFTER\";\n static DEFAULT_INTERVAL = 0.0167;\n\n static amendChangeTabsBug = true;\n\n /**\n * The constructor to add emitters\n *\n * @constructor Proton\n *\n * @todo proParticleCount is not in use\n * @todo add more documentation of the single properties and parameters\n *\n * @param {Number} [proParticleCount] not in use?\n * @param {Number} [integrationType=Proton.EULER]\n *\n * @property {String} [integrationType=Proton.EULER]\n * @property {Array} emitters All added emitter\n * @property {Array} renderers All added renderer\n * @property {Number} time The active time\n * @property {Number} oldtime The old time\n */\n constructor(integrationType) {\n this.emitters = [];\n this.renderers = [];\n\n this.time = 0;\n this.now = 0;\n this.then = 0;\n this.elapsed = 0;\n\n this.stats = new Stats(this);\n this.pool = new Pool(80);\n\n this.integrationType = Util.initValue(integrationType, Proton.EULER);\n this.integrator = new Integration(this.integrationType);\n\n this._fps = \"auto\";\n this._interval = Proton.DEFAULT_INTERVAL;\n }\n\n set fps(fps) {\n this._fps = fps;\n this._interval = fps === \"auto\" ? Proton.DEFAULT_INTERVAL : MathUtil.floor(1 / fps, 7);\n }\n\n get fps() {\n return this._fps;\n }\n\n /**\n * add a type of Renderer\n *\n * @method addRenderer\n * @memberof Proton\n * @instance\n *\n * @param {Renderer} render\n */\n addRenderer(render) {\n render.init(this);\n this.renderers.push(render);\n }\n\n /**\n * @name add a type of Renderer\n *\n * @method addRenderer\n * @param {Renderer} render\n */\n removeRenderer(render) {\n const index = this.renderers.indexOf(render);\n this.renderers.splice(index, 1);\n render.remove(this);\n }\n\n /**\n * add the Emitter\n *\n * @method addEmitter\n * @memberof Proton\n * @instance\n *\n * @param {Emitter} emitter\n */\n addEmitter(emitter) {\n this.emitters.push(emitter);\n emitter.parent = this;\n\n this.dispatchEvent(Proton.EMITTER_ADDED, emitter);\n }\n\n /**\n * Removes an Emitter\n *\n * @method removeEmitter\n * @memberof Proton\n * @instance\n *\n * @param {Proton.Emitter} emitter\n */\n removeEmitter(emitter) {\n const index = this.emitters.indexOf(emitter);\n this.emitters.splice(index, 1);\n emitter.parent = null;\n\n this.dispatchEvent(Proton.EMITTER_REMOVED, emitter);\n }\n\n /**\n * Updates all added emitters\n *\n * @method update\n * @memberof Proton\n * @instance\n */\n update() {\n // 'auto' is the default browser refresh rate, the vast majority is 60fps\n if (this._fps === \"auto\") {\n this.dispatchEvent(Proton.PROTON_UPDATE);\n\n if (Proton.USE_CLOCK) {\n if (!this.then) this.then = new Date().getTime();\n this.now = new Date().getTime();\n this.elapsed = (this.now - this.then) * 0.001;\n // Fix bugs such as chrome browser switching tabs causing excessive time difference\n this.amendChangeTabsBug();\n\n if (this.elapsed > 0) this.emittersUpdate(this.elapsed);\n this.then = this.now;\n } else {\n this.emittersUpdate(Proton.DEFAULT_INTERVAL);\n }\n\n this.dispatchEvent(Proton.PROTON_UPDATE_AFTER);\n }\n\n // If the fps frame rate is set\n else {\n if (!this.then) this.then = new Date().getTime();\n this.now = new Date().getTime();\n this.elapsed = (this.now - this.then) * 0.001;\n\n if (this.elapsed > this._interval) {\n this.dispatchEvent(Proton.PROTON_UPDATE);\n this.emittersUpdate(this._interval);\n // https://stackoverflow.com/questions/19764018/controlling-fps-with-requestanimationframe\n this.then = this.now - (this.elapsed % this._interval) * 1000;\n this.dispatchEvent(Proton.PROTON_UPDATE_AFTER);\n }\n }\n }\n\n emittersUpdate(elapsed) {\n let i = this.emitters.length;\n while (i--) this.emitters[i].update(elapsed);\n }\n\n /**\n * @todo add description\n *\n * @method amendChangeTabsBug\n * @memberof Proton\n * @instance\n */\n amendChangeTabsBug() {\n if (!Proton.amendChangeTabsBug) return;\n if (this.elapsed > 0.5) {\n this.then = new Date().getTime();\n this.elapsed = 0;\n }\n }\n\n /**\n * Counts all particles from all emitters\n *\n * @method getCount\n * @memberof Proton\n * @instance\n */\n getCount() {\n let total = 0;\n let i = this.emitters.length;\n\n while (i--) total += this.emitters[i].particles.length;\n return total;\n }\n\n getAllParticles() {\n let particles = [];\n let i = this.emitters.length;\n\n while (i--) particles = particles.concat(this.emitters[i].particles);\n return particles;\n }\n\n destroyAllEmitters() {\n Util.destroyAll(this.emitters);\n }\n\n /**\n * Destroys everything related to this Proton instance. This includes all emitters, and all properties\n *\n * @method destroy\n * @memberof Proton\n * @instance\n */\n destroy(remove = false) {\n const destroyOther = () => {\n this.time = 0;\n this.then = 0;\n this.pool.destroy();\n\n Util.destroyAll(this.emitters);\n Util.destroyAll(this.renderers, this.getAllParticles());\n };\n\n if (remove) {\n setTimeout(destroyOther, 200);\n } else {\n destroyOther();\n }\n }\n}\n\nEventDispatcher.bind(Proton);\n","export default class Rgb {\n constructor(r = 255, g = 255, b = 255) {\n this.r = r;\n this.g = g;\n this.b = b;\n }\n\n reset() {\n this.r = 255;\n this.g = 255;\n this.b = 255;\n }\n}\n","export default {\n hasProp(target, key) {\n if (!target) return false;\n return target[key] !== undefined;\n // return obj.hasOwnProperty(key);\n },\n\n /**\n * set the prototype in a given prototypeObject\n *\n * @memberof Proton#Proton.Util\n * @method setProp\n *\n * @todo add description for param `target`\n * @todo translate desription from chinese to english\n *\n * @param {Object} target\n * @param {Object} prototypeObject An object of single prototypes\n *\n * @return {Object} target\n */\n setProp(target, props) {\n for (let prop in props) {\n if (target.hasOwnProperty(prop)) {\n target[prop] = Span.getSpanValue(props[prop]);\n }\n }\n\n return target;\n },\n\n /**\n * @memberof Proton#Proton.Util\n * @method setVectorVal\n *\n * @todo add description for param `target`\n * @todo add description for param `conf`\n * @todo add description for function\n *\n * @param {Object} target\n * @param {Object} conf\n */\n setVectorVal(particle, conf = null) {\n if (!conf) return;\n\n if (this.hasProp(conf, \"x\")) particle.p.x = conf[\"x\"];\n if (this.hasProp(conf, \"y\")) particle.p.y = conf[\"y\"];\n\n if (this.hasProp(conf, \"vx\")) particle.v.x = conf[\"vx\"];\n if (this.hasProp(conf, \"vy\")) particle.v.y = conf[\"vy\"];\n\n if (this.hasProp(conf, \"ax\")) particle.a.x = conf[\"ax\"];\n if (this.hasProp(conf, \"ay\")) particle.a.y = conf[\"ay\"];\n\n if (this.hasProp(conf, \"p\")) particle.p.copy(conf[\"p\"]);\n if (this.hasProp(conf, \"v\")) particle.v.copy(conf[\"v\"]);\n if (this.hasProp(conf, \"a\")) particle.a.copy(conf[\"a\"]);\n\n if (this.hasProp(conf, \"position\")) particle.p.copy(conf[\"position\"]);\n if (this.hasProp(conf, \"velocity\")) particle.v.copy(conf[\"velocity\"]);\n if (this.hasProp(conf, \"accelerate\")) particle.a.copy(conf[\"accelerate\"]);\n }\n};\n","import MathUtil from \"./MathUtil\";\n\nexport default {\n easeLinear(value) {\n return value;\n },\n\n easeInQuad(value) {\n return Math.pow(value, 2);\n },\n\n easeOutQuad(value) {\n return -(Math.pow(value - 1, 2) - 1);\n },\n\n easeInOutQuad(value) {\n if ((value /= 0.5) < 1) return 0.5 * Math.pow(value, 2);\n\n return -0.5 * ((value -= 2) * value - 2);\n },\n\n easeInCubic(value) {\n return Math.pow(value, 3);\n },\n\n easeOutCubic(value) {\n return Math.pow(value - 1, 3) + 1;\n },\n\n easeInOutCubic(value) {\n if ((value /= 0.5) < 1) return 0.5 * Math.pow(value, 3);\n\n return 0.5 * (Math.pow(value - 2, 3) + 2);\n },\n\n easeInQuart(value) {\n return Math.pow(value, 4);\n },\n\n easeOutQuart(value) {\n return -(Math.pow(value - 1, 4) - 1);\n },\n\n easeInOutQuart(value) {\n if ((value /= 0.5) < 1) return 0.5 * Math.pow(value, 4);\n\n return -0.5 * ((value -= 2) * Math.pow(value, 3) - 2);\n },\n\n easeInSine(value) {\n return -Math.cos(value * MathUtil.PI_2) + 1;\n },\n\n easeOutSine(value) {\n return Math.sin(value * MathUtil.PI_2);\n },\n\n easeInOutSine(value) {\n return -0.5 * (Math.cos(Math.PI * value) - 1);\n },\n\n easeInExpo(value) {\n return value === 0 ? 0 : Math.pow(2, 10 * (value - 1));\n },\n\n easeOutExpo(value) {\n return value === 1 ? 1 : -Math.pow(2, -10 * value) + 1;\n },\n\n easeInOutExpo(value) {\n if (value === 0) return 0;\n\n if (value === 1) return 1;\n\n if ((value /= 0.5) < 1) return 0.5 * Math.pow(2, 10 * (value - 1));\n\n return 0.5 * (-Math.pow(2, -10 * --value) + 2);\n },\n\n easeInCirc(value) {\n return -(Math.sqrt(1 - value * value) - 1);\n },\n\n easeOutCirc(value) {\n return Math.sqrt(1 - Math.pow(value - 1, 2));\n },\n\n easeInOutCirc(value) {\n if ((value /= 0.5) < 1) return -0.5 * (Math.sqrt(1 - value * value) - 1);\n return 0.5 * (Math.sqrt(1 - (value -= 2) * value) + 1);\n },\n\n easeInBack(value) {\n let s = 1.70158;\n return value * value * ((s + 1) * value - s);\n },\n\n easeOutBack(value) {\n let s = 1.70158;\n return (value = value - 1) * value * ((s + 1) * value + s) + 1;\n },\n\n easeInOutBack(value) {\n let s = 1.70158;\n if ((value /= 0.5) < 1) return 0.5 * (value * value * (((s *= 1.525) + 1) * value - s));\n return 0.5 * ((value -= 2) * value * (((s *= 1.525) + 1) * value + s) + 2);\n },\n\n getEasing(ease) {\n if (typeof ease === \"function\") return ease;\n else return this[ease] || this.easeLinear;\n }\n};\n","import MathUtil from \"../math/MathUtil\";\n\nexport default class Vector2D {\n constructor(x, y) {\n this.x = x || 0;\n this.y = y || 0;\n }\n\n set(x, y) {\n this.x = x;\n this.y = y;\n return this;\n }\n\n setX(x) {\n this.x = x;\n return this;\n }\n\n setY(y) {\n this.y = y;\n return this;\n }\n\n getGradient() {\n if (this.x !== 0) return Math.atan2(this.y, this.x);\n else if (this.y > 0) return MathUtil.PI_2;\n else if (this.y < 0) return -MathUtil.PI_2;\n }\n\n copy(v) {\n this.x = v.x;\n this.y = v.y;\n\n return this;\n }\n\n add(v, w) {\n if (w !== undefined) {\n return this.addVectors(v, w);\n }\n\n this.x += v.x;\n this.y += v.y;\n\n return this;\n }\n\n addXY(a, b) {\n this.x += a;\n this.y += b;\n\n return this;\n }\n\n addVectors(a, b) {\n this.x = a.x + b.x;\n this.y = a.y + b.y;\n\n return this;\n }\n\n sub(v, w) {\n if (w !== undefined) {\n return this.subVectors(v, w);\n }\n\n this.x -= v.x;\n this.y -= v.y;\n\n return this;\n }\n\n subVectors(a, b) {\n this.x = a.x - b.x;\n this.y = a.y - b.y;\n\n return this;\n }\n\n divideScalar(s) {\n if (s !== 0) {\n this.x /= s;\n this.y /= s;\n } else {\n this.set(0, 0);\n }\n\n return this;\n }\n\n multiplyScalar(s) {\n this.x *= s;\n this.y *= s;\n\n return this;\n }\n\n negate() {\n return this.multiplyScalar(-1);\n }\n\n dot(v) {\n return this.x * v.x + this.y * v.y;\n }\n\n lengthSq() {\n return this.x * this.x + this.y * this.y;\n }\n\n length() {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n }\n\n normalize() {\n return this.divideScalar(this.length());\n }\n\n distanceTo(v) {\n return Math.sqrt(this.distanceToSquared(v));\n }\n\n rotate(tha) {\n const x = this.x;\n const y = this.y;\n\n this.x = x * Math.cos(tha) + y * Math.sin(tha);\n this.y = -x * Math.sin(tha) + y * Math.cos(tha);\n\n return this;\n }\n\n distanceToSquared(v) {\n const dx = this.x - v.x;\n const dy = this.y - v.y;\n\n return dx * dx + dy * dy;\n }\n\n lerp(v, alpha) {\n this.x += (v.x - this.x) * alpha;\n this.y += (v.y - this.y) * alpha;\n\n return this;\n }\n\n equals(v) {\n return v.x === this.x && v.y === this.y;\n }\n\n clear() {\n this.x = 0.0;\n this.y = 0.0;\n return this;\n }\n\n clone() {\n return new Vector2D(this.x, this.y);\n }\n}\n","/** @typedef {import('../behaviour/Behaviour')} Behaviour */\n/** @typedef {import('../math/Vector2D')} Vector2D */\n/** @typedef {import('../utils/Rgb')} Rgb */\nimport Rgb from \"../utils/Rgb\";\nimport Puid from \"../utils/Puid\";\nimport Util from \"../utils/Util\";\nimport PropUtil from \"../utils/PropUtil\";\nimport ease from \"../math/ease\";\nimport Vector2D from \"../math/Vector2D\";\nimport MathUtil from \"../math/MathUtil\";\n\nexport default class Particle {\n /** @type string */\n id = \"\";\n\n /** @type {{p:Vector2D,v:Vector2D,a:Vector2D}} */\n old = {};\n\n /** @type {object} */\n data = {};\n\n /** @type {Behaviour[]} */\n behaviours = [];\n\n /** @type {Vector2D} */\n p = [];\n\n /** @type {Vector2D} */\n v = [];\n\n /** @type {Vector2D} */\n a = [];\n\n /** @type {Rgb} */\n rgb = {};\n\n /**\n * the Particle class\n *\n * @class Proton.Particle\n * @constructor\n * @param {Object} pObj the parameters object;\n * for example {life:3,dead:false}\n */\n constructor(conf) {\n /**\n * The particle's id;\n * @property id\n * @type {string}\n */\n this.name = \"Particle\";\n this.id = Puid.id(this.name);\n this.old = {};\n this.data = {};\n this.behaviours = [];\n\n this.p = new Vector2D();\n this.v = new Vector2D();\n this.a = new Vector2D();\n this.old.p = new Vector2D();\n this.old.v = new Vector2D();\n this.old.a = new Vector2D();\n\n this.rgb = new Rgb();\n this.reset();\n conf && PropUtil.setProp(this, conf);\n }\n\n getDirection() {\n return Math.atan2(this.v.x, -this.v.y) * MathUtil.N180_PI;\n }\n\n reset() {\n this.life = Infinity;\n this.age = 0;\n\n this.dead = false;\n this.sleep = false;\n this.body = null;\n this.sprite = null;\n this.parent = null;\n\n this.energy = 1; // Energy Loss\n this.mass = 1;\n this.radius = 10;\n this.alpha = 1;\n this.scale = 1;\n this.rotation = 0;\n this.color = null;\n\n this.p.set(0, 0);\n this.v.set(0, 0);\n this.a.set(0, 0);\n this.old.p.set(0, 0);\n this.old.v.set(0, 0);\n this.old.a.set(0, 0);\n this.easing = ease.easeLinear;\n\n this.rgb.reset();\n Util.emptyObject(this.data);\n this.removeAllBehaviours();\n\n return this;\n }\n\n update(time, index) {\n if (!this.sleep) {\n this.age += time;\n this.applyBehaviours(time, index);\n }\n\n if (this.age < this.life) {\n const scale = this.easing(this.age / this.life);\n this.energy = Math.max(1 - scale, 0);\n } else {\n this.destroy();\n }\n }\n\n applyBehaviours(time, index) {\n const length = this.behaviours.length;\n let i;\n\n for (i = 0; i < length; i++) {\n this.behaviours[i] && this.behaviours[i].applyBehaviour(this, time, index);\n }\n }\n\n /**\n * @param {Behaviour} behaviour\n */\n addBehaviour(behaviour) {\n this.behaviours.push(behaviour);\n\n if (behaviour.hasOwnProperty(\"parents\")) behaviour.parents.push(this);\n behaviour.initialize(this);\n }\n\n /**\n * @param {Behaviour[]} behaviours\n */\n addBehaviours(behaviours) {\n const length = behaviours.length;\n let i;\n\n for (i = 0; i < length; i++) {\n this.addBehaviour(behaviours[i]);\n }\n }\n\n removeBehaviour(behaviour) {\n const index = this.behaviours.indexOf(behaviour);\n\n if (index > -1) {\n const behaviour = this.behaviours.splice(index, 1);\n behaviour.parents = null;\n }\n }\n\n removeAllBehaviours() {\n Util.emptyArray(this.behaviours);\n }\n\n /**\n * Destory this particle\n * @method destroy\n */\n destroy() {\n this.removeAllBehaviours();\n this.energy = 0;\n this.dead = true;\n this.parent = null;\n }\n}\n","export default {\n /**\n * @typedef {Object} rgbObject\n * @property {Number} r red value\n * @property {Number} g green value\n * @property {Number} b blue value\n */\n /**\n * converts a hex value to a rgb object\n *\n * @memberof Proton#Proton.Util\n * @method hexToRgb\n *\n * @param {String} h any hex value, e.g. #000000 or 000000 for black\n *\n * @return {rgbObject}\n */\n hexToRgb(h) {\n const hex16 = h.charAt(0) === \"#\" ? h.substring(1, 7) : h;\n const r = parseInt(hex16.substring(0, 2), 16);\n const g = parseInt(hex16.substring(2, 4), 16);\n const b = parseInt(hex16.substring(4, 6), 16);\n\n return { r, g, b };\n },\n\n /**\n * converts a rgb value to a rgb string\n *\n * @memberof Proton#Proton.Util\n * @method rgbToHex\n *\n * @param {Object | Proton.hexToRgb} rgb a rgb object like in {@link Proton#Proton.}\n *\n * @return {String} rgb()\n */\n rgbToHex(rbg) {\n return `rgb(${rbg.r}, ${rbg.g}, ${rbg.b})`;\n },\n\n getHex16FromParticle(p) {\n return Number(p.rgb.r) * 65536 + Number(p.rgb.g) * 256 + Number(p.rgb.b);\n }\n};\n","import Vector2D from \"./Vector2D\";\n\nexport default class Polar2D {\n constructor(r, tha) {\n this.r = Math.abs(r) || 0;\n this.tha = tha || 0;\n }\n\n set(r, tha) {\n this.r = r;\n this.tha = tha;\n return this;\n }\n\n setR(r) {\n this.r = r;\n return this;\n }\n\n setTha(tha) {\n this.tha = tha;\n return this;\n }\n\n copy(p) {\n this.r = p.r;\n this.tha = p.tha;\n return this;\n }\n\n toVector() {\n return new Vector2D(this.getX(), this.getY());\n }\n\n getX() {\n return this.r * Math.sin(this.tha);\n }\n\n getY() {\n return -this.r * Math.cos(this.tha);\n }\n\n normalize() {\n this.r = 1;\n return this;\n }\n\n equals(v) {\n return v.r === this.r && v.tha === this.tha;\n }\n\n clear() {\n this.r = 0.0;\n this.tha = 0.0;\n return this;\n }\n\n clone() {\n return new Polar2D(this.r, this.tha);\n }\n}\n","const Mat3 = {\n create(mat3) {\n const mat = new Float32Array(9);\n if (mat3) this.set(mat3, mat);\n\n return mat;\n },\n\n set(mat1, mat2) {\n for (let i = 0; i < 9; i++) mat2[i] = mat1[i];\n\n return mat2;\n },\n\n multiply(mat, mat2, mat3) {\n let a00 = mat[0],\n a01 = mat[1],\n a02 = mat[2],\n a10 = mat[3],\n a11 = mat[4],\n a20 = mat[6],\n a21 = mat[7],\n b00 = mat2[0],\n b01 = mat2[1],\n b02 = mat2[2],\n b10 = mat2[3],\n b11 = mat2[4],\n b20 = mat2[6],\n b21 = mat2[7];\n\n mat3[0] = b00 * a00 + b01 * a10;\n mat3[1] = b00 * a01 + b01 * a11;\n mat3[2] = a02 * b02;\n mat3[3] = b10 * a00 + b11 * a10;\n mat3[4] = b10 * a01 + b11 * a11;\n mat3[6] = b20 * a00 + b21 * a10 + a20;\n mat3[7] = b20 * a01 + b21 * a11 + a21;\n\n return mat3;\n },\n\n inverse(mat, mat3) {\n let a00 = mat[0],\n a01 = mat[1],\n a10 = mat[3],\n a11 = mat[4],\n a20 = mat[6],\n a21 = mat[7],\n b01 = a11,\n b11 = -a10,\n b21 = a21 * a10 - a11 * a20,\n d = a00 * b01 + a01 * b11,\n id;\n\n id = 1 / d;\n mat3[0] = b01 * id;\n mat3[1] = -a01 * id;\n mat3[3] = b11 * id;\n mat3[4] = a00 * id;\n mat3[6] = b21 * id;\n mat3[7] = (-a21 * a00 + a01 * a20) * id;\n\n return mat3;\n },\n\n multiplyVec2(m, vec, mat3) {\n let x = vec[0],\n y = vec[1];\n\n mat3[0] = x * m[0] + y * m[3] + m[6];\n mat3[1] = x * m[1] + y * m[4] + m[7];\n\n return mat3;\n }\n};\n\nexport default Mat3;\n","import Util from \"../utils/Util\";\nimport MathUtil from \"../math/MathUtil\";\n\nexport default class Span {\n constructor(a, b, center) {\n if (Util.isArray(a)) {\n this.isArray = true;\n this.a = a;\n } else {\n this.isArray = false;\n this.a = Util.initValue(a, 1);\n this.b = Util.initValue(b, this.a);\n this.center = Util.initValue(center, false);\n }\n }\n\n getValue(isInt = false) {\n if (this.isArray) {\n return Util.getRandFromArray(this.a);\n } else {\n if (!this.center) {\n return MathUtil.randomAToB(this.a, this.b, isInt);\n } else {\n return MathUtil.randomFloating(this.a, this.b, isInt);\n }\n }\n }\n\n /**\n * Returns a new Span object\n *\n * @memberof Proton#Proton.Util\n * @method setSpanValue\n *\n * @todo a, b and c should be 'Mixed' or 'Number'?\n *\n * @param {Mixed | Span} a\n * @param {Mixed} b\n * @param {Mixed} c\n *\n * @return {Span}\n */\n static setSpanValue(a, b, c) {\n if (a instanceof Span) {\n return a;\n } else {\n if (b === undefined) {\n return new Span(a);\n } else {\n if (c === undefined) return new Span(a, b);\n else return new Span(a, b, c);\n }\n }\n }\n\n /**\n * Returns the value from a Span, if the param is not a Span it will return the given parameter\n *\n * @memberof Proton#Proton.Util\n * @method getValue\n *\n * @param {Mixed | Span} pan\n *\n * @return {Mixed} the value of Span OR the parameter if it is not a Span\n */\n static getSpanValue(pan) {\n return pan instanceof Span ? pan.getValue() : pan;\n }\n}\n","import Span from \"./Span\";\nimport Util from \"../utils/Util\";\nimport MathUtil from \"./MathUtil\";\n\nexport default class ArraySpan extends Span {\n constructor(color) {\n super();\n this._arr = Util.toArray(color);\n }\n\n getValue() {\n const val = Util.getRandFromArray(this._arr);\n return val === \"random\" || val === \"Random\" ? MathUtil.randomColor() : val;\n }\n\n /**\n * Make sure that the color is an instance of Proton.ArraySpan, if not it makes a new instance\n *\n * @method setSpanValue\n * @memberof Proton#Proton.Color\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n static createArraySpan(arr) {\n if (!arr) return null;\n\n if (arr instanceof ArraySpan) return arr;\n else return new ArraySpan(arr);\n }\n}\n","export default class Rectangle {\n constructor(x, y, w, h) {\n this.x = x;\n this.y = y;\n\n this.width = w;\n this.height = h;\n\n this.bottom = this.y + this.height;\n this.right = this.x + this.width;\n }\n\n contains(x, y) {\n if (x <= this.right && x >= this.x && y <= this.bottom && y >= this.y) return true;\n else return false;\n }\n}\n","import Span from \"../math/Span\";\nimport Util from \"../utils/Util\";\n\nexport default class Rate {\n /**\n * The number of particles per second emission (a [particle]/b [s]);\n * @namespace\n * @memberof! Proton#\n * @constructor\n * @alias Rate\n *\n * @param {Array | Number | Span} numpan the number of each emission;\n * @param {Array | Number | Span} timepan the time of each emission;\n * for example: new Rate(new Span(10, 20), new Span(.1, .25));\n */\n constructor(numpan, timepan) {\n this.numPan = Span.setSpanValue(Util.initValue(numpan, 1));\n this.timePan = Span.setSpanValue(Util.initValue(timepan, 1));\n\n this.startTime = 0;\n this.nextTime = 0;\n this.init();\n }\n\n init() {\n this.startTime = 0;\n this.nextTime = this.timePan.getValue();\n }\n\n getValue(time) {\n this.startTime += time;\n\n if (this.startTime >= this.nextTime) {\n this.startTime = 0;\n this.nextTime = this.timePan.getValue();\n\n if (this.numPan.b === 1) {\n if (this.numPan.getValue(false) > 0.5) return 1;\n else return 0;\n } else {\n return this.numPan.getValue(true);\n }\n }\n\n return 0;\n }\n}\n","export default class Initialize {\n reset() {}\n\n init(emitter, particle) {\n if (particle) {\n this.initialize(particle);\n } else {\n this.initialize(emitter);\n }\n }\n\n // sub class init\n initialize(target) {}\n}\n","import Span from \"../math/Span\";\nimport Initialize from \"./Initialize\";\n\nexport default class Life extends Initialize {\n constructor(a, b, c) {\n super();\n\n this.lifePan = Span.setSpanValue(a, b, c);\n this.name = \"Life\";\n }\n\n initialize(target) {\n if (this.lifePan.a === Infinity) target.life = Infinity;\n else target.life = this.lifePan.getValue();\n }\n}\n","import Vector2D from \"../math/Vector2D\";\n\nexport default class Zone {\n constructor() {\n this.vector = new Vector2D(0, 0);\n this.random = 0;\n this.crossType = \"dead\";\n this.alert = true;\n }\n\n getPosition() {}\n\n crossing(particle) {}\n\n destroy() {\n this.vector = null;\n }\n}\n","import Zone from \"./Zone\";\n\nexport default class PointZone extends Zone {\n constructor(x, y) {\n super();\n\n this.x = x;\n this.y = y;\n }\n\n getPosition() {\n this.vector.x = this.x;\n this.vector.y = this.y;\n\n return this.vector;\n }\n\n crossing(particle) {\n if (this.alert) {\n console.error(\"Sorry, PointZone does not support crossing method!\");\n this.alert = false;\n }\n }\n}\n","import Util from \"../utils/Util\";\nimport PointZone from \"../zone/PointZone\";\nimport Initialize from \"./Initialize\";\n\nexport default class Position extends Initialize {\n constructor(zone) {\n super();\n this.zone = Util.initValue(zone, new PointZone());\n this.name = \"Position\";\n }\n\n reset(zone) {\n this.zone = Util.initValue(zone, new PointZone());\n }\n\n initialize(target) {\n this.zone.getPosition();\n\n target.p.x = this.zone.vector.x;\n target.p.y = this.zone.vector.y;\n }\n}\n","import Proton from \"../core/Proton\";\nimport Span from \"../math/Span\";\nimport Util from \"../utils/Util\";\nimport Initialize from \"./Initialize\";\nimport Polar2D from \"../math/Polar2D\";\nimport MathUtil from \"../math/MathUtil\";\n\nexport default class Velocity extends Initialize {\n constructor(rpan, thapan, type) {\n super();\n\n this.rPan = Span.setSpanValue(rpan);\n this.thaPan = Span.setSpanValue(thapan);\n this.type = Util.initValue(type, \"vector\");\n\n this.name = \"Velocity\";\n }\n\n reset(rpan, thapan, type) {\n this.rPan = Span.setSpanValue(rpan);\n this.thaPan = Span.setSpanValue(thapan);\n this.type = Util.initValue(type, \"vector\");\n }\n\n normalizeVelocity(vr) {\n return vr * Proton.MEASURE;\n }\n\n initialize(target) {\n if (this.type === \"p\" || this.type === \"P\" || this.type === \"polar\") {\n const polar2d = new Polar2D(\n this.normalizeVelocity(this.rPan.getValue()),\n this.thaPan.getValue() * MathUtil.PI_180\n );\n\n target.v.x = polar2d.getX();\n target.v.y = polar2d.getY();\n } else {\n target.v.x = this.normalizeVelocity(this.rPan.getValue());\n target.v.y = this.normalizeVelocity(this.thaPan.getValue());\n }\n }\n}\n","import Span from \"../math/Span\";\nimport Initialize from \"./Initialize\";\n\nexport default class Mass extends Initialize {\n constructor(a, b, c) {\n super();\n this.massPan = Span.setSpanValue(a, b, c);\n this.name = \"Mass\";\n }\n\n initialize(target) {\n target.mass = this.massPan.getValue();\n }\n}\n","import Span from \"../math/Span\";\nimport Initialize from \"./Initialize\";\n\nexport default class Radius extends Initialize {\n constructor(a, b, c) {\n super();\n this.radius = Span.setSpanValue(a, b, c);\n\n this.name = \"Radius\";\n }\n\n reset(a, b, c) {\n this.radius = Span.setSpanValue(a, b, c);\n }\n\n initialize(particle) {\n particle.radius = this.radius.getValue();\n particle.data.oldRadius = particle.radius;\n }\n}\n","import Util from \"../utils/Util\";\nimport ArraySpan from \"../math/ArraySpan\";\nimport Initialize from \"./Initialize\";\n\nexport default class Body extends Initialize {\n constructor(image, w, h) {\n super();\n\n this.image = this.setSpanValue(image);\n this.w = Util.initValue(w, 20);\n this.h = Util.initValue(h, this.w);\n this.name = \"Body\";\n }\n\n initialize(particle) {\n const imageTarget = this.image.getValue();\n\n if (typeof imageTarget === \"string\") {\n particle.body = {\n width: this.w,\n height: this.h,\n src: imageTarget,\n isInner: true,\n inner: true\n };\n } else {\n particle.body = imageTarget;\n }\n }\n\n setSpanValue(image) {\n return image instanceof ArraySpan ? image : new ArraySpan(image);\n }\n}\n","import Proton from \"../core/Proton\";\nimport Util from \"../utils/Util\";\nimport ease from \"../math/ease\";\n\nexport default class Behaviour {\n static id = 0;\n\n /**\n * The Behaviour class is the base for the other Behaviour\n *\n * @memberof! -\n * @interface\n * @alias Proton.Behaviour\n *\n * @param {Number} life \tthe behaviours life\n * @param {String} easing \tThe behaviour's decaying trend, for example ease.easeOutQuart\n *\n * @property {String} id \t\tThe behaviours id\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n * @property {Number} age=0 \tHow long the particle should be 'alife'\n * @property {Number} energy=1\n * @property {Boolean} dead=false The particle is dead at first\n * @property {Array} parents \tThe behaviour's parents array\n * @property {String} name \tThe behaviour name\n */\n constructor(life, easing) {\n this.life = Util.initValue(life, Infinity);\n this.easing = ease.getEasing(easing);\n\n this.age = 0;\n this.energy = 1;\n this.dead = false;\n this.parents = [];\n\n this.id = `Behaviour_${Behaviour.id++}`;\n this.name = \"Behaviour\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton.Behaviour\n * @instance\n *\n * @param {Number} [life=Infinity] \t\tthis behaviour's life\n * @param {String} [easing=easeLinear] \tthis behaviour's easing\n */\n reset(life, easing) {\n this.life = Util.initValue(life, Infinity);\n this.easing = ease.getEasing(easing);\n }\n\n /**\n * Normalize a force by 1:100;\n *\n * @method normalizeForce\n * @memberof Proton.Behaviour\n * @instance\n *\n * @param {Proton.Vector2D} force\n */\n normalizeForce(force) {\n return force.multiplyScalar(Proton.MEASURE);\n }\n\n /**\n * Normalize a value by 1:100;\n *\n * @method normalizeValue\n * @memberof Proton.Behaviour\n * @instance\n *\n * @param {Number} value\n */\n normalizeValue(value) {\n return value * Proton.MEASURE;\n }\n\n /**\n * Initialize the behaviour's parameters for all particles\n *\n * @method initialize\n * @memberof Proton.Behaviour\n * @instance\n *\n * @param {Proton.Particle} particle\n */\n initialize(particle) {}\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton.Behaviour\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} \t\t\ttime the integrate time 1/ms\n * @param {Int} \t\t\tindex the particle index\n */\n calculate(particle, time, index) {\n this.age += time;\n\n if (this.age >= this.life || this.dead) {\n this.energy = 0;\n this.dead = true;\n this.destroy();\n } else {\n const scale = this.easing(particle.age / particle.life);\n this.energy = Math.max(1 - scale, 0);\n }\n }\n\n /**\n * Destory this behaviour\n *\n * @method destroy\n * @memberof Proton.Behaviour\n * @instance\n */\n destroy() {\n let i = this.parents.length;\n while (i--) {\n this.parents[i].removeBehaviour(this);\n }\n\n this.parents.length = 0;\n }\n}\n","import Vector2D from \"../math/Vector2D\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class Force extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Force\n *\n * @param {Number} fx\n * @param {Number} fy\n * @param {Number} [life=Infinity] \t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(fx, fy, life, easing) {\n super(life, easing);\n\n this.force = this.normalizeForce(new Vector2D(fx, fy));\n this.name = \"Force\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Force\n * @instance\n *\n * @param {Number} fx\n * @param {Number} fy\n * @param {Number} [life=Infinity] \t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(fx, fy, life, easing) {\n this.force = this.normalizeForce(new Vector2D(fx, fy));\n\n life && super.reset(life, easing);\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#Proton.Force\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n particle.a.add(this.force);\n }\n}\n","import Util from \"../utils/Util\";\nimport Vector2D from \"../math/Vector2D\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class Attraction extends Behaviour {\n /**\n * This behaviour let the particles follow one specific Proton.Vector2D\n *\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Attraction\n *\n * @todo add description for 'force' and 'radius'\n *\n * @param {Proton.Vector2D} targetPosition the attraction point coordinates\n * @param {Number} [force=100]\n * @param {Number} [radius=1000]\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {Proton.Vector2D} targetPosition\n * @property {Number} radius\n * @property {Number} force\n * @property {Number} radiusSq\n * @property {Proton.Vector2D} attractionForce\n * @property {Number} lengthSq\n * @property {String} name The Behaviour name\n */\n constructor(targetPosition, force, radius, life, easing) {\n super(life, easing);\n\n this.targetPosition = Util.initValue(targetPosition, new Vector2D());\n this.radius = Util.initValue(radius, 1000);\n this.force = Util.initValue(this.normalizeValue(force), 100);\n\n this.radiusSq = this.radius * this.radius;\n this.attractionForce = new Vector2D();\n this.lengthSq = 0;\n\n this.name = \"Attraction\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Attraction\n * @instance\n *\n * @todo add description for 'force' and 'radius'\n *\n * @param {Proton.Vector2D} targetPosition the attraction point coordinates\n * @param {Number} [force=100]\n * @param {Number} [radius=1000]\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(targetPosition, force, radius, life, easing) {\n this.targetPosition = Util.initValue(targetPosition, new Vector2D());\n this.radius = Util.initValue(radius, 1000);\n this.force = Util.initValue(this.normalizeValue(force), 100);\n\n this.radiusSq = this.radius * this.radius;\n this.attractionForce = new Vector2D();\n this.lengthSq = 0;\n\n life && super.reset(life, easing);\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @memberof Proton#Proton.Attraction\n * @method applyBehaviour\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} \t\t\ttime the integrate time 1/ms\n * @param {Int} \t\t\tindex the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n\n this.attractionForce.copy(this.targetPosition);\n this.attractionForce.sub(particle.p);\n this.lengthSq = this.attractionForce.lengthSq();\n\n if (this.lengthSq > 0.00004 && this.lengthSq < this.radiusSq) {\n this.attractionForce.normalize();\n this.attractionForce.multiplyScalar(1 - this.lengthSq / this.radiusSq);\n this.attractionForce.multiplyScalar(this.force);\n\n particle.a.add(this.attractionForce);\n }\n }\n}\n","import Vector2D from \"../math/Vector2D\";\nimport MathUtil from \"../math/MathUtil\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class RandomDrift extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Behaviour\n * @constructor\n * @alias RandomDrift\n *\n * @param {Number} driftX \t\t\t\tX value of the new Vector2D\n * @param {Number} driftY \t\t\t\tY value of the new Vector2D\n * @param {Number} delay \t\t\t\tHow much delay the drift should have\n * @param {Number} [life=Infinity] \t\tthis behaviour's life\n * @param {String} [easing=easeLinear] \tthis behaviour's easing\n *\n * @property {Number} time The time of the drift\n * @property {String} name The Behaviour name\n */\n constructor(driftX, driftY, delay, life, easing) {\n super(life, easing);\n\n this.reset(driftX, driftY, delay);\n this.time = 0;\n this.name = \"RandomDrift\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#RandomDrift\n * @instance\n *\n * @param {Number} driftX \t\t\t\tX value of the new Vector2D\n * @param {Number} driftY \t\t\t\tY value of the new Vector2D\n * @param {Number} delay \t\t\t\tHow much delay the drift should have\n * @param {Number} [life=Infinity] \t\tthis behaviour's life\n * @param {String} [easing=easeLinear] \tthis behaviour's easing\n */\n reset(driftX, driftY, delay, life, easing) {\n this.panFoce = new Vector2D(driftX, driftY);\n this.panFoce = this.normalizeForce(this.panFoce);\n this.delay = delay;\n\n life && super.reset(life, easing);\n }\n\n initialize(particle) {\n particle.data.time = 0;\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#RandomDrift\n * @instance\n *\n * @param {Particle} particle\n * @param {Number} \t\t\ttime the integrate time 1/ms\n * @param {Int} \t\t\tindex the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n particle.data.time += time;\n\n if (particle.data.time >= this.delay) {\n particle.a.addXY(\n MathUtil.randomAToB(-this.panFoce.x, this.panFoce.x),\n MathUtil.randomAToB(-this.panFoce.y, this.panFoce.y)\n );\n\n particle.data.time = 0;\n }\n }\n}\n","import Force from \"./Force\";\n\nexport default class Gravity extends Force {\n /**\n * @memberof! Proton#\n * @augments Proton#Proton.Force\n * @constructor\n * @alias Proton.Gravity\n *\n * @param {Number} g \t\t\t\t\t\t\tGravity\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(g, life, easing) {\n super(0, g, life, easing);\n this.name = \"Gravity\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Gravity\n * @instance\n *\n * @param {Number} g \t\t\t\t\t\t\tGravity\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(g, life, easing) {\n super.reset(0, g, life, easing);\n }\n}\n","import Util from \"../utils/Util\";\nimport Vector2D from \"../math/Vector2D\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class Collision extends Behaviour {\n /**\n * The callback after collision\n *\n * @callback Callback\n *\n * @param {Proton.Particle} particle\n * @param {Proton.Paritcle} otherParticle\n */\n /**\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Collision\n *\n * @todo add description to mass\n *\n * @param {Proton.Emitter} \t[emitter=null] \t\tthe attraction point coordinates\n * @param {Boolean} \t\t[mass=true]\n * @param {Callback}\t \t[callback=null]\t\tthe callback after the collision\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(emitter, mass, callback, life, easing) {\n super(life, easing);\n\n this.reset(emitter, mass, callback);\n this.name = \"Collision\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @memberof Proton#Proton.Collision\n * @method reset\n * @instance\n *\n * @todo add description to mass\n *\n * @param {Proton.Emitter} \t[emitter=null] \t\tthe attraction point coordinates\n * @param {Boolean} \t\t[mass=true]\n * @param {Callback}\t \t[callback=null]\t\tthe callback after the collision\n * @param {Number} \t\t\t[life=Infinity] \tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(emitter, mass, callback, life, easing) {\n this.emitter = Util.initValue(emitter, null);\n this.mass = Util.initValue(mass, true);\n this.callback = Util.initValue(callback, null);\n\n this.collisionPool = [];\n this.delta = new Vector2D();\n\n life && super.reset(life, easing);\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @memberof Proton#Proton.Collision\n * @method applyBehaviour\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} \t\t\ttime the integrate time 1/ms\n * @param {Int} \t\t\tindex the particle index\n */\n applyBehaviour(particle, time, index) {\n const newPool = this.emitter ? this.emitter.particles.slice(index) : this.pool.slice(index);\n const length = newPool.length;\n\n let otherParticle;\n let lengthSq;\n let overlap;\n let totalMass;\n let averageMass1, averageMass2;\n let i;\n\n for (i = 0; i < length; i++) {\n otherParticle = newPool[i];\n\n if (otherParticle !== particle) {\n this.delta.copy(otherParticle.p);\n this.delta.sub(particle.p);\n\n lengthSq = this.delta.lengthSq();\n const distance = particle.radius + otherParticle.radius;\n\n if (lengthSq <= distance * distance) {\n overlap = distance - Math.sqrt(lengthSq);\n overlap += 0.5;\n\n totalMass = particle.mass + otherParticle.mass;\n averageMass1 = this.mass ? otherParticle.mass / totalMass : 0.5;\n averageMass2 = this.mass ? particle.mass / totalMass : 0.5;\n\n particle.p.add(\n this.delta\n .clone()\n .normalize()\n .multiplyScalar(overlap * -averageMass1)\n );\n otherParticle.p.add(this.delta.normalize().multiplyScalar(overlap * averageMass2));\n\n this.callback && this.callback(particle, otherParticle);\n }\n }\n }\n }\n}\n","import Util from \"../utils/Util\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class CrossZone extends Behaviour {\n /**\n * Defines what happens if the particles come to the end of the specified zone\n *\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.CrossZone\n *\n * @param {Proton.Zone} zone \t\t\t\t\t\tcan be any Proton.Zone - e.g. Proton.RectZone()\n * @param {String} \t\t[crossType=dead] \t\t\twhat happens if the particles pass the zone - allowed strings: dead | bound | cross\n * @param {Number} \t\t[life=Infinity] \t\t\tthis behaviour's life\n * @param {String} \t\t[easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(zone, crossType, life, easing) {\n super(life, easing);\n\n this.reset(zone, crossType);\n this.name = \"CrossZone\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.CrossZone\n * @instance\n *\n * @param {Proton.Zone} zone \t\t\t\tcan be any Proton.Zone - e.g. Proton.RectZone()\n * @param {String} \t\t[crossType=dead] \twhat happens if the particles pass the zone - allowed strings: dead | bound | cross\n * @param {Number} \t\t[life=Infinity] \tthis behaviour's life\n * @param {String} \t\t[easing=easeLinear]\tthis behaviour's easing\n */\n reset(zone, crossType, life, easing) {\n this.zone = zone;\n this.zone.crossType = Util.initValue(crossType, \"dead\");\n\n life && super.reset(life, easing);\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#Proton.CrossZone\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n this.zone.crossing(particle);\n }\n}\n","import Util from \"../utils/Util\";\nimport Span from \"../math/Span\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class Alpha extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Alpha\n *\n * @todo add description for 'a' and 'b'\n *\n * @param {Number} a\n * @param {String} b\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(a, b, life, easing) {\n super(life, easing);\n\n this.reset(a, b);\n this.name = \"Alpha\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Alpha\n * @instance\n *\n * @todo add description for 'a' and 'b'\n *\n * @param {Number} a\n * @param {String} b\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(a, b, life, easing) {\n this.same = b === null || b === undefined ? true : false;\n this.a = Span.setSpanValue(Util.initValue(a, 1));\n this.b = Span.setSpanValue(b);\n\n life && super.reset(life, easing);\n }\n\n /**\n * Sets the new alpha value of the particle\n *\n * @method initialize\n * @memberof Proton#Proton.Alpha\n * @instance\n *\n * @param {Proton.Particle} particle A single Proton generated particle\n */\n initialize(particle) {\n particle.data.alphaA = this.a.getValue();\n\n if (this.same) particle.data.alphaB = particle.data.alphaA;\n else particle.data.alphaB = this.b.getValue();\n }\n\n /**\n * @method applyBehaviour\n * @memberof Proton#Proton.Alpha\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} \t\t\ttime the integrate time 1/ms\n * @param {Int} \t\t\tindex the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n\n particle.alpha = particle.data.alphaB + (particle.data.alphaA - particle.data.alphaB) * this.energy;\n\n if (particle.alpha < 0.001) particle.alpha = 0;\n }\n}\n","import Span from \"../math/Span\";\nimport Util from \"../utils/Util\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class Scale extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Scale\n *\n * @todo add description for 'a' and 'b'\n *\n * @param {Number} a\n * @param {String} b\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(a, b, life, easing) {\n super(life, easing);\n\n this.reset(a, b);\n this.name = \"Scale\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Scale\n * @instance\n *\n * @param {Number} a\n * @param {String} b\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(a, b, life, easing) {\n this.same = b === null || b === undefined ? true : false;\n this.a = Span.setSpanValue(Util.initValue(a, 1));\n this.b = Span.setSpanValue(b);\n\n life && super.reset(life, easing);\n }\n\n /**\n * Initialize the behaviour's parameters for all particles\n *\n * @method initialize\n * @memberof Proton#Proton.Scale\n * @instance\n *\n * @param {Proton.Particle} particle\n */\n initialize(particle) {\n particle.data.scaleA = this.a.getValue();\n particle.data.oldRadius = particle.radius;\n particle.data.scaleB = this.same ? particle.data.scaleA : this.b.getValue();\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#Proton.Scale\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} \t\t\ttime the integrate time 1/ms\n * @param {Int} \t\t\tindex the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n particle.scale = particle.data.scaleB + (particle.data.scaleA - particle.data.scaleB) * this.energy;\n\n if (particle.scale < 0.0001) particle.scale = 0;\n particle.radius = particle.data.oldRadius * particle.scale;\n }\n}\n","import Span from \"../math/Span\";\nimport Util from \"../utils/Util\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class Rotate extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Rotate\n *\n * @todo add description for 'a', 'b' and 'style'\n *\n * @param {String} [influence=Velocity] The rotation's influence\n * @param {String} b\n * @param {String} [style=to]\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(influence, b, style, life, easing) {\n super(life, easing);\n\n this.reset(influence, b, style);\n this.name = \"Rotate\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Rotate\n * @instance\n *\n * @todo add description for 'a', 'b' and 'style'\n *\n * @param {String} a\n * @param {String} b\n * @param {String} [style=to]\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(a, b, style, life, easing) {\n this.same = b === null || b === undefined ? true : false;\n\n this.a = Span.setSpanValue(Util.initValue(a, \"Velocity\"));\n this.b = Span.setSpanValue(Util.initValue(b, 0));\n this.style = Util.initValue(style, \"to\");\n\n life && super.reset(life, easing);\n }\n\n /**\n * Initialize the behaviour's parameters for all particles\n *\n * @method initialize\n * @memberof Proton#Proton.Rotate\n * @instance\n *\n * @param {Proton.Particle} particle\n */\n initialize(particle) {\n particle.rotation = this.a.getValue();\n particle.data.rotationA = this.a.getValue();\n\n if (!this.same) particle.data.rotationB = this.b.getValue();\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#Proton.Rotate\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} \t\t\ttime the integrate time 1/ms\n * @param {Int} \t\t\tindex the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n\n if (!this.same) {\n if (this.style === \"to\" || this.style === \"TO\" || this.style === \"_\") {\n particle.rotation +=\n particle.data.rotationB + (particle.data.rotationA - particle.data.rotationB) * this.energy;\n } else {\n particle.rotation += particle.data.rotationB;\n }\n } else if (this.a.a === \"V\" || this.a.a === \"Velocity\" || this.a.a === \"v\") {\n // beta...\n particle.rotation = particle.getDirection();\n }\n }\n}\n","import ColorUtil from \"../utils/ColorUtil\";\nimport ArraySpan from \"../math/ArraySpan\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class Color extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Color\n *\n * @param {Proton.ArraySpan | String} a the string should be a hex e.g. #000000 for black\n * @param {Proton.ArraySpan | String} b the string should be a hex e.g. #000000 for black\n * @param {Number} [life=Infinity] \tthis behaviour's life\n * @param {String} [easing=easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(a, b, life, easing) {\n super(life, easing);\n\n this.reset(a, b);\n this.name = \"Color\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Color\n * @instance\n *\n * @param {Proton.ArraySpan | String} a the string should be a hex e.g. #000000 for black\n * @param {Proton.ArraySpan | String} b the string should be a hex e.g. #000000 for black\n * @param {Number} [life=Infinity] \tthis behaviour's life\n * @param {String} [easing=easeLinear] \tthis behaviour's easing\n */\n reset(a, b, life, easing) {\n this.a = ArraySpan.createArraySpan(a);\n this.b = ArraySpan.createArraySpan(b);\n life && super.reset(life, easing);\n }\n\n /**\n * Initialize the behaviour's parameters for all particles\n *\n * @method initialize\n * @memberof Proton#Proton.Color\n * @instance\n *\n * @param {Proton.Particle} particle\n */\n initialize(particle) {\n particle.color = this.a.getValue();\n particle.data.colorA = ColorUtil.hexToRgb(particle.color);\n\n if (this.b) particle.data.colorB = ColorUtil.hexToRgb(this.b.getValue());\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#Proton.Color\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n applyBehaviour(particle, time, index) {\n if (this.b) {\n this.calculate(particle, time, index);\n\n particle.rgb.r = particle.data.colorB.r + (particle.data.colorA.r - particle.data.colorB.r) * this.energy;\n particle.rgb.g = particle.data.colorB.g + (particle.data.colorA.g - particle.data.colorB.g) * this.energy;\n particle.rgb.b = particle.data.colorB.b + (particle.data.colorA.b - particle.data.colorB.b) * this.energy;\n\n particle.rgb.r = particle.rgb.r << 0;\n particle.rgb.g = particle.rgb.g << 0;\n particle.rgb.b = particle.rgb.b << 0;\n } else {\n particle.rgb.r = particle.data.colorA.r;\n particle.rgb.g = particle.data.colorA.g;\n particle.rgb.b = particle.data.colorA.b;\n }\n }\n}\n","import MathUtil from \"../math/MathUtil\";\nimport Vector2D from \"../math/Vector2D\";\nimport Span from \"../math/Span\";\nimport Behaviour from \"./Behaviour\";\n\nconst CHANGING = \"changing\";\n\nexport default class Cyclone extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Cyclone\n *\n * @param {Number} angle\n * @param {Number} force\n * @param {Number} [life=Infinity] \t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(angle, force, life, easing) {\n super(life, easing);\n this.setAngleAndForce(angle, force);\n this.name = \"Cyclone\";\n }\n\n setAngleAndForce(angle, force) {\n this.force = CHANGING;\n this.angle = MathUtil.PI / 2;\n\n if (angle === \"right\") {\n this.angle = MathUtil.PI / 2;\n } else if (angle === \"left\") {\n this.angle = -MathUtil.PI / 2;\n } else if (angle === \"random\") {\n this.angle = \"random\";\n } else if (angle instanceof Span) {\n this.angle = \"span\";\n this.span = angle;\n } else if (angle) {\n this.angle = angle;\n }\n\n if (\n String(force).toLowerCase() === \"changing\" ||\n String(force).toLowerCase() === \"chang\" ||\n String(force).toLowerCase() === \"auto\"\n ) {\n this.force = CHANGING;\n } else if (force) {\n this.force = force;\n }\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Cyclone\n * @instance\n *\n * @param {Number} angle\n * @param {Number} force\n * @param {Number} [life=Infinity] \t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(angle, force, life, easing) {\n this.angle = MathUtil.PI / 2;\n this.setAngleAndForce(angle, force);\n life && super.reset(life, easing);\n }\n\n initialize(particle) {\n if (this.angle === \"random\") {\n particle.data.cangle = MathUtil.randomAToB(-MathUtil.PI, MathUtil.PI);\n } else if (this.angle === \"span\") {\n particle.data.cangle = this.span.getValue();\n }\n\n particle.data.cyclone = new Vector2D(0, 0);\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#Proton.Cyclone\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n\n let length;\n let gradient = particle.v.getGradient();\n if (this.angle === \"random\" || this.angle === \"span\") {\n gradient += particle.data.cangle;\n } else {\n gradient += this.angle;\n }\n\n if (this.force === CHANGING) {\n length = particle.v.length() / 100;\n } else {\n length = this.force;\n }\n\n particle.data.cyclone.x = length * Math.cos(gradient);\n particle.data.cyclone.y = length * Math.sin(gradient);\n particle.data.cyclone = this.normalizeForce(particle.data.cyclone);\n particle.a.add(particle.data.cyclone);\n }\n}\n","import Attraction from \"./Attraction\";\n\nexport default class Repulsion extends Attraction {\n /**\n * The oppisite of Proton.Attraction - turns the force\n *\n * @memberof! Proton#\n * @augments Proton#Proton.Attraction\n * @constructor\n * @alias Proton.Repulsion\n *\n * @todo add description for 'force' and 'radius'\n *\n * @param {Proton.Vector2D} targetPosition the attraction point coordinates\n * @param {Number} [force=100]\n * @param {Number} [radius=1000]\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {Number} force\n * @property {String} name The Behaviour name\n */\n constructor(targetPosition, force, radius, life, easing) {\n super(targetPosition, force, radius, life, easing);\n\n this.force *= -1;\n this.name = \"Repulsion\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Repulsion\n * @instance\n *\n * @todo add description for 'force' and 'radius'\n *\n * @param {Proton.Vector2D} targetPosition the attraction point coordinates\n * @param {Number} [force=100]\n * @param {Number} [radius=1000]\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(targetPosition, force, radius, life, easing) {\n super.reset(targetPosition, force, radius, life, easing);\n this.force *= -1;\n }\n}\n","import Util from \"../utils/Util\";\nimport Vector2D from \"../math/Vector2D\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class GravityWell extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Behaviour\n * @constructor\n * @alias GravityWell\n *\n * @param {Vector2D} [centerPoint=new Vector2D] The point in the center\n * @param {Number} [force=100]\t\t\t\t\tThe force\n * @param {Number} [life=Infinity]\t\t\t\tthis behaviour's life\n * @param {String} [easing=easeLinear]\tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(centerPoint, force, life, easing) {\n super(life, easing);\n\n this.distanceVec = new Vector2D();\n this.centerPoint = Util.initValue(centerPoint, new Vector2D());\n this.force = Util.initValue(this.normalizeValue(force), 100);\n\n this.name = \"GravityWell\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#GravityWell\n * @instance\n *\n * @param {Vector2D} [centerPoint=new Vector2D] The point in the center\n * @param {Number} [force=100]\t\t\t\t\tThe force\n * @param {Number} [life=Infinity]\t\t\t\tthis behaviour's life\n * @param {String} [easing=easeLinear]\tthis behaviour's easing\n */\n reset(centerPoint, force, life, easing) {\n this.distanceVec = new Vector2D();\n this.centerPoint = Util.initValue(centerPoint, new Vector2D());\n this.force = Util.initValue(this.normalizeValue(force), 100);\n\n life && super.reset(life, easing);\n }\n\n /**\n * @inheritdoc\n */\n initialize(particle) {}\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#GravityWell\n * @instance\n *\n * @param {Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n applyBehaviour(particle, time, index) {\n this.distanceVec.set(this.centerPoint.x - particle.p.x, this.centerPoint.y - particle.p.y);\n const distanceSq = this.distanceVec.lengthSq();\n\n if (distanceSq !== 0) {\n const distance = this.distanceVec.length();\n const factor = (this.force * time) / (distanceSq * distance);\n\n particle.v.x += factor * this.distanceVec.x;\n particle.v.y += factor * this.distanceVec.y;\n }\n }\n}\n","import PropUtil from \"../utils/PropUtil\";\nimport Initialize from \"./Initialize\";\nimport MathUtil from \"../math/MathUtil\";\n\nexport default {\n initialize(emitter, particle, initializes) {\n const length = initializes.length;\n let i;\n\n for (i = 0; i < length; i++) {\n if (initializes[i] instanceof Initialize) {\n initializes[i].init(emitter, particle);\n } else {\n this.init(emitter, particle, initializes[i]);\n }\n }\n\n this.bindEmitter(emitter, particle);\n },\n\n // init\n init(emitter, particle, initialize) {\n PropUtil.setProp(particle, initialize);\n PropUtil.setVectorVal(particle, initialize);\n },\n\n bindEmitter(emitter, particle) {\n if (emitter.bindEmitter) {\n particle.p.add(emitter.p);\n particle.v.add(emitter.v);\n particle.a.add(emitter.a);\n\n particle.v.rotate(MathUtil.degreeTransform(emitter.rotation));\n }\n }\n};\n","import Util from \"../utils/Util\";\nimport Puid from \"../utils/Puid\";\nimport Particle from \"../core/Particle\";\nimport EventDispatcher from \"../events/EventDispatcher\";\n\nimport Rate from \"../initialize/Rate\";\nimport InitializeUtil from \"../initialize/InitializeUtil\";\n\nexport default class Emitter extends Particle {\n /**\n * You can use this emit particles.\n *\n * It will dispatch follow events:\n * PARTICLE_CREATED\n * PARTICLE_UPDATA\n * PARTICLE_DEAD\n *\n * @class Emitter\n * @constructor\n * @param {Object} conf the parameters object;\n * for example {damping:0.01,bindEmitter:false}\n */\n constructor(conf = {}) {\n super(conf);\n\n this.particles = [];\n this.behaviours = [];\n this.initializes = [];\n\n this.emitTime = 0;\n this.emitSpeed = 0;\n this.totalTime = -1;\n\n /**\n * The friction coefficient for all particle emit by This;\n * @property damping\n * @type {Number}\n * @default 0.006\n */\n this.damping = 0.006;\n\n /**\n * If bindEmitter the particles can bind this emitter's property;\n * @property bindEmitter\n * @type {Boolean}\n * @default true\n */\n this.bindEmitter = true;\n\n /**\n * The number of particles per second emit (a [particle]/b [s]);\n * @property rate\n * @type {Rate}\n * @default Rate(1, .1)\n */\n this.rate = new Rate(1, 0.1);\n\n this.name = \"Emitter\";\n this.id = Puid.id(this.name);\n }\n\n /**\n * start emit particle\n * @method emit\n * @param {Number} emitTime begin emit time;\n * @param {String} life the life of this emitter\n */\n emit(totalTime, life) {\n this.stoped = false;\n this.emitTime = 0;\n this.totalTime = Util.initValue(totalTime, Infinity);\n\n if (life === true || life === \"life\" || life === \"destroy\") {\n this.life = totalTime === \"once\" ? 1 : this.totalTime;\n } else if (!isNaN(life)) {\n this.life = life;\n }\n\n this.rate.init();\n }\n\n /**\n * stop emiting\n * @method stop\n */\n stop() {\n this.totalTime = -1;\n this.emitTime = 0;\n this.stoped = true;\n }\n\n preEmit(time) {\n let oldStoped = this.stoped;\n let oldEmitTime = this.emitTime;\n let oldTotalTime = this.totalTime;\n\n this.stoped = false;\n this.emitTime = 0;\n this.totalTime = time;\n this.rate.init();\n\n const step = 0.0167;\n while (time > step) {\n time -= step;\n this.update(step);\n }\n\n this.stoped = oldStoped;\n this.emitTime = oldEmitTime + Math.max(time, 0);\n this.totalTime = oldTotalTime;\n }\n\n /**\n * remove current all particles\n * @method removeAllParticles\n */\n removeAllParticles() {\n let i = this.particles.length;\n while (i--) this.particles[i].dead = true;\n }\n\n /**\n * add initialize to this emitter\n * @method addSelfInitialize\n */\n addSelfInitialize(initialize) {\n if (initialize[\"init\"]) {\n initialize.init(this);\n } else {\n this.initAll();\n }\n }\n\n /**\n * add the Initialize to particles;\n *\n * you can use initializes array:for example emitter.addInitialize(initialize1,initialize2,initialize3);\n * @method addInitialize\n * @param {Initialize} initialize like this new Radius(1, 12)\n */\n addInitialize(...rest) {\n let i = rest.length;\n while (i--) this.initializes.push(rest[i]);\n }\n\n /**\n * remove the Initialize\n * @method removeInitialize\n * @param {Initialize} initialize a initialize\n */\n removeInitialize(initializer) {\n const index = this.initializes.indexOf(initializer);\n if (index > -1) this.initializes.splice(index, 1);\n }\n\n /**\n * remove all Initializes\n * @method removeInitializers\n */\n removeAllInitializers() {\n Util.emptyArray(this.initializes);\n }\n\n /**\n * add the Behaviour to particles;\n *\n * you can use Behaviours array:emitter.addBehaviour(Behaviour1,Behaviour2,Behaviour3);\n * @method addBehaviour\n * @param {Behaviour} behaviour like this new Color('random')\n */\n addBehaviour(...rest) {\n let i = arguments.length;\n while (i--) {\n let behaviour = rest[i];\n this.behaviours.push(behaviour);\n if (behaviour.parents) behaviour.parents.push(this);\n }\n }\n\n /**\n * remove the Behaviour\n * @method removeBehaviour\n * @param {Behaviour} behaviour a behaviour\n */\n removeBehaviour(behaviour) {\n let index = this.behaviours.indexOf(behaviour);\n this.behaviours.splice(index, 1);\n\n if (behaviour.parents) {\n index = behaviour.parents.indexOf(behaviour);\n behaviour.parents.splice(index, 1);\n }\n\n return index;\n }\n\n /**\n * remove all behaviours\n * @method removeAllBehaviours\n */\n removeAllBehaviours() {\n Util.emptyArray(this.behaviours);\n }\n\n // emitter update\n update(time) {\n this.age += time;\n if (this.age >= this.life || this.dead) this.destroy();\n\n this.emitting(time);\n this.integrate(time);\n }\n\n integrate(time) {\n if (!this.parent) return;\n\n const damping = 1 - this.damping;\n this.parent.integrator.calculate(this, time, damping);\n\n const length = this.particles.length;\n let i, particle;\n\n for (i = length - 1; i >= 0; i--) {\n particle = this.particles[i];\n\n // particle update\n particle.update(time, i);\n this.parent.integrator.calculate(particle, time, damping);\n this.dispatch(\"PARTICLE_UPDATE\", particle);\n\n // check dead\n if (particle.dead) {\n this.dispatch(\"PARTICLE_DEAD\", particle);\n\n this.parent.pool.expire(particle);\n this.particles.splice(i, 1);\n }\n }\n }\n\n dispatch(event, target) {\n this.parent && this.parent.dispatchEvent(event, target);\n this.bindEvent && this.dispatchEvent(event, target);\n }\n\n emitting(time) {\n if (this.totalTime === \"once\") {\n let i;\n const length = this.rate.getValue(99999);\n\n if (length > 0) this.emitSpeed = length;\n for (i = 0; i < length; i++) this.createParticle();\n this.totalTime = \"none\";\n } else {\n this.emitTime += time;\n\n if (this.emitTime < this.totalTime) {\n const length = this.rate.getValue(time);\n let i;\n\n if (length > 0) this.emitSpeed = length;\n for (i = 0; i < length; i++) this.createParticle();\n }\n }\n }\n\n /**\n * create single particle;\n *\n * can use emit({x:10},new Gravity(10),{'particleUpdate',fun}) or emit([{x:10},new Initialize],new Gravity(10),{'particleUpdate',fun})\n * @method removeAllParticles\n */\n createParticle(initialize, behaviour) {\n const particle = this.parent.pool.get(Particle);\n this.setupParticle(particle, initialize, behaviour);\n this.dispatch(\"PARTICLE_CREATED\", particle);\n\n return particle;\n }\n\n setupParticle(particle, initialize, behaviour) {\n let initializes = this.initializes;\n let behaviours = this.behaviours;\n\n if (initialize) initializes = Util.toArray(initialize);\n if (behaviour) behaviours = Util.toArray(behaviour);\n\n particle.reset();\n InitializeUtil.initialize(this, particle, initializes);\n particle.addBehaviours(behaviours);\n particle.parent = this;\n\n this.particles.push(particle);\n }\n\n remove() {\n this.stop();\n Util.destroyAll(this.particles);\n }\n\n /**\n * Destory this Emitter\n * @method destroy\n */\n destroy() {\n this.dead = true;\n this.remove();\n this.removeAllInitializers();\n this.removeAllBehaviours();\n this.parent && this.parent.removeEmitter(this);\n }\n}\n\nEventDispatcher.bind(Emitter);\n","import Types from \"../utils/Types\";\nimport ColorUtil from \"../utils/ColorUtil\";\nimport MathUtil from \"../math/MathUtil\";\nimport BaseRenderer from \"./BaseRenderer\";\n\nlet PIXIClass;\nexport default class PixiRenderer extends BaseRenderer {\n constructor(element, stroke) {\n super(element);\n\n this.stroke = stroke;\n this.color = false;\n this.setColor = false;\n this.blendMode = null;\n this.pool.create = (body, particle) => this.createBody(body, particle);\n this.setPIXI(window.PIXI);\n\n this.name = \"PixiRenderer\";\n }\n\n setPIXI(PIXI) {\n try {\n PIXIClass = PIXI || { Sprite: {} };\n this.createFromImage = PIXIClass.Sprite.from || PIXIClass.Sprite.fromImage;\n } catch (e) {}\n }\n\n onProtonUpdate() {}\n\n /**\n * @param particle\n */\n onParticleCreated(particle) {\n if (particle.body) {\n particle.body = this.pool.get(particle.body, particle);\n } else {\n particle.body = this.pool.get(this.circleConf, particle);\n }\n\n if (this.blendMode) {\n particle.body.blendMode = this.blendMode;\n }\n\n this.element.addChild(particle.body);\n }\n\n /**\n * @param particle\n */\n onParticleUpdate(particle) {\n this.transform(particle, particle.body);\n\n if (this.setColor === true || this.color === true) {\n particle.body.tint = ColorUtil.getHex16FromParticle(particle);\n }\n }\n\n /**\n * @param particle\n */\n onParticleDead(particle) {\n this.element.removeChild(particle.body);\n this.pool.expire(particle.body);\n particle.body = null;\n }\n\n transform(particle, target) {\n target.x = particle.p.x;\n target.y = particle.p.y;\n\n target.alpha = particle.alpha;\n\n target.scale.x = particle.scale;\n target.scale.y = particle.scale;\n\n // using cached version of MathUtil.PI_180 for slight performance increase.\n target.rotation = particle.rotation * MathUtil.PI_180; // MathUtil.PI_180;\n }\n\n createBody(body, particle) {\n if (body.isCircle) return this.createCircle(particle);\n else return this.createSprite(body);\n }\n\n createSprite(body) {\n const sprite = body.isInner ? this.createFromImage(body.src) : new PIXIClass.Sprite(body);\n\n sprite.anchor.x = 0.5;\n sprite.anchor.y = 0.5;\n\n return sprite;\n }\n\n createCircle(particle) {\n const graphics = new PIXIClass.Graphics();\n\n if (this.stroke) {\n const stroke = Types.isString(this.stroke) ? this.stroke : 0x000000;\n graphics.beginStroke(stroke);\n }\n\n graphics.beginFill(particle.color || 0x008ced);\n graphics.drawCircle(0, 0, particle.radius);\n graphics.endFill();\n\n return graphics;\n }\n\n destroy(particles) {\n super.destroy();\n\n let i = particles.length;\n while (i--) {\n let particle = particles[i];\n if (particle.body) {\n this.element.removeChild(particle.body);\n }\n }\n }\n}\n","import Emitter from \"./Emitter\";\n\nexport default class BehaviourEmitter extends Emitter {\n /**\n * The BehaviourEmitter class inherits from Proton.Emitter\n *\n * use the BehaviourEmitter you can add behaviours to self;\n * @class Proton.BehaviourEmitter\n * @constructor\n * @param {Object} conf the parameters object;\n */\n constructor(conf) {\n super(conf);\n\n this.selfBehaviours = [];\n }\n\n /**\n * add the Behaviour to emitter;\n *\n * you can use Behaviours array:emitter.addSelfBehaviour(Behaviour1,Behaviour2,Behaviour3);\n * @method addSelfBehaviour\n * @param {Proton.Behaviour} behaviour like this new Proton.Color('random')\n */\n addSelfBehaviour(...rest) {\n let i,\n length = rest.length;\n\n for (i = 0; i < length; i++) {\n let behaviour = rest[i];\n this.selfBehaviours.push(behaviour);\n behaviour.initialize(this);\n }\n }\n\n /**\n * remove the Behaviour for self\n * @method removeSelfBehaviour\n * @param {Proton.Behaviour} behaviour a behaviour\n */\n removeSelfBehaviour(behaviour) {\n const index = this.selfBehaviours.indexOf(behaviour);\n if (index > -1) this.selfBehaviours.splice(index, 1);\n }\n\n update(time) {\n super.update(time);\n\n if (!this.sleep) {\n const length = this.selfBehaviours.length;\n let i;\n\n for (i = 0; i < length; i++) {\n this.selfBehaviours[i].applyBehaviour(this, time, i);\n }\n }\n }\n}\n","import Util from \"../utils/Util\";\nimport Emitter from \"./Emitter\";\n\nexport default class FollowEmitter extends Emitter {\n /**\n * The FollowEmitter class inherits from Proton.Emitter\n *\n * use the FollowEmitter will emit particle when mousemoving\n *\n * @class Proton.FollowEmitter\n * @constructor\n * @param {Element} mouseTarget mouseevent's target;\n * @param {Number} ease the easing of following speed;\n * @default 0.7\n * @param {Object} conf the parameters object;\n */\n constructor(mouseTarget, ease, conf) {\n super(conf);\n\n this.mouseTarget = Util.initValue(mouseTarget, window);\n this.ease = Util.initValue(ease, 0.7);\n\n this._allowEmitting = false;\n this.initEventHandler();\n }\n\n initEventHandler() {\n this.mousemoveHandler = e => this.mousemove.call(this, e);\n this.mousedownHandler = e => this.mousedown.call(this, e);\n this.mouseupHandler = e => this.mouseup.call(this, e);\n this.mouseTarget.addEventListener(\"mousemove\", this.mousemoveHandler, false);\n }\n\n /**\n * start emit particle\n * @method emit\n */\n emit() {\n this._allowEmitting = true;\n }\n\n /**\n * stop emiting\n * @method stop\n */\n stop() {\n this._allowEmitting = false;\n }\n\n mousemove(e) {\n if (e.layerX || e.layerX === 0) {\n this.p.x += (e.layerX - this.p.x) * this.ease;\n this.p.y += (e.layerY - this.p.y) * this.ease;\n } else if (e.offsetX || e.offsetX === 0) {\n this.p.x += (e.offsetX - this.p.x) * this.ease;\n this.p.y += (e.offsetY - this.p.y) * this.ease;\n }\n\n if (this._allowEmitting) super.emit(\"once\");\n }\n\n /**\n * Destory this Emitter\n * @method destroy\n */\n destroy() {\n super.destroy();\n this.mouseTarget.removeEventListener(\"mousemove\", this.mousemoveHandler, false);\n }\n}\n","export default {\n /**\n * Determine whether it is a picture object\n *\n * @return {boolean} is or no\n */\n isImage(obj) {\n if (!obj) return false;\n\n const tagName = `${obj.tagName}`.toUpperCase();\n const nodeName = `${obj.nodeName}`.toUpperCase();\n if (nodeName === \"IMG\" || tagName === \"IMG\") return true;\n return false;\n },\n\n /**\n * Determine whether it is a string object\n *\n * @return {boolean} is or no\n */\n isString(obj) {\n return typeof obj === \"string\";\n }\n};\n","import Pool from \"../core/Pool\";\n\nexport default class BaseRenderer {\n constructor(element, stroke) {\n this.pool = new Pool();\n this.element = element;\n this.stroke = stroke;\n this.circleConf = { isCircle: true };\n\n this.initEventHandler();\n this.name = \"BaseRenderer\";\n }\n\n setStroke(color = \"#000000\", thinkness = 1) {\n this.stroke = { color, thinkness };\n }\n\n initEventHandler() {\n this._protonUpdateHandler = () => {\n this.onProtonUpdate.call(this);\n };\n\n this._protonUpdateAfterHandler = () => {\n this.onProtonUpdateAfter.call(this);\n };\n\n this._emitterAddedHandler = emitter => {\n this.onEmitterAdded.call(this, emitter);\n };\n\n this._emitterRemovedHandler = emitter => {\n this.onEmitterRemoved.call(this, emitter);\n };\n\n this._particleCreatedHandler = particle => {\n this.onParticleCreated.call(this, particle);\n };\n\n this._particleUpdateHandler = particle => {\n this.onParticleUpdate.call(this, particle);\n };\n\n this._particleDeadHandler = particle => {\n this.onParticleDead.call(this, particle);\n };\n }\n\n init(proton) {\n this.parent = proton;\n\n proton.addEventListener(\"PROTON_UPDATE\", this._protonUpdateHandler);\n proton.addEventListener(\"PROTON_UPDATE_AFTER\", this._protonUpdateAfterHandler);\n\n proton.addEventListener(\"EMITTER_ADDED\", this._emitterAddedHandler);\n proton.addEventListener(\"EMITTER_REMOVED\", this._emitterRemovedHandler);\n\n proton.addEventListener(\"PARTICLE_CREATED\", this._particleCreatedHandler);\n proton.addEventListener(\"PARTICLE_UPDATE\", this._particleUpdateHandler);\n proton.addEventListener(\"PARTICLE_DEAD\", this._particleDeadHandler);\n }\n\n resize(width, height) {}\n\n destroy() {\n this.remove();\n this.pool.destroy();\n this.pool = null;\n this.element = null;\n this.stroke = null;\n }\n\n remove(proton) {\n this.parent.removeEventListener(\"PROTON_UPDATE\", this._protonUpdateHandler);\n this.parent.removeEventListener(\"PROTON_UPDATE_AFTER\", this._protonUpdateAfterHandler);\n\n this.parent.removeEventListener(\"EMITTER_ADDED\", this._emitterAddedHandler);\n this.parent.removeEventListener(\"EMITTER_REMOVED\", this._emitterRemovedHandler);\n\n this.parent.removeEventListener(\"PARTICLE_CREATED\", this._particleCreatedHandler);\n this.parent.removeEventListener(\"PARTICLE_UPDATE\", this._particleUpdateHandler);\n this.parent.removeEventListener(\"PARTICLE_DEAD\", this._particleDeadHandler);\n\n this.parent = null;\n }\n\n onProtonUpdate() {}\n onProtonUpdateAfter() {}\n\n onEmitterAdded(emitter) {}\n onEmitterRemoved(emitter) {}\n\n onParticleCreated(particle) {}\n onParticleUpdate(particle) {}\n onParticleDead(particle) {}\n}\n","import Types from \"../utils/Types\";\nimport ImgUtil from \"../utils/ImgUtil\";\nimport ColorUtil from \"../utils/ColorUtil\";\nimport MathUtil from \"../math/MathUtil\";\nimport BaseRenderer from \"./BaseRenderer\";\n\nexport default class CanvasRenderer extends BaseRenderer {\n constructor(element) {\n super(element);\n\n this.stroke = null;\n this.context = this.element.getContext(\"2d\");\n this.bufferCache = {};\n this.name = \"CanvasRenderer\";\n }\n\n resize(width, height) {\n this.element.width = width;\n this.element.height = height;\n }\n\n onProtonUpdate() {\n this.context.clearRect(0, 0, this.element.width, this.element.height);\n }\n\n onParticleCreated(particle) {\n if (particle.body) {\n ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle);\n } else {\n particle.color = particle.color || \"#ff0000\";\n }\n }\n\n onParticleUpdate(particle) {\n if (particle.body) {\n if (Types.isImage(particle.body)) {\n this.drawImage(particle);\n }\n } else {\n this.drawCircle(particle);\n }\n }\n\n onParticleDead(particle) {\n particle.body = null;\n }\n\n // private method\n addImg2Body(img, particle) {\n particle.body = img;\n }\n\n // private drawImage method\n drawImage(particle) {\n const w = (particle.body.width * particle.scale) | 0;\n const h = (particle.body.height * particle.scale) | 0;\n const x = particle.p.x - w / 2;\n const y = particle.p.y - h / 2;\n\n if (!!particle.color) {\n if (!particle.data[\"buffer\"]) particle.data.buffer = this.createBuffer(particle.body);\n\n const bufContext = particle.data.buffer.getContext(\"2d\");\n bufContext.clearRect(0, 0, particle.data.buffer.width, particle.data.buffer.height);\n bufContext.globalAlpha = particle.alpha;\n bufContext.drawImage(particle.body, 0, 0);\n\n bufContext.globalCompositeOperation = \"source-atop\";\n bufContext.fillStyle = ColorUtil.rgbToHex(particle.rgb);\n bufContext.fillRect(0, 0, particle.data.buffer.width, particle.data.buffer.height);\n bufContext.globalCompositeOperation = \"source-over\";\n bufContext.globalAlpha = 1;\n\n this.context.drawImage(\n particle.data.buffer,\n 0,\n 0,\n particle.data.buffer.width,\n particle.data.buffer.height,\n x,\n y,\n w,\n h\n );\n } else {\n this.context.save();\n\n this.context.globalAlpha = particle.alpha;\n this.context.translate(particle.p.x, particle.p.y);\n this.context.rotate(MathUtil.degreeTransform(particle.rotation));\n this.context.translate(-particle.p.x, -particle.p.y);\n this.context.drawImage(particle.body, 0, 0, particle.body.width, particle.body.height, x, y, w, h);\n\n this.context.globalAlpha = 1;\n this.context.restore();\n }\n }\n\n // private drawCircle --\n drawCircle(particle) {\n if (particle.rgb) {\n this.context.fillStyle = `rgba(${particle.rgb.r},${particle.rgb.g},${particle.rgb.b},${particle.alpha})`;\n } else {\n this.context.fillStyle = particle.color;\n }\n\n // draw circle\n this.context.beginPath();\n this.context.arc(particle.p.x, particle.p.y, particle.radius, 0, Math.PI * 2, true);\n\n if (this.stroke) {\n this.context.strokeStyle = this.stroke.color;\n this.context.lineWidth = this.stroke.thinkness;\n this.context.stroke();\n }\n\n this.context.closePath();\n this.context.fill();\n }\n\n // private createBuffer\n createBuffer(image) {\n if (Types.isImage(image)) {\n const size = image.width + \"_\" + image.height;\n let canvas = this.bufferCache[size];\n\n if (!canvas) {\n canvas = document.createElement(\"canvas\");\n canvas.width = image.width;\n canvas.height = image.height;\n this.bufferCache[size] = canvas;\n }\n\n return canvas;\n }\n }\n\n destroy() {\n super.destroy();\n this.stroke = null;\n this.context = null;\n this.bufferCache = null;\n }\n}\n","import DomUtil from \"../utils/DomUtil\";\nimport ImgUtil from \"../utils/ImgUtil\";\nimport BaseRenderer from \"./BaseRenderer\";\n\nexport default class DomRenderer extends BaseRenderer {\n constructor(element) {\n super(element);\n\n this.stroke = null;\n this.transform3d = false;\n this.pool.create = (body, particle) => this.createBody(body, particle);\n this.addImg2Body = this.addImg2Body.bind(this);\n\n this.name = \"DomRenderer\";\n }\n\n onParticleCreated(particle) {\n if (particle.body) {\n ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle);\n } else {\n particle.body = this.pool.get(this.circleConf, particle);\n this.element.appendChild(particle.body);\n }\n }\n\n onParticleUpdate(particle) {\n if (this.bodyReady(particle)) {\n if (this.transform3d) {\n DomUtil.transform3d(particle.body, particle.p.x, particle.p.y, particle.scale, particle.rotation);\n } else {\n DomUtil.transform(particle.body, particle.p.x, particle.p.y, particle.scale, particle.rotation);\n }\n\n particle.body.style.opacity = particle.alpha;\n\n if (particle.body.isCircle) {\n particle.body.style.backgroundColor = particle.color || \"#ff0000\";\n }\n }\n }\n\n onParticleDead(particle) {\n if (this.bodyReady(particle)) {\n this.element.removeChild(particle.body);\n this.pool.expire(particle.body);\n particle.body = null;\n }\n }\n\n bodyReady(particle) {\n return typeof particle.body === \"object\" && particle.body && !particle.body.isInner;\n }\n\n // private method\n addImg2Body(img, particle) {\n if (particle.dead) return;\n particle.body = this.pool.get(img, particle);\n DomUtil.resize(particle.body, img.width, img.height);\n\n this.element.appendChild(particle.body);\n }\n\n createBody(body, particle) {\n if (body.isCircle) return this.createCircle(particle);\n return this.createSprite(body, particle);\n }\n\n // private methods\n createCircle(particle) {\n const dom = DomUtil.createDiv(`${particle.id}_dom`, 2 * particle.radius, 2 * particle.radius);\n dom.style.borderRadius = `${particle.radius}px`;\n\n if (this.stroke) {\n dom.style.borderColor = this.stroke.color;\n dom.style.borderWidth = `${this.stroke.thinkness}px`;\n }\n dom.isCircle = true;\n\n return dom;\n }\n\n createSprite(body, particle) {\n const url = typeof body === \"string\" ? body : body.src;\n const dom = DomUtil.createDiv(`${particle.id}_dom`, body.width, body.height);\n dom.style.backgroundImage = `url(${url})`;\n\n return dom;\n }\n\n destroy() {\n super.destroy();\n this.stroke = null;\n }\n}\n","import Types from \"../utils/Types\";\nimport BaseRenderer from \"./BaseRenderer\";\n\nexport default class EaselRenderer extends BaseRenderer {\n constructor(element, stroke) {\n super(element);\n\n this.stroke = stroke;\n this.name = \"EaselRenderer\";\n }\n\n onParticleCreated(particle) {\n if (particle.body) {\n this.createSprite(particle);\n } else {\n this.createCircle(particle);\n }\n\n this.element.addChild(particle.body);\n }\n\n onParticleUpdate(particle) {\n if (particle.body) {\n particle.body.x = particle.p.x;\n particle.body.y = particle.p.y;\n\n particle.body.alpha = particle.alpha;\n particle.body.scaleX = particle.body.scaleY = particle.scale;\n particle.body.rotation = particle.rotation;\n }\n }\n\n onParticleDead(particle) {\n if (particle.body) {\n particle.body.parent && particle.body.parent.removeChild(particle.body);\n this.pool.expire(particle.body);\n particle.body = null;\n }\n\n if (particle.graphics) this.pool.expire(particle.graphics);\n }\n\n // private\n createSprite(particle) {\n particle.body = this.pool.get(particle.body);\n\n if (particle.body.parent) return;\n if (particle.body[\"image\"]) {\n particle.body.regX = particle.body.image.width / 2;\n particle.body.regY = particle.body.image.height / 2;\n }\n }\n\n createCircle(particle) {\n const graphics = this.pool.get(createjs.Graphics);\n\n if (this.stroke) {\n if (Types.isString(this.stroke)) {\n graphics.beginStroke(this.stroke);\n } else {\n graphics.beginStroke(\"#000000\");\n }\n }\n graphics.beginFill(particle.color || \"#ff0000\").drawCircle(0, 0, particle.radius);\n const shape = this.pool.get(createjs.Shape, [graphics]);\n\n particle.body = shape;\n particle.graphics = graphics;\n }\n\n destroy() {\n super.destroy();\n this.stroke = null;\n }\n}\n","import Rectangle from \"../math/Rectangle\";\nimport BaseRenderer from \"./BaseRenderer\";\n\nexport default class PixelRenderer extends BaseRenderer {\n constructor(element, rectangle) {\n super(element);\n\n this.context = this.element.getContext(\"2d\");\n this.imageData = null;\n this.rectangle = rectangle;\n this.createImageData(rectangle);\n\n this.name = \"PixelRenderer\";\n }\n\n resize(width, height) {\n this.element.width = width;\n this.element.height = height;\n }\n\n createImageData(rectangle) {\n this.rectangle = rectangle ? rectangle : new Rectangle(0, 0, this.element.width, this.element.height);\n this.imageData = this.context.createImageData(this.rectangle.width, this.rectangle.height);\n this.context.putImageData(this.imageData, this.rectangle.x, this.rectangle.y);\n }\n\n onProtonUpdate() {\n this.context.clearRect(this.rectangle.x, this.rectangle.y, this.rectangle.width, this.rectangle.height);\n this.imageData = this.context.getImageData(\n this.rectangle.x,\n this.rectangle.y,\n this.rectangle.width,\n this.rectangle.height\n );\n }\n\n onProtonUpdateAfter() {\n this.context.putImageData(this.imageData, this.rectangle.x, this.rectangle.y);\n }\n\n onParticleCreated(particle) {}\n\n onParticleUpdate(particle) {\n if (this.imageData) {\n this.setPixel(\n this.imageData,\n (particle.p.x - this.rectangle.x) >> 0,\n (particle.p.y - this.rectangle.y) >> 0,\n particle\n );\n }\n }\n\n setPixel(imagedata, x, y, particle) {\n const rgb = particle.rgb;\n if (x < 0 || x > this.element.width || y < 0 || y > this.elementwidth) return;\n\n const i = ((y >> 0) * imagedata.width + (x >> 0)) * 4;\n imagedata.data[i] = rgb.r;\n imagedata.data[i + 1] = rgb.g;\n imagedata.data[i + 2] = rgb.b;\n imagedata.data[i + 3] = particle.alpha * 255;\n }\n\n onParticleDead(particle) {}\n\n destroy() {\n super.destroy();\n this.stroke = null;\n this.context = null;\n this.imageData = null;\n this.rectangle = null;\n }\n}\n","import Mat3 from \"../math/Mat3\";\n\nexport default class MStack {\n constructor() {\n this.mats = [];\n this.size = 0;\n\n for (let i = 0; i < 20; i++) this.mats.push(Mat3.create([0, 0, 0, 0, 0, 0, 0, 0, 0]));\n }\n\n set(m, i) {\n if (i === 0) Mat3.set(m, this.mats[0]);\n else Mat3.multiply(this.mats[i - 1], m, this.mats[i]);\n\n this.size = Math.max(this.size, i + 1);\n }\n\n push(m) {\n if (this.size === 0) Mat3.set(m, this.mats[0]);\n else Mat3.multiply(this.mats[this.size - 1], m, this.mats[this.size]);\n\n this.size++;\n }\n\n pop() {\n if (this.size > 0) this.size--;\n }\n\n top() {\n return this.mats[this.size - 1];\n }\n}\n","import Mat3 from \"../math/Mat3\";\nimport BaseRenderer from \"./BaseRenderer\";\n\nimport Util from \"../utils/Util\";\nimport ImgUtil from \"../utils/ImgUtil\";\nimport MStack from \"../utils/MStack\";\nimport DomUtil from \"../utils/DomUtil\";\nimport WebGLUtil from \"../utils/WebGLUtil\";\nimport MathUtil from \"../math/MathUtil\";\n\nexport default class WebGLRenderer extends BaseRenderer {\n constructor(element) {\n super(element);\n\n this.gl = this.element.getContext(\"experimental-webgl\", { antialias: true, stencil: false, depth: false });\n if (!this.gl) alert(\"Sorry your browser do not suppest WebGL!\");\n\n this.initVar();\n this.setMaxRadius();\n this.initShaders();\n this.initBuffers();\n\n this.gl.blendEquation(this.gl.FUNC_ADD);\n this.gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);\n this.gl.enable(this.gl.BLEND);\n this.addImg2Body = this.addImg2Body.bind(this);\n\n this.name = \"WebGLRenderer\";\n }\n\n init(proton) {\n super.init(proton);\n this.resize(this.element.width, this.element.height);\n }\n\n resize(width, height) {\n this.umat[4] = -2;\n this.umat[7] = 1;\n\n this.smat[0] = 1 / width;\n this.smat[4] = 1 / height;\n\n this.mstack.set(this.umat, 0);\n this.mstack.set(this.smat, 1);\n\n this.gl.viewport(0, 0, width, height);\n this.element.width = width;\n this.element.height = height;\n }\n\n setMaxRadius(radius) {\n this.circleCanvasURL = this.createCircle(radius);\n }\n\n getVertexShader() {\n const vsSource = [\n \"uniform vec2 viewport;\",\n \"attribute vec2 aVertexPosition;\",\n \"attribute vec2 aTextureCoord;\",\n \"uniform mat3 tMat;\",\n \"varying vec2 vTextureCoord;\",\n \"varying float alpha;\",\n \"void main() {\",\n \"vec3 v = tMat * vec3(aVertexPosition, 1.0);\",\n \"gl_Position = vec4(v.x, v.y, 0, 1);\",\n \"vTextureCoord = aTextureCoord;\",\n \"alpha = tMat[0][2];\",\n \"}\"\n ].join(\"\\n\");\n return vsSource;\n }\n\n getFragmentShader() {\n const fsSource = [\n \"precision mediump float;\",\n \"varying vec2 vTextureCoord;\",\n \"varying float alpha;\",\n \"uniform sampler2D uSampler;\",\n \"uniform vec4 color;\",\n \"uniform bool useTexture;\",\n \"uniform vec3 uColor;\",\n \"void main() {\",\n \"vec4 textureColor = texture2D(uSampler, vTextureCoord);\",\n \"gl_FragColor = textureColor * vec4(uColor, 1.0);\",\n \"gl_FragColor.w *= alpha;\",\n \"}\"\n ].join(\"\\n\");\n return fsSource;\n }\n\n initVar() {\n this.mstack = new MStack();\n this.umat = Mat3.create([2, 0, 1, 0, -2, 0, -1, 1, 1]);\n this.smat = Mat3.create([1 / 100, 0, 1, 0, 1 / 100, 0, 0, 0, 1]);\n this.texturebuffers = {};\n }\n\n blendEquation(A) {\n this.gl.blendEquation(this.gl[A]);\n }\n\n blendFunc(A, B) {\n this.gl.blendFunc(this.gl[A], this.gl[B]);\n }\n\n getShader(gl, str, fs) {\n const shader = fs ? gl.createShader(gl.FRAGMENT_SHADER) : gl.createShader(gl.VERTEX_SHADER);\n\n gl.shaderSource(shader, str);\n gl.compileShader(shader);\n\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n alert(gl.getShaderInfoLog(shader));\n return null;\n }\n\n return shader;\n }\n\n initShaders() {\n const fragmentShader = this.getShader(this.gl, this.getFragmentShader(), true);\n const vertexShader = this.getShader(this.gl, this.getVertexShader(), false);\n\n this.sprogram = this.gl.createProgram();\n this.gl.attachShader(this.sprogram, vertexShader);\n this.gl.attachShader(this.sprogram, fragmentShader);\n this.gl.linkProgram(this.sprogram);\n\n if (!this.gl.getProgramParameter(this.sprogram, this.gl.LINK_STATUS)) alert(\"Could not initialise shaders\");\n\n this.gl.useProgram(this.sprogram);\n this.sprogram.vpa = this.gl.getAttribLocation(this.sprogram, \"aVertexPosition\");\n this.sprogram.tca = this.gl.getAttribLocation(this.sprogram, \"aTextureCoord\");\n this.gl.enableVertexAttribArray(this.sprogram.tca);\n this.gl.enableVertexAttribArray(this.sprogram.vpa);\n\n this.sprogram.tMatUniform = this.gl.getUniformLocation(this.sprogram, \"tMat\");\n this.sprogram.samplerUniform = this.gl.getUniformLocation(this.sprogram, \"uSampler\");\n this.sprogram.useTex = this.gl.getUniformLocation(this.sprogram, \"useTexture\");\n this.sprogram.color = this.gl.getUniformLocation(this.sprogram, \"uColor\");\n this.gl.uniform1i(this.sprogram.useTex, 1);\n }\n\n initBuffers() {\n const vs = [0, 3, 1, 0, 2, 3];\n let idx;\n\n this.unitIBuffer = this.gl.createBuffer();\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitIBuffer);\n this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(vs), this.gl.STATIC_DRAW);\n\n let i;\n let ids = [];\n for (i = 0; i < 100; i++) ids.push(i);\n idx = new Uint16Array(ids);\n\n this.unitI33 = this.gl.createBuffer();\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitI33);\n this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, idx, this.gl.STATIC_DRAW);\n\n ids = [];\n for (i = 0; i < 100; i++) ids.push(i, i + 1, i + 2);\n idx = new Uint16Array(ids);\n\n this.stripBuffer = this.gl.createBuffer();\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.stripBuffer);\n this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, idx, this.gl.STATIC_DRAW);\n }\n\n createCircle(raidus) {\n this.circleCanvasRadius = WebGLUtil.nhpot(Util.initValue(raidus, 32));\n const canvas = DomUtil.createCanvas(\"circle_canvas\", this.circleCanvasRadius * 2, this.circleCanvasRadius * 2);\n const context = canvas.getContext(\"2d\");\n\n context.beginPath();\n context.arc(this.circleCanvasRadius, this.circleCanvasRadius, this.circleCanvasRadius, 0, Math.PI * 2, true);\n context.closePath();\n context.fillStyle = \"#FFF\";\n context.fill();\n\n return canvas.toDataURL();\n }\n\n drawImg2Canvas(particle) {\n const _w = particle.body.width;\n const _h = particle.body.height;\n\n const _width = WebGLUtil.nhpot(particle.body.width);\n const _height = WebGLUtil.nhpot(particle.body.height);\n\n const _scaleX = particle.body.width / _width;\n const _scaleY = particle.body.height / _height;\n\n if (!this.texturebuffers[particle.data.src])\n this.texturebuffers[particle.data.src] = [\n this.gl.createTexture(),\n this.gl.createBuffer(),\n this.gl.createBuffer()\n ];\n\n particle.data.texture = this.texturebuffers[particle.data.src][0];\n particle.data.vcBuffer = this.texturebuffers[particle.data.src][1];\n particle.data.tcBuffer = this.texturebuffers[particle.data.src][2];\n\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.data.tcBuffer);\n this.gl.bufferData(\n this.gl.ARRAY_BUFFER,\n new Float32Array([0.0, 0.0, _scaleX, 0.0, 0.0, _scaleY, _scaleY, _scaleY]),\n this.gl.STATIC_DRAW\n );\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.data.vcBuffer);\n this.gl.bufferData(\n this.gl.ARRAY_BUFFER,\n new Float32Array([0.0, 0.0, _w, 0.0, 0.0, _h, _w, _h]),\n this.gl.STATIC_DRAW\n );\n\n const context = particle.data.canvas.getContext(\"2d\");\n const data = context.getImageData(0, 0, _width, _height);\n\n this.gl.bindTexture(this.gl.TEXTURE_2D, particle.data.texture);\n this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.gl.RGBA, this.gl.UNSIGNED_BYTE, data);\n this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, this.gl.LINEAR);\n this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR_MIPMAP_NEAREST);\n this.gl.generateMipmap(this.gl.TEXTURE_2D);\n\n particle.data.textureLoaded = true;\n particle.data.textureWidth = _w;\n particle.data.textureHeight = _h;\n }\n\n onProtonUpdate() {\n // this.gl.clearColor(0, 0, 0, 1);\n // this.gl.clear(this.gl.COLOR_BUFFER_BIT | this.gl.DEPTH_BUFFER_BIT);\n }\n\n onParticleCreated(particle) {\n particle.data.textureLoaded = false;\n particle.data.tmat = Mat3.create();\n particle.data.tmat[8] = 1;\n particle.data.imat = Mat3.create();\n particle.data.imat[8] = 1;\n\n if (particle.body) {\n ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle);\n } else {\n ImgUtil.getImgFromCache(this.circleCanvasURL, this.addImg2Body, particle);\n particle.data.oldScale = particle.radius / this.circleCanvasRadius;\n }\n }\n\n // private\n addImg2Body(img, particle) {\n if (particle.dead) return;\n particle.body = img;\n particle.data.src = img.src;\n particle.data.canvas = ImgUtil.getCanvasFromCache(img);\n particle.data.oldScale = 1;\n\n this.drawImg2Canvas(particle);\n }\n\n onParticleUpdate(particle) {\n if (particle.data.textureLoaded) {\n this.updateMatrix(particle);\n\n this.gl.uniform3f(this.sprogram.color, particle.rgb.r / 255, particle.rgb.g / 255, particle.rgb.b / 255);\n this.gl.uniformMatrix3fv(this.sprogram.tMatUniform, false, this.mstack.top());\n\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.data.vcBuffer);\n this.gl.vertexAttribPointer(this.sprogram.vpa, 2, this.gl.FLOAT, false, 0, 0);\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.data.tcBuffer);\n this.gl.vertexAttribPointer(this.sprogram.tca, 2, this.gl.FLOAT, false, 0, 0);\n this.gl.bindTexture(this.gl.TEXTURE_2D, particle.data.texture);\n this.gl.uniform1i(this.sprogram.samplerUniform, 0);\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitIBuffer);\n\n this.gl.drawElements(this.gl.TRIANGLES, 6, this.gl.UNSIGNED_SHORT, 0);\n this.mstack.pop();\n }\n }\n\n onParticleDead(particle) {}\n\n updateMatrix(particle) {\n const moveOriginMatrix = WebGLUtil.makeTranslation(\n -particle.data.textureWidth / 2,\n -particle.data.textureHeight / 2\n );\n const translationMatrix = WebGLUtil.makeTranslation(particle.p.x, particle.p.y);\n\n const angel = particle.rotation * MathUtil.PI_180;\n const rotationMatrix = WebGLUtil.makeRotation(angel);\n\n const scale = particle.scale * particle.data.oldScale;\n const scaleMatrix = WebGLUtil.makeScale(scale, scale);\n let matrix = WebGLUtil.matrixMultiply(moveOriginMatrix, scaleMatrix);\n\n matrix = WebGLUtil.matrixMultiply(matrix, rotationMatrix);\n matrix = WebGLUtil.matrixMultiply(matrix, translationMatrix);\n\n Mat3.inverse(matrix, particle.data.imat);\n matrix[2] = particle.alpha;\n\n this.mstack.push(matrix);\n }\n\n destroy() {\n super.destroy();\n this.gl = null;\n this.mstack = null;\n this.umat = null;\n this.smat = null;\n this.texturebuffers = null;\n }\n}\n","import BaseRenderer from \"./BaseRenderer\";\n\nexport default class CustomRenderer extends BaseRenderer {\n constructor(element) {\n super(element);\n\n this.name = \"CustomRenderer\";\n }\n}\n","import Zone from \"./Zone\";\nimport Util from \"../utils/Util\";\nimport MathUtil from \"../math/MathUtil\";\n\nexport default class LineZone extends Zone {\n constructor(x1, y1, x2, y2, direction) {\n super();\n\n if (x2 - x1 >= 0) {\n this.x1 = x1;\n this.y1 = y1;\n this.x2 = x2;\n this.y2 = y2;\n } else {\n this.x1 = x2;\n this.y1 = y2;\n this.x2 = x1;\n this.y2 = y1;\n }\n\n this.dx = this.x2 - this.x1;\n this.dy = this.y2 - this.y1;\n\n this.minx = Math.min(this.x1, this.x2);\n this.miny = Math.min(this.y1, this.y2);\n this.maxx = Math.max(this.x1, this.x2);\n this.maxy = Math.max(this.y1, this.y2);\n\n this.dot = this.x2 * this.y1 - this.x1 * this.y2;\n this.xxyy = this.dx * this.dx + this.dy * this.dy;\n\n this.gradient = this.getGradient();\n this.length = this.getLength();\n this.direction = Util.initValue(direction, \">\");\n }\n\n getPosition() {\n this.random = Math.random();\n this.vector.x = this.x1 + this.random * this.length * Math.cos(this.gradient);\n this.vector.y = this.y1 + this.random * this.length * Math.sin(this.gradient);\n\n return this.vector;\n }\n\n getDirection(x, y) {\n const A = this.dy;\n const B = -this.dx;\n const C = this.dot;\n const D = B === 0 ? 1 : B;\n\n if ((A * x + B * y + C) * D > 0) return true;\n else return false;\n }\n\n getDistance(x, y) {\n const A = this.dy;\n const B = -this.dx;\n const C = this.dot;\n const D = A * x + B * y + C;\n\n return D / Math.sqrt(this.xxyy);\n }\n\n getSymmetric(v) {\n const tha2 = v.getGradient();\n const tha1 = this.getGradient();\n const tha = 2 * (tha1 - tha2);\n\n const oldx = v.x;\n const oldy = v.y;\n\n v.x = oldx * Math.cos(tha) - oldy * Math.sin(tha);\n v.y = oldx * Math.sin(tha) + oldy * Math.cos(tha);\n\n return v;\n }\n\n getGradient() {\n return Math.atan2(this.dy, this.dx);\n }\n\n rangeOut(particle) {\n const angle = Math.abs(this.getGradient());\n\n if (angle <= MathUtil.PI / 4) {\n if (particle.p.x <= this.maxx && particle.p.x >= this.minx) return true;\n } else {\n if (particle.p.y <= this.maxy && particle.p.y >= this.miny) return true;\n }\n\n return false;\n }\n\n getLength() {\n return Math.sqrt(this.dx * this.dx + this.dy * this.dy);\n }\n\n crossing(particle) {\n if (this.crossType === \"dead\") {\n if (this.direction === \">\" || this.direction === \"R\" || this.direction === \"right\" || this.direction === \"down\") {\n if (!this.rangeOut(particle)) return;\n if (this.getDirection(particle.p.x, particle.p.y)) particle.dead = true;\n } else {\n if (!this.rangeOut(particle)) return;\n if (!this.getDirection(particle.p.x, particle.p.y)) particle.dead = true;\n }\n } else if (this.crossType === \"bound\") {\n if (!this.rangeOut(particle)) return;\n\n if (this.getDistance(particle.p.x, particle.p.y) <= particle.radius) {\n if (this.dx === 0) {\n particle.v.x *= -1;\n } else if (this.dy === 0) {\n particle.v.y *= -1;\n } else {\n this.getSymmetric(particle.v);\n }\n }\n } else if (this.crossType === \"cross\") {\n if (this.alert) {\n console.error(\"Sorry, LineZone does not support cross method!\");\n this.alert = false;\n }\n }\n }\n}\n","import Zone from \"./Zone\";\nimport MathUtil from \"../math/MathUtil\";\n\nexport default class CircleZone extends Zone {\n constructor(x, y, radius) {\n super();\n\n this.x = x;\n this.y = y;\n this.radius = radius;\n this.angle = 0;\n this.center = { x, y };\n }\n\n getPosition() {\n this.angle = MathUtil.PIx2 * Math.random();\n this.randomRadius = Math.random() * this.radius;\n this.vector.x = this.x + this.randomRadius * Math.cos(this.angle);\n this.vector.y = this.y + this.randomRadius * Math.sin(this.angle);\n\n return this.vector;\n }\n\n setCenter(x, y) {\n this.center.x = x;\n this.center.y = y;\n }\n\n crossing(particle) {\n const d = particle.p.distanceTo(this.center);\n\n if (this.crossType === \"dead\") {\n if (d - particle.radius > this.radius) particle.dead = true;\n } else if (this.crossType === \"bound\") {\n if (d + particle.radius >= this.radius) this.getSymmetric(particle);\n } else if (this.crossType === \"cross\") {\n if (this.alert) {\n console.error(\"Sorry, CircleZone does not support cross method!\");\n this.alert = false;\n }\n }\n }\n\n getSymmetric(particle) {\n const tha2 = particle.v.getGradient();\n const tha1 = this.getGradient(particle);\n\n const tha = 2 * (tha1 - tha2);\n const oldx = particle.v.x;\n const oldy = particle.v.y;\n\n particle.v.x = oldx * Math.cos(tha) - oldy * Math.sin(tha);\n particle.v.y = oldx * Math.sin(tha) + oldy * Math.cos(tha);\n }\n\n getGradient(particle) {\n return -MathUtil.PI_2 + Math.atan2(particle.p.y - this.center.y, particle.p.x - this.center.x);\n }\n}\n","import Zone from \"./Zone\";\n\nexport default class RectZone extends Zone {\n constructor(x, y, width, height) {\n super();\n\n this.x = x;\n this.y = y;\n this.width = width;\n this.height = height;\n }\n\n getPosition() {\n this.vector.x = this.x + Math.random() * this.width;\n this.vector.y = this.y + Math.random() * this.height;\n\n return this.vector;\n }\n\n crossing(particle) {\n // particle dead zone\n if (this.crossType === \"dead\") {\n if (particle.p.x + particle.radius < this.x) particle.dead = true;\n else if (particle.p.x - particle.radius > this.x + this.width) particle.dead = true;\n\n if (particle.p.y + particle.radius < this.y) particle.dead = true;\n else if (particle.p.y - particle.radius > this.y + this.height) particle.dead = true;\n }\n\n // particle bound zone\n else if (this.crossType === \"bound\") {\n if (particle.p.x - particle.radius < this.x) {\n particle.p.x = this.x + particle.radius;\n particle.v.x *= -1;\n } else if (particle.p.x + particle.radius > this.x + this.width) {\n particle.p.x = this.x + this.width - particle.radius;\n particle.v.x *= -1;\n }\n\n if (particle.p.y - particle.radius < this.y) {\n particle.p.y = this.y + particle.radius;\n particle.v.y *= -1;\n } else if (particle.p.y + particle.radius > this.y + this.height) {\n particle.p.y = this.y + this.height - particle.radius;\n particle.v.y *= -1;\n }\n }\n\n // particle cross zone\n else if (this.crossType === \"cross\") {\n if (particle.p.x + particle.radius < this.x && particle.v.x <= 0) {\n particle.p.x = this.x + this.width + particle.radius;\n } else if (particle.p.x - particle.radius > this.x + this.width && particle.v.x >= 0) {\n particle.p.x = this.x - particle.radius;\n }\n\n if (particle.p.y + particle.radius < this.y && particle.v.y <= 0) {\n particle.p.y = this.y + this.height + particle.radius;\n } else if (particle.p.y - particle.radius > this.y + this.height && particle.v.y >= 0) {\n particle.p.y = this.y - particle.radius;\n }\n }\n }\n}\n","import Zone from \"./Zone\";\nimport Util from \"../utils/Util\";\n\nexport default class ImageZone extends Zone {\n constructor(imageData, x, y, d) {\n super();\n this.reset(imageData, x, y, d);\n }\n\n reset(imageData, x, y, d) {\n this.imageData = imageData;\n this.x = Util.initValue(x, 0);\n this.y = Util.initValue(y, 0);\n this.d = Util.initValue(d, 2);\n\n this.vectors = [];\n this.setVectors();\n }\n\n setVectors() {\n let i, j;\n const length1 = this.imageData.width;\n const length2 = this.imageData.height;\n\n for (i = 0; i < length1; i += this.d) {\n for (j = 0; j < length2; j += this.d) {\n let index = ((j >> 0) * length1 + (i >> 0)) * 4;\n\n if (this.imageData.data[index + 3] > 0) {\n this.vectors.push({ x: i + this.x, y: j + this.y });\n }\n }\n }\n\n return this.vector;\n }\n\n getBound(x, y) {\n const index = ((y >> 0) * this.imageData.width + (x >> 0)) * 4;\n if (this.imageData.data[index + 3] > 0) return true;\n else return false;\n }\n\n getPosition() {\n const vector = Util.getRandFromArray(this.vectors);\n return this.vector.copy(vector);\n }\n\n getColor(x, y) {\n x -= this.x;\n y -= this.y;\n const i = ((y >> 0) * this.imageData.width + (x >> 0)) * 4;\n\n return {\n r: this.imageData.data[i],\n g: this.imageData.data[i + 1],\n b: this.imageData.data[i + 2],\n a: this.imageData.data[i + 3]\n };\n }\n\n crossing(particle) {\n if (this.crossType === \"dead\") {\n if (this.getBound(particle.p.x - this.x, particle.p.y - this.y)) particle.dead = true;\n else particle.dead = false;\n } else if (this.crossType === \"bound\") {\n if (!this.getBound(particle.p.x - this.x, particle.p.y - this.y)) particle.v.negate();\n }\n }\n\n destroy() {\n super.destroy();\n this.imageData = null;\n }\n}\n","import ColorUtil from \"../utils/ColorUtil\";\nimport CircleZone from \"../zone/CircleZone\";\nimport PointZone from \"../zone/PointZone\";\nimport LineZone from \"../zone/LineZone\";\nimport RectZone from \"../zone/RectZone\";\n\nexport default {\n addEventListener(proton, func) {\n proton.addEventListener(\"PROTON_UPDATE_AFTER\", () => func());\n },\n\n getStyle(color = \"#ff0000\") {\n const rgb = ColorUtil.hexToRgb(color);\n return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, 0.5)`;\n },\n\n drawZone(proton, canvas, zone, clear) {\n const context = canvas.getContext(\"2d\");\n const style = this.getStyle();\n\n this.addEventListener(proton, () => {\n if (clear) context.clearRect(0, 0, canvas.width, canvas.height);\n\n if (zone instanceof PointZone) {\n context.beginPath();\n context.fillStyle = style;\n context.arc(zone.x, zone.y, 10, 0, Math.PI * 2, true);\n context.fill();\n context.closePath();\n } else if (zone instanceof LineZone) {\n context.beginPath();\n context.strokeStyle = style;\n context.moveTo(zone.x1, zone.y1);\n context.lineTo(zone.x2, zone.y2);\n context.stroke();\n context.closePath();\n } else if (zone instanceof RectZone) {\n context.beginPath();\n context.strokeStyle = style;\n context.drawRect(zone.x, zone.y, zone.width, zone.height);\n context.stroke();\n context.closePath();\n } else if (zone instanceof CircleZone) {\n context.beginPath();\n context.strokeStyle = style;\n context.arc(zone.x, zone.y, zone.radius, 0, Math.PI * 2, true);\n context.stroke();\n context.closePath();\n }\n });\n },\n\n drawEmitter(proton, canvas, emitter, clear) {\n const context = canvas.getContext(\"2d\");\n const style = this.getStyle();\n\n this.addEventListener(proton, () => {\n if (clear) context.clearRect(0, 0, canvas.width, canvas.height);\n\n context.beginPath();\n context.fillStyle = style;\n context.arc(emitter.p.x, emitter.p.y, 10, 0, Math.PI * 2, true);\n context.fill();\n context.closePath();\n });\n }\n};\n","import Proton from \"./core/Proton\";\nimport Particle from \"./core/Particle\";\nimport Pool from \"./core/Pool\";\n\nimport Util from \"./utils/Util\";\nimport ColorUtil from \"./utils/ColorUtil\";\nimport MathUtil from \"./math/MathUtil\";\nimport Vector2D from \"./math/Vector2D\";\nimport Polar2D from \"./math/Polar2D\";\nimport Mat3 from \"./math/Mat3\";\nimport Span from \"./math/Span\";\nimport ArraySpan from \"./math/ArraySpan\";\nimport Rectangle from \"./math/Rectangle\";\nimport ease from \"./math/ease\";\n\nimport Rate from \"./initialize/Rate\";\nimport Initialize from \"./initialize/Initialize\";\nimport Life from \"./initialize/Life\";\nimport Position from \"./initialize/Position\";\nimport Velocity from \"./initialize/Velocity\";\nimport Mass from \"./initialize/Mass\";\nimport Radius from \"./initialize/Radius\";\nimport Body from \"./initialize/Body\";\n\nimport Behaviour from \"./behaviour/Behaviour\";\nimport Force from \"./behaviour/Force\";\nimport Attraction from \"./behaviour/Attraction\";\nimport RandomDrift from \"./behaviour/RandomDrift\";\nimport Gravity from \"./behaviour/Gravity\";\nimport Collision from \"./behaviour/Collision\";\nimport CrossZone from \"./behaviour/CrossZone\";\nimport Alpha from \"./behaviour/Alpha\";\nimport Scale from \"./behaviour/Scale\";\nimport Rotate from \"./behaviour/Rotate\";\nimport Color from \"./behaviour/Color\";\nimport Cyclone from \"./behaviour/Cyclone\";\nimport Repulsion from \"./behaviour/Repulsion\";\nimport GravityWell from \"./behaviour/GravityWell\";\n\nimport Emitter from \"./emitter/Emitter\";\nimport BehaviourEmitter from \"./emitter/BehaviourEmitter\";\nimport FollowEmitter from \"./emitter/FollowEmitter\";\n\nimport CanvasRenderer from \"./render/CanvasRenderer\";\nimport DomRenderer from \"./render/DomRenderer\";\nimport EaselRenderer from \"./render/EaselRenderer\";\nimport PixelRenderer from \"./render/PixelRenderer\";\nimport PixiRenderer from \"./render/PixiRenderer\";\nimport WebGLRenderer from \"./render/WebGLRenderer\";\nimport CustomRenderer from \"./render/CustomRenderer\";\n\nimport Zone from \"./zone/Zone\";\nimport LineZone from \"./zone/LineZone\";\nimport CircleZone from \"./zone/CircleZone\";\nimport PointZone from \"./zone/PointZone\";\nimport RectZone from \"./zone/RectZone\";\nimport ImageZone from \"./zone/ImageZone\";\n\nimport Debug from \"./debug/Debug\";\n\n// namespace\nProton.Particle = Particle;\nProton.Pool = Pool;\n\nProton.Util = Util;\nProton.ColorUtil = ColorUtil;\nProton.MathUtil = MathUtil;\nProton.Vector2D = Proton.Vector = Vector2D;\nProton.Polar2D = Proton.Polar = Polar2D;\nProton.ArraySpan = ArraySpan;\nProton.Rectangle = Rectangle;\nProton.Rate = Rate;\nProton.ease = ease;\nProton.Span = Span;\nProton.Mat3 = Mat3;\nProton.getSpan = (a, b, center) => new Span(a, b, center);\nProton.createArraySpan = ArraySpan.createArraySpan;\n\nProton.Initialize = Proton.Init = Initialize;\nProton.Life = Proton.L = Life;\nProton.Position = Proton.P = Position;\nProton.Velocity = Proton.V = Velocity;\nProton.Mass = Proton.M = Mass;\nProton.Radius = Proton.R = Radius;\nProton.Body = Proton.B = Body;\n\nProton.Behaviour = Behaviour;\nProton.Force = Proton.F = Force;\nProton.Attraction = Proton.A = Attraction;\nProton.RandomDrift = Proton.RD = RandomDrift;\nProton.Gravity = Proton.G = Gravity;\nProton.Collision = Collision;\nProton.CrossZone = CrossZone;\nProton.Alpha = Alpha;\nProton.Scale = Proton.S = Scale;\nProton.Rotate = Rotate;\nProton.Color = Color;\nProton.Repulsion = Repulsion;\nProton.Cyclone = Cyclone;\nProton.GravityWell = GravityWell;\n\nProton.Emitter = Emitter;\nProton.BehaviourEmitter = BehaviourEmitter;\nProton.FollowEmitter = FollowEmitter;\n\nProton.Zone = Zone;\nProton.LineZone = LineZone;\nProton.CircleZone = CircleZone;\nProton.PointZone = PointZone;\nProton.RectZone = RectZone;\nProton.ImageZone = ImageZone;\n\nProton.CanvasRenderer = CanvasRenderer;\nProton.DomRenderer = DomRenderer;\nProton.EaselRenderer = EaselRenderer;\nProton.PixiRenderer = PixiRenderer;\nProton.PixelRenderer = PixelRenderer;\nProton.WebGLRenderer = Proton.WebGlRenderer = WebGLRenderer;\nProton.CustomRenderer = CustomRenderer;\n\nProton.Debug = Debug;\nUtil.assign(Proton, ease);\n\n// export\nexport default Proton;\n"],"names":["length","i","tx","ty","angleInRadians","c","Math","cos","s","sin","sx","sy","a","b","a00","a01","a02","a10","a11","a12","a20","a21","a22","b00","b01","b02","b10","b11","b12","b20","b21","b22","createCanvas","id","width","height","position","dom","document","createElement","style","opacity","transform","createDiv","resize","marginLeft","marginTop","div","x","y","scale","rotate","willChange","css3","transform3d","key","val","bkey","charAt","toUpperCase","substr","imgsCache","canvasCache","canvasId","context","image","rect","drawImage","imagedata","getImageData","clearRect","img","callback","param","src","Image","onload","e","target","WebGLUtil","canvas","DomUtil","getContext","initValue","value","defaults","isArray","Object","prototype","toString","call","emptyArray","arr","toArray","this","getRandFromArray","floor","random","emptyObject","obj","ignore","indexOf","classApply","constructor","args","bind","apply","concat","ImgUtil","destroyAll","destroy","assign","source","hasOwnProperty","idsMap","Puid","_index","_cache","type","undefined","getId","uid","getIdFromCache","isBody","isInner","getTarget","Pool","num","total","cache","get","params","p","__puid","pop","createOrClone","expire","getCache","push","create","Util","clone","getCount","count","Stats","proton","container","emitterIndex","rendererIndex","update","body","add","emitter","getEmitter","renderer","getRenderer","str","emitters","emitSpeed","getEmitterPos","initializes","concatArr","behaviours","name","getCreatedNumber","pool","innerHTML","bg","color","cssText","join","addEventListener","_this","parentNode","appendChild","renderers","result","cpool","round","EventDispatcher","_listeners","dispatchEvent","hasEventListener","removeEventListener","removeAllEventListeners","listener","splice","listeners","handler","PI","MathUtil","PIx2","PI_2","PI_180","N180_PI","Infinity","isInfinity","randomAToB","isInt","randomFloating","center","f","randomColor","slice","randomZone","display","k","digits","pow","degreeTransform","toColor16","Integration","calculate","particles","time","damping","eulerIntegrate","particle","sleep","old","copy","v","multiplyScalar","mass","clear","Proton","integrationType","now","then","elapsed","stats","EULER","integrator","_fps","_interval","DEFAULT_INTERVAL","addRenderer","render","init","removeRenderer","index","remove","addEmitter","parent","EMITTER_ADDED","removeEmitter","EMITTER_REMOVED","PROTON_UPDATE","USE_CLOCK","Date","getTime","amendChangeTabsBug","emittersUpdate","PROTON_UPDATE_AFTER","getAllParticles","destroyAllEmitters","destroyOther","setTimeout","fps","MEASURE","RK2","PARTICLE_CREATED","PARTICLE_UPDATE","PARTICLE_SLEEP","PARTICLE_DEAD","Rgb","r","g","reset","hasProp","setProp","props","prop","Span","getSpanValue","setVectorVal","conf","easeLinear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInSine","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","sqrt","easeOutCirc","easeInOutCirc","easeInBack","easeOutBack","easeInOutBack","getEasing","ease","Vector2D","set","setX","setY","getGradient","atan2","w","addVectors","addXY","sub","subVectors","divideScalar","negate","dot","lengthSq","normalize","distanceTo","distanceToSquared","tha","dx","dy","lerp","alpha","equals","Particle","data","rgb","PropUtil","getDirection","life","age","dead","sprite","energy","radius","rotation","easing","removeAllBehaviours","applyBehaviours","max","applyBehaviour","addBehaviour","behaviour","parents","initialize","addBehaviours","removeBehaviour","hexToRgb","h","hex16","substring","parseInt","rgbToHex","rbg","getHex16FromParticle","Number","Polar2D","abs","setR","setTha","toVector","getX","getY","Mat3","mat3","mat","Float32Array","mat1","mat2","multiply","inverse","multiplyVec2","m","vec","getValue","setSpanValue","pan","ArraySpan","_arr","createArraySpan","Rectangle","bottom","right","contains","Rate","numpan","timepan","numPan","timePan","startTime","nextTime","Initialize","Life","lifePan","Zone","vector","crossType","alert","getPosition","crossing","PointZone","console","error","Position","zone","Velocity","rpan","thapan","rPan","thaPan","normalizeVelocity","vr","polar2d","Mass","massPan","Radius","oldRadius","Body","imageTarget","inner","Behaviour","normalizeForce","force","normalizeValue","Force","fx","fy","Attraction","targetPosition","radiusSq","attractionForce","RandomDrift","driftX","driftY","delay","panFoce","Gravity","Collision","collisionPool","delta","otherParticle","overlap","totalMass","averageMass1","averageMass2","newPool","distance","CrossZone","Alpha","same","alphaA","alphaB","Scale","scaleA","scaleB","Rotate","influence","rotationA","rotationB","Color","colorA","ColorUtil","colorB","CHANGING","Cyclone","angle","setAngleAndForce","span","String","toLowerCase","cangle","cyclone","gradient","Repulsion","GravityWell","centerPoint","distanceVec","distanceSq","factor","bindEmitter","Emitter","emitTime","totalTime","rate","emit","stoped","isNaN","stop","preEmit","oldStoped","oldEmitTime","oldTotalTime","step","removeAllParticles","addSelfInitialize","initAll","addInitialize","rest","removeInitialize","initializer","removeAllInitializers","arguments","emitting","integrate","dispatch","event","bindEvent","createParticle","setupParticle","InitializeUtil","PIXIClass","BehaviourEmitter","selfBehaviours","addSelfBehaviour","removeSelfBehaviour","FollowEmitter","mouseTarget","window","_allowEmitting","initEventHandler","mousemoveHandler","_this2","mousemove","mousedownHandler","mousedown","mouseupHandler","mouseup","layerX","layerY","offsetX","offsetY","_Emitter","tagName","nodeName","BaseRenderer","element","stroke","circleConf","isCircle","setStroke","thinkness","_protonUpdateHandler","onProtonUpdate","_protonUpdateAfterHandler","onProtonUpdateAfter","_emitterAddedHandler","onEmitterAdded","_emitterRemovedHandler","onEmitterRemoved","_particleCreatedHandler","onParticleCreated","_particleUpdateHandler","onParticleUpdate","_particleDeadHandler","onParticleDead","CanvasRenderer","bufferCache","addImg2Body","Types","drawCircle","buffer","createBuffer","bufContext","globalAlpha","globalCompositeOperation","fillStyle","fillRect","save","translate","restore","beginPath","arc","strokeStyle","lineWidth","closePath","fill","size","DomRenderer","createBody","bodyReady","backgroundColor","removeChild","createCircle","createSprite","borderRadius","borderColor","borderWidth","url","backgroundImage","EaselRenderer","addChild","scaleX","scaleY","graphics","regX","regY","createjs","Graphics","beginStroke","beginFill","shape","Shape","PixelRenderer","rectangle","imageData","createImageData","putImageData","setPixel","elementwidth","PixiRenderer","setColor","blendMode","setPIXI","PIXI","Sprite","createFromImage","from","fromImage","tint","anchor","endFill","MStack","mats","top","WebGLRenderer","gl","antialias","stencil","depth","initVar","setMaxRadius","initShaders","initBuffers","blendEquation","FUNC_ADD","blendFunc","SRC_ALPHA","ONE_MINUS_SRC_ALPHA","enable","BLEND","umat","smat","mstack","viewport","circleCanvasURL","getVertexShader","getFragmentShader","texturebuffers","A","B","getShader","fs","shader","createShader","FRAGMENT_SHADER","VERTEX_SHADER","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","getShaderInfoLog","fragmentShader","vertexShader","sprogram","createProgram","attachShader","linkProgram","getProgramParameter","LINK_STATUS","useProgram","vpa","getAttribLocation","tca","enableVertexAttribArray","tMatUniform","getUniformLocation","samplerUniform","useTex","uniform1i","idx","unitIBuffer","bindBuffer","ELEMENT_ARRAY_BUFFER","bufferData","Uint16Array","STATIC_DRAW","ids","unitI33","stripBuffer","raidus","circleCanvasRadius","toDataURL","drawImg2Canvas","_w","_h","_width","_height","_scaleX","_scaleY","createTexture","texture","vcBuffer","tcBuffer","ARRAY_BUFFER","bindTexture","TEXTURE_2D","texImage2D","RGBA","UNSIGNED_BYTE","texParameteri","TEXTURE_MAG_FILTER","LINEAR","TEXTURE_MIN_FILTER","LINEAR_MIPMAP_NEAREST","generateMipmap","textureLoaded","textureWidth","textureHeight","tmat","imat","oldScale","updateMatrix","uniform3f","uniformMatrix3fv","vertexAttribPointer","FLOAT","drawElements","TRIANGLES","UNSIGNED_SHORT","moveOriginMatrix","translationMatrix","angel","rotationMatrix","scaleMatrix","matrix","CustomRenderer","LineZone","x1","y1","x2","y2","direction","minx","min","miny","maxx","maxy","xxyy","getLength","getDistance","getSymmetric","tha2","oldx","oldy","rangeOut","CircleZone","randomRadius","setCenter","d","RectZone","ImageZone","vectors","setVectors","j","length1","length2","getBound","getColor","func","getStyle","drawZone","moveTo","lineTo","drawRect","drawEmitter","Vector","Polar","getSpan","Init","L","P","V","M","R","F","RD","G","S","WebGlRenderer","Debug"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"proton.min.js","sources":["../src/utils/WebGLUtil.js","../src/utils/DomUtil.js","../src/utils/ImgUtil.js","../src/utils/Util.js","../src/utils/Puid.js","../src/core/Pool.js","../src/debug/Stats.js","../src/events/EventDispatcher.js","../src/math/MathUtil.js","../src/math/Integration.js","../src/core/Proton.js","../src/utils/Rgb.js","../src/utils/PropUtil.js","../src/math/ease.js","../src/math/Vector2D.js","../src/core/Particle.js","../src/utils/ColorUtil.js","../src/math/Polar2D.js","../src/math/Mat3.js","../src/math/Span.js","../src/math/ArraySpan.js","../src/math/Rectangle.js","../src/initialize/Rate.js","../src/initialize/Initialize.js","../src/initialize/Life.js","../src/zone/Zone.js","../src/zone/PointZone.js","../src/initialize/Position.js","../src/initialize/Velocity.js","../src/initialize/Mass.js","../src/initialize/Radius.js","../src/initialize/Body.js","../src/behaviour/Behaviour.js","../src/behaviour/Force.js","../src/behaviour/Attraction.js","../src/behaviour/RandomDrift.js","../src/behaviour/Gravity.js","../src/behaviour/Collision.js","../src/behaviour/CrossZone.js","../src/behaviour/Alpha.js","../src/behaviour/Scale.js","../src/behaviour/Rotate.js","../src/behaviour/Color.js","../src/behaviour/Cyclone.js","../src/behaviour/Repulsion.js","../src/behaviour/GravityWell.js","../src/initialize/InitializeUtil.js","../src/emitter/Emitter.js","../src/render/PixiRenderer.js","../src/emitter/BehaviourEmitter.js","../src/emitter/FollowEmitter.js","../src/utils/Types.js","../src/render/BaseRenderer.js","../src/render/CanvasRenderer.js","../src/render/DomRenderer.js","../src/render/EaselRenderer.js","../src/render/PixelRenderer.js","../src/utils/MStack.js","../src/render/WebGLRenderer.js","../src/render/CustomRenderer.js","../src/zone/LineZone.js","../src/zone/CircleZone.js","../src/zone/RectZone.js","../src/zone/ImageZone.js","../src/debug/Debug.js","../src/index.js"],"sourcesContent":["export default {\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method ipot\n *\n * @todo add description\n * @todo add length description\n *\n * @param {Number} length\n *\n * @return {Boolean}\n */\n ipot(length) {\n return (length & (length - 1)) === 0;\n },\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method nhpot\n *\n * @todo add description\n * @todo add length description\n *\n * @param {Number} length\n *\n * @return {Number}\n */\n nhpot(length) {\n --length;\n for (let i = 1; i < 32; i <<= 1) {\n length = length | (length >> i);\n }\n\n return length + 1;\n },\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method makeTranslation\n *\n * @todo add description\n * @todo add tx, ty description\n * @todo add return description\n *\n * @param {Number} tx either 0 or 1\n * @param {Number} ty either 0 or 1\n *\n * @return {Object}\n */\n makeTranslation(tx, ty) {\n return [1, 0, 0, 0, 1, 0, tx, ty, 1];\n },\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method makeRotation\n *\n * @todo add description\n * @todo add return description\n *\n * @param {Number} angleInRadians\n *\n * @return {Object}\n */\n makeRotation(angleInRadians) {\n let c = Math.cos(angleInRadians);\n let s = Math.sin(angleInRadians);\n\n return [c, -s, 0, s, c, 0, 0, 0, 1];\n },\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method makeScale\n *\n * @todo add description\n * @todo add tx, ty description\n * @todo add return description\n *\n * @param {Number} sx either 0 or 1\n * @param {Number} sy either 0 or 1\n *\n * @return {Object}\n */\n makeScale(sx, sy) {\n return [sx, 0, 0, 0, sy, 0, 0, 0, 1];\n },\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method matrixMultiply\n *\n * @todo add description\n * @todo add a, b description\n * @todo add return description\n *\n * @param {Object} a\n * @param {Object} b\n *\n * @return {Object}\n */\n matrixMultiply(a, b) {\n let a00 = a[0 * 3 + 0];\n let a01 = a[0 * 3 + 1];\n let a02 = a[0 * 3 + 2];\n let a10 = a[1 * 3 + 0];\n let a11 = a[1 * 3 + 1];\n let a12 = a[1 * 3 + 2];\n let a20 = a[2 * 3 + 0];\n let a21 = a[2 * 3 + 1];\n let a22 = a[2 * 3 + 2];\n let b00 = b[0 * 3 + 0];\n let b01 = b[0 * 3 + 1];\n let b02 = b[0 * 3 + 2];\n let b10 = b[1 * 3 + 0];\n let b11 = b[1 * 3 + 1];\n let b12 = b[1 * 3 + 2];\n let b20 = b[2 * 3 + 0];\n let b21 = b[2 * 3 + 1];\n let b22 = b[2 * 3 + 2];\n\n return [\n a00 * b00 + a01 * b10 + a02 * b20,\n a00 * b01 + a01 * b11 + a02 * b21,\n a00 * b02 + a01 * b12 + a02 * b22,\n a10 * b00 + a11 * b10 + a12 * b20,\n a10 * b01 + a11 * b11 + a12 * b21,\n a10 * b02 + a11 * b12 + a12 * b22,\n a20 * b00 + a21 * b10 + a22 * b20,\n a20 * b01 + a21 * b11 + a22 * b21,\n a20 * b02 + a21 * b12 + a22 * b22\n ];\n }\n};\n","export default {\n /**\n * Creates and returns a new canvas. The opacity is by default set to 0\n *\n * @memberof Proton#Proton.DomUtil\n * @method createCanvas\n *\n * @param {String} $id the canvas' id\n * @param {Number} $width the canvas' width\n * @param {Number} $height the canvas' height\n * @param {String} [$position=absolute] the canvas' position, default is 'absolute'\n *\n * @return {Object}\n */\n createCanvas(id, width, height, position = \"absolute\") {\n const dom = document.createElement(\"canvas\");\n\n dom.id = id;\n dom.width = width;\n dom.height = height;\n dom.style.opacity = 0;\n dom.style.position = position;\n this.transform(dom, -500, -500, 0, 0);\n\n return dom;\n },\n\n createDiv(id, width, height) {\n const dom = document.createElement(\"div\");\n\n dom.id = id;\n dom.style.position = \"absolute\";\n this.resize(dom, width, height);\n\n return dom;\n },\n\n resize(dom, width, height) {\n dom.style.width = width + \"px\";\n dom.style.height = height + \"px\";\n dom.style.marginLeft = -width / 2 + \"px\";\n dom.style.marginTop = -height / 2 + \"px\";\n },\n\n /**\n * Adds a transform: translate(), scale(), rotate() to a given div dom for all browsers\n *\n * @memberof Proton#Proton.DomUtil\n * @method transform\n *\n * @param {HTMLDivElement} div\n * @param {Number} $x\n * @param {Number} $y\n * @param {Number} $scale\n * @param {Number} $rotate\n */\n transform(div, x, y, scale, rotate) {\n div.style.willChange = \"transform\";\n const transform = `translate(${x}px, ${y}px) scale(${scale}) rotate(${rotate}deg)`;\n this.css3(div, \"transform\", transform);\n },\n\n transform3d(div, x, y, scale, rotate) {\n div.style.willChange = \"transform\";\n const transform = `translate3d(${x}px, ${y}px, 0) scale(${scale}) rotate(${rotate}deg)`;\n this.css3(div, \"backfaceVisibility\", \"hidden\");\n this.css3(div, \"transform\", transform);\n },\n\n css3(div, key, val) {\n const bkey = key.charAt(0).toUpperCase() + key.substr(1);\n\n div.style[`Webkit${bkey}`] = val;\n div.style[`Moz${bkey}`] = val;\n div.style[`O${bkey}`] = val;\n div.style[`ms${bkey}`] = val;\n div.style[`${key}`] = val;\n }\n};\n","import WebGLUtil from \"./WebGLUtil\";\nimport DomUtil from \"./DomUtil\";\n\nconst imgsCache = {};\nconst canvasCache = {};\nlet canvasId = 0;\n\nexport default {\n /**\n * This will get the image data. It could be necessary to create a Proton.Zone.\n *\n * @memberof Proton#Proton.Util\n * @method getImageData\n *\n * @param {HTMLCanvasElement} context any canvas, must be a 2dContext 'canvas.getContext('2d')'\n * @param {Object} image could be any dom image, e.g. document.getElementById('thisIsAnImgTag');\n * @param {Proton.Rectangle} rect\n */\n getImageData(context, image, rect) {\n context.drawImage(image, rect.x, rect.y);\n const imagedata = context.getImageData(rect.x, rect.y, rect.width, rect.height);\n context.clearRect(rect.x, rect.y, rect.width, rect.height);\n\n return imagedata;\n },\n\n /**\n * @memberof Proton#Proton.Util\n * @method getImgFromCache\n *\n * @todo add description\n * @todo describe func\n *\n * @param {Mixed} img\n * @param {Proton.Particle} particle\n * @param {Boolean} drawCanvas set to true if a canvas should be saved into particle.data.canvas\n * @param {Boolean} func\n */\n getImgFromCache(img, callback, param) {\n const src = typeof img === \"string\" ? img : img.src;\n\n if (imgsCache[src]) {\n callback(imgsCache[src], param);\n } else {\n const image = new Image();\n image.onload = e => {\n imgsCache[src] = e.target;\n callback(imgsCache[src], param);\n };\n\n image.src = src;\n }\n },\n\n getCanvasFromCache(img, callback, param) {\n const src = img.src;\n\n if (!canvasCache[src]) {\n const width = WebGLUtil.nhpot(img.width);\n const height = WebGLUtil.nhpot(img.height);\n\n const canvas = DomUtil.createCanvas(`proton_canvas_cache_${++canvasId}`, width, height);\n const context = canvas.getContext(\"2d\");\n context.drawImage(img, 0, 0, img.width, img.height);\n\n canvasCache[src] = canvas;\n }\n\n callback && callback(canvasCache[src], param);\n\n return canvasCache[src];\n }\n};\n","import ImgUtil from \"./ImgUtil\";\n\nexport default {\n /**\n * Returns the default if the value is null or undefined\n *\n * @memberof Proton#Proton.Util\n * @method initValue\n *\n * @param {Mixed} value a specific value, could be everything but null or undefined\n * @param {Mixed} defaults the default if the value is null or undefined\n */\n initValue(value, defaults) {\n value = value !== null && value !== undefined ? value : defaults;\n return value;\n },\n\n /**\n * Checks if the value is a valid array\n *\n * @memberof Proton#Proton.Util\n * @method isArray\n *\n * @param {Array} value Any array\n *\n * @returns {Boolean}\n */\n isArray(value) {\n return Object.prototype.toString.call(value) === \"[object Array]\";\n },\n\n /**\n * Destroyes the given array\n *\n * @memberof Proton#Proton.Util\n * @method emptyArray\n *\n * @param {Array} array Any array\n */\n emptyArray(arr) {\n if (arr) arr.length = 0;\n },\n\n toArray(arr) {\n return this.isArray(arr) ? arr : [arr];\n },\n\n getRandFromArray(arr) {\n if (!arr) return null;\n return arr[Math.floor(arr.length * Math.random())];\n },\n\n /**\n * Destroyes the given object\n *\n * @memberof Proton#Proton.Util\n * @method emptyObject\n *\n * @param {Object} obj Any object\n */\n emptyObject(obj, ignore = null) {\n for (let key in obj) {\n if (ignore && ignore.indexOf(key) > -1) continue;\n delete obj[key];\n }\n },\n\n /**\n * Makes an instance of a class and binds the given array\n *\n * @memberof Proton#Proton.Util\n * @method classApply\n *\n * @param {Function} constructor A class to make an instance from\n * @param {Array} [args] Any array to bind it to the constructor\n *\n * @return {Object} The instance of constructor, optionally bind with args\n */\n classApply(constructor, args = null) {\n if (!args) {\n return new constructor();\n } else {\n const FactoryFunc = constructor.bind.apply(constructor, [null].concat(args));\n return new FactoryFunc();\n }\n },\n\n /**\n * This will get the image data. It could be necessary to create a Proton.Zone.\n *\n * @memberof Proton#Proton.Util\n * @method getImageData\n *\n * @param {HTMLCanvasElement} context any canvas, must be a 2dContext 'canvas.getContext('2d')'\n * @param {Object} image could be any dom image, e.g. document.getElementById('thisIsAnImgTag');\n * @param {Proton.Rectangle} rect\n */\n getImageData(context, image, rect) {\n return ImgUtil.getImageData(context, image, rect);\n },\n\n destroyAll(arr, param = null) {\n let i = arr.length;\n\n while (i--) {\n try {\n arr[i].destroy(param);\n } catch (e) {}\n\n delete arr[i];\n }\n\n arr.length = 0;\n },\n\n assign(target, source) {\n if (typeof Object.assign !== \"function\") {\n for (let key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n\n return target;\n } else {\n return Object.assign(target, source);\n }\n }\n};\n","const idsMap = {};\n\nconst Puid = {\n _index: 0,\n _cache: {},\n\n id(type) {\n if (idsMap[type] === undefined || idsMap[type] === null) idsMap[type] = 0;\n return `${type}_${idsMap[type]++}`;\n },\n\n getId(target) {\n let uid = this.getIdFromCache(target);\n if (uid) return uid;\n\n uid = `PUID_${this._index++}`;\n this._cache[uid] = target;\n return uid;\n },\n\n getIdFromCache(target) {\n let obj, id;\n\n for (id in this._cache) {\n obj = this._cache[id];\n\n if (obj === target) return id;\n if (this.isBody(obj, target) && obj.src === target.src) return id;\n }\n\n return null;\n },\n\n isBody(obj, target) {\n return typeof obj === \"object\" && typeof target === \"object\" && obj.isInner && target.isInner;\n },\n\n getTarget(uid) {\n return this._cache[uid];\n }\n};\n\nexport default Puid;\n","/**\n * Pool is the cache pool of the proton engine, it is very important.\n *\n * get(target, params, uid)\n * Class\n * uid = Puid.getId -> Puid save target cache\n * target.__puid = uid\n *\n * body\n * uid = Puid.getId -> Puid save target cache\n *\n *\n * expire(target)\n * cache[target.__puid] push target\n *\n */\nimport Util from \"../utils/Util\";\nimport Puid from \"../utils/Puid\";\n\nexport default class Pool {\n /**\n * @memberof! Proton#\n * @constructor\n * @alias Proton.Pool\n *\n * @todo add description\n * @todo add description of properties\n *\n * @property {Number} total\n * @property {Object} cache\n */\n constructor(num) {\n this.total = 0;\n this.cache = {};\n }\n\n /**\n * @todo add description\n *\n * @method get\n * @memberof Proton#Proton.Pool\n *\n * @param {Object|Function} target\n * @param {Object} [params] just add if `target` is a function\n *\n * @return {Object}\n */\n get(target, params, uid) {\n let p;\n uid = uid || target.__puid || Puid.getId(target);\n\n if (this.cache[uid] && this.cache[uid].length > 0) {\n p = this.cache[uid].pop();\n } else {\n p = this.createOrClone(target, params);\n }\n\n p.__puid = target.__puid || uid;\n return p;\n }\n\n /**\n * @todo add description\n *\n * @method set\n * @memberof Proton#Proton.Pool\n *\n * @param {Object} target\n *\n * @return {Object}\n */\n expire(target) {\n return this.getCache(target.__puid).push(target);\n }\n\n /**\n * Creates a new class instance\n *\n * @todo add more documentation\n *\n * @method create\n * @memberof Proton#Proton.Pool\n *\n * @param {Object|Function} target any Object or Function\n * @param {Object} [params] just add if `target` is a function\n *\n * @return {Object}\n */\n createOrClone(target, params) {\n this.total++;\n\n if (this.create) {\n return this.create(target, params);\n } else if (typeof target === \"function\") {\n return Util.classApply(target, params);\n } else {\n return target.clone();\n }\n }\n\n /**\n * @todo add description - what is in the cache?\n *\n * @method getCount\n * @memberof Proton#Proton.Pool\n *\n * @return {Number}\n */\n getCount() {\n let count = 0;\n for (let id in this.cache) count += this.cache[id].length;\n return count++;\n }\n\n /**\n * Destroyes all items from Pool.cache\n *\n * @method destroy\n * @memberof Proton#Proton.Pool\n */\n destroy() {\n for (let id in this.cache) {\n this.cache[id].length = 0;\n delete this.cache[id];\n }\n }\n\n /**\n * Returns Pool.cache\n *\n * @method getCache\n * @memberof Proton#Proton.Pool\n * @private\n *\n * @param {Number} uid the unique id\n *\n * @return {Object}\n */\n getCache(uid = \"default\") {\n if (!this.cache[uid]) this.cache[uid] = [];\n return this.cache[uid];\n }\n}\n","export default class Stats {\n constructor(proton) {\n this.proton = proton;\n this.container = null;\n this.type = 1;\n\n this.emitterIndex = 0;\n this.rendererIndex = 0;\n }\n\n update(style, body) {\n this.add(style, body);\n\n const emitter = this.getEmitter();\n const renderer = this.getRenderer();\n let str = \"\";\n\n switch (this.type) {\n case 2:\n str += \"emitter:\" + this.proton.emitters.length + \"
\";\n if (emitter) str += \"em speed:\" + emitter.emitSpeed + \"
\";\n if (emitter) str += \"pos:\" + this.getEmitterPos(emitter);\n break;\n\n case 3:\n if (emitter) str += \"initializes:\" + emitter.initializes.length + \"
\";\n if (emitter)\n str += '' + this.concatArr(emitter.initializes) + \"
\";\n if (emitter) str += \"behaviours:\" + emitter.behaviours.length + \"
\";\n if (emitter) str += '' + this.concatArr(emitter.behaviours) + \"
\";\n break;\n\n case 4:\n if (renderer) str += renderer.name + \"
\";\n if (renderer) str += \"body:\" + this.getCreatedNumber(renderer) + \"
\";\n break;\n\n default:\n str += \"particles:\" + this.proton.getCount() + \"
\";\n str += \"pool:\" + this.proton.pool.getCount() + \"
\";\n str += \"total:\" + this.proton.pool.total;\n }\n\n this.container.innerHTML = str;\n }\n\n add(style, body) {\n if (!this.container) {\n this.type = 1;\n\n this.container = document.createElement(\"div\");\n this.container.style.cssText = [\n \"position:absolute;bottom:0px;left:0;cursor:pointer;\",\n \"opacity:0.9;z-index:10000;padding:10px;font-size:12px;font-family:Helvetica,Arial,sans-serif;\",\n \"width:120px;height:50px;background-color:#002;color:#0ff;\"\n ].join(\"\");\n\n this.container.addEventListener(\n \"click\",\n e => {\n this.type++;\n if (this.type > 4) this.type = 1;\n },\n false\n );\n\n let bg, color;\n switch (style) {\n case 2:\n bg = \"#201\";\n color = \"#f08\";\n break;\n\n case 3:\n bg = \"#020\";\n color = \"#0f0\";\n break;\n\n default:\n bg = \"#002\";\n color = \"#0ff\";\n }\n\n this.container.style[\"background-color\"] = bg;\n this.container.style[\"color\"] = color;\n }\n\n if (!this.container.parentNode) {\n body = body || this.body || document.body;\n body.appendChild(this.container);\n }\n }\n\n getEmitter() {\n return this.proton.emitters[this.emitterIndex];\n }\n\n getRenderer() {\n return this.proton.renderers[this.rendererIndex];\n }\n\n concatArr(arr) {\n let result = \"\";\n if (!arr || !arr.length) return result;\n\n for (let i = 0; i < arr.length; i++) {\n result += (arr[i].name || \"\").substr(0, 1) + \".\";\n }\n\n return result;\n }\n\n getCreatedNumber(renderer) {\n return renderer.pool.total || (renderer.cpool && renderer.cpool.total) || 0;\n }\n\n getEmitterPos(e) {\n return Math.round(e.p.x) + \",\" + Math.round(e.p.y);\n }\n\n destroy() {\n if (this.container && this.container.parentNode) {\n const body = this.body || document.body;\n body.removeChild(this.container);\n }\n\n this.proton = null;\n this.container = null;\n }\n}\n","/*\n * EventDispatcher\n * This code reference since http://createjs.com/.\n *\n **/\n\nexport default class EventDispatcher {\n constructor() {\n this._listeners = null;\n }\n\n static bind(target) {\n target.prototype.dispatchEvent = EventDispatcher.prototype.dispatchEvent;\n target.prototype.hasEventListener = EventDispatcher.prototype.hasEventListener;\n target.prototype.addEventListener = EventDispatcher.prototype.addEventListener;\n target.prototype.removeEventListener = EventDispatcher.prototype.removeEventListener;\n target.prototype.removeAllEventListeners = EventDispatcher.prototype.removeAllEventListeners;\n }\n\n addEventListener(type, listener) {\n if (!this._listeners) {\n this._listeners = {};\n } else {\n this.removeEventListener(type, listener);\n }\n\n if (!this._listeners[type]) this._listeners[type] = [];\n this._listeners[type].push(listener);\n\n return listener;\n }\n\n removeEventListener(type, listener) {\n if (!this._listeners) return;\n if (!this._listeners[type]) return;\n\n const arr = this._listeners[type];\n const length = arr.length;\n\n for (let i = 0; i < length; i++) {\n if (arr[i] === listener) {\n if (length === 1) {\n delete this._listeners[type];\n }\n\n // allows for faster checks.\n else {\n arr.splice(i, 1);\n }\n\n break;\n }\n }\n }\n\n removeAllEventListeners(type) {\n if (!type) this._listeners = null;\n else if (this._listeners) delete this._listeners[type];\n }\n\n dispatchEvent(type, args) {\n let result = false;\n const listeners = this._listeners;\n\n if (type && listeners) {\n let arr = listeners[type];\n if (!arr) return result;\n\n // arr = arr.slice();\n // to avoid issues with items being removed or added during the dispatch\n\n let handler;\n let i = arr.length;\n while (i--) {\n handler = arr[i];\n result = result || handler(args);\n }\n }\n\n return !!result;\n }\n\n hasEventListener(type) {\n const listeners = this._listeners;\n return !!(listeners && listeners[type]);\n }\n}\n","const PI = 3.1415926;\nconst INFINITY = Infinity;\n\nconst MathUtil = {\n PI: PI,\n PIx2: PI * 2,\n PI_2: PI / 2,\n PI_180: PI / 180,\n N180_PI: 180 / PI,\n Infinity: -999,\n\n isInfinity(num) {\n return num === this.Infinity || num === INFINITY;\n },\n\n randomAToB(a, b, isInt = false) {\n if (!isInt) return a + Math.random() * (b - a);\n else return ((Math.random() * (b - a)) >> 0) + a;\n },\n\n randomFloating(center, f, isInt) {\n return this.randomAToB(center - f, center + f, isInt);\n },\n\n randomColor() {\n return \"#\" + (\"00000\" + ((Math.random() * 0x1000000) << 0).toString(16)).slice(-6);\n },\n\n randomZone(display) {},\n\n floor(num, k = 4) {\n const digits = Math.pow(10, k);\n return Math.floor(num * digits) / digits;\n },\n\n degreeTransform(a) {\n return (a * PI) / 180;\n },\n\n toColor16(num) {\n return `#${num.toString(16)}`;\n }\n};\n\nexport default MathUtil;\n","export default class Integration {\n constructor(type) {\n this.type = type;\n }\n\n calculate(particles, time, damping) {\n this.eulerIntegrate(particles, time, damping);\n }\n\n // Euler Integrate\n // https://rosettacode.org/wiki/Euler_method\n eulerIntegrate(particle, time, damping) {\n if (!particle.sleep) {\n particle.old.p.copy(particle.p);\n particle.old.v.copy(particle.v);\n\n particle.a.multiplyScalar(1 / particle.mass);\n particle.v.add(particle.a.multiplyScalar(time));\n particle.p.add(particle.old.v.multiplyScalar(time));\n\n if (damping) particle.v.multiplyScalar(damping);\n\n particle.a.clear();\n }\n }\n}\n","import Pool from \"./Pool\";\nimport Util from \"../utils/Util\";\nimport Stats from \"../debug/Stats\";\nimport EventDispatcher from \"../events/EventDispatcher\";\nimport MathUtil from \"../math/MathUtil\";\nimport Integration from \"../math/Integration\";\n\nexport default class Proton {\n static USE_CLOCK = false;\n\n // measure 1:100\n static MEASURE = 100;\n static EULER = \"euler\";\n static RK2 = \"runge-kutta2\";\n\n // event name\n static PARTICLE_CREATED = \"PARTICLE_CREATED\";\n static PARTICLE_UPDATE = \"PARTICLE_UPDATE\";\n static PARTICLE_SLEEP = \"PARTICLE_SLEEP\";\n static PARTICLE_DEAD = \"PARTICLE_DEAD\";\n\n static EMITTER_ADDED = \"EMITTER_ADDED\";\n static EMITTER_REMOVED = \"EMITTER_REMOVED\";\n\n static PROTON_UPDATE = \"PROTON_UPDATE\";\n static PROTON_UPDATE_AFTER = \"PROTON_UPDATE_AFTER\";\n static DEFAULT_INTERVAL = 0.0167;\n\n static amendChangeTabsBug = true;\n\n /**\n * The constructor to add emitters\n *\n * @constructor Proton\n *\n * @todo proParticleCount is not in use\n * @todo add more documentation of the single properties and parameters\n *\n * @param {Number} [proParticleCount] not in use?\n * @param {Number} [integrationType=Proton.EULER]\n *\n * @property {String} [integrationType=Proton.EULER]\n * @property {Array} emitters All added emitter\n * @property {Array} renderers All added renderer\n * @property {Number} time The active time\n * @property {Number} oldtime The old time\n */\n constructor(integrationType) {\n this.emitters = [];\n this.renderers = [];\n\n this.time = 0;\n this.now = 0;\n this.then = 0;\n this.elapsed = 0;\n\n this.stats = new Stats(this);\n this.pool = new Pool(80);\n\n this.integrationType = Util.initValue(integrationType, Proton.EULER);\n this.integrator = new Integration(this.integrationType);\n\n this._fps = \"auto\";\n this._interval = Proton.DEFAULT_INTERVAL;\n }\n\n set fps(fps) {\n this._fps = fps;\n this._interval = fps === \"auto\" ? Proton.DEFAULT_INTERVAL : MathUtil.floor(1 / fps, 7);\n }\n\n get fps() {\n return this._fps;\n }\n\n /**\n * add a type of Renderer\n *\n * @method addRenderer\n * @memberof Proton\n * @instance\n *\n * @param {Renderer} render\n */\n addRenderer(render) {\n render.init(this);\n this.renderers.push(render);\n }\n\n /**\n * @name add a type of Renderer\n *\n * @method addRenderer\n * @param {Renderer} render\n */\n removeRenderer(render) {\n const index = this.renderers.indexOf(render);\n this.renderers.splice(index, 1);\n render.remove(this);\n }\n\n /**\n * add the Emitter\n *\n * @method addEmitter\n * @memberof Proton\n * @instance\n *\n * @param {Emitter} emitter\n */\n addEmitter(emitter) {\n this.emitters.push(emitter);\n emitter.parent = this;\n\n this.dispatchEvent(Proton.EMITTER_ADDED, emitter);\n }\n\n /**\n * Removes an Emitter\n *\n * @method removeEmitter\n * @memberof Proton\n * @instance\n *\n * @param {Proton.Emitter} emitter\n */\n removeEmitter(emitter) {\n const index = this.emitters.indexOf(emitter);\n this.emitters.splice(index, 1);\n emitter.parent = null;\n\n this.dispatchEvent(Proton.EMITTER_REMOVED, emitter);\n }\n\n /**\n * Updates all added emitters\n *\n * @method update\n * @memberof Proton\n * @instance\n */\n update() {\n // 'auto' is the default browser refresh rate, the vast majority is 60fps\n if (this._fps === \"auto\") {\n this.dispatchEvent(Proton.PROTON_UPDATE);\n\n if (Proton.USE_CLOCK) {\n if (!this.then) this.then = new Date().getTime();\n this.now = new Date().getTime();\n this.elapsed = (this.now - this.then) * 0.001;\n // Fix bugs such as chrome browser switching tabs causing excessive time difference\n this.amendChangeTabsBug();\n\n if (this.elapsed > 0) this.emittersUpdate(this.elapsed);\n this.then = this.now;\n } else {\n this.emittersUpdate(Proton.DEFAULT_INTERVAL);\n }\n\n this.dispatchEvent(Proton.PROTON_UPDATE_AFTER);\n }\n\n // If the fps frame rate is set\n else {\n if (!this.then) this.then = new Date().getTime();\n this.now = new Date().getTime();\n this.elapsed = (this.now - this.then) * 0.001;\n\n if (this.elapsed > this._interval) {\n this.dispatchEvent(Proton.PROTON_UPDATE);\n this.emittersUpdate(this._interval);\n // https://stackoverflow.com/questions/19764018/controlling-fps-with-requestanimationframe\n this.then = this.now - (this.elapsed % this._interval) * 1000;\n this.dispatchEvent(Proton.PROTON_UPDATE_AFTER);\n }\n }\n }\n\n emittersUpdate(elapsed) {\n let i = this.emitters.length;\n while (i--) this.emitters[i].update(elapsed);\n }\n\n /**\n * @todo add description\n *\n * @method amendChangeTabsBug\n * @memberof Proton\n * @instance\n */\n amendChangeTabsBug() {\n if (!Proton.amendChangeTabsBug) return;\n if (this.elapsed > 0.5) {\n this.then = new Date().getTime();\n this.elapsed = 0;\n }\n }\n\n /**\n * Counts all particles from all emitters\n *\n * @method getCount\n * @memberof Proton\n * @instance\n */\n getCount() {\n let total = 0;\n let i = this.emitters.length;\n\n while (i--) total += this.emitters[i].particles.length;\n return total;\n }\n\n getAllParticles() {\n let particles = [];\n let i = this.emitters.length;\n\n while (i--) particles = particles.concat(this.emitters[i].particles);\n return particles;\n }\n\n destroyAllEmitters() {\n Util.destroyAll(this.emitters);\n }\n\n /**\n * Destroys everything related to this Proton instance. This includes all emitters, and all properties\n *\n * @method destroy\n * @memberof Proton\n * @instance\n */\n destroy(remove = false) {\n const destroyOther = () => {\n this.time = 0;\n this.then = 0;\n this.pool.destroy();\n this.stats.destroy();\n\n Util.destroyAll(this.emitters);\n Util.destroyAll(this.renderers, this.getAllParticles());\n\n this.integrator = null;\n this.renderers = null;\n this.emitters = null;\n this.stats = null;\n this.pool = null;\n };\n\n if (remove) {\n setTimeout(destroyOther, 200);\n } else {\n destroyOther();\n }\n }\n}\n\nEventDispatcher.bind(Proton);\n","export default class Rgb {\n constructor(r = 255, g = 255, b = 255) {\n this.r = r;\n this.g = g;\n this.b = b;\n }\n\n reset() {\n this.r = 255;\n this.g = 255;\n this.b = 255;\n }\n}\n","export default {\n hasProp(target, key) {\n if (!target) return false;\n return target[key] !== undefined;\n // return obj.hasOwnProperty(key);\n },\n\n /**\n * set the prototype in a given prototypeObject\n *\n * @memberof Proton#Proton.Util\n * @method setProp\n *\n * @todo add description for param `target`\n * @todo translate desription from chinese to english\n *\n * @param {Object} target\n * @param {Object} prototypeObject An object of single prototypes\n *\n * @return {Object} target\n */\n setProp(target, props) {\n for (let prop in props) {\n if (target.hasOwnProperty(prop)) {\n target[prop] = Span.getSpanValue(props[prop]);\n }\n }\n\n return target;\n },\n\n /**\n * @memberof Proton#Proton.Util\n * @method setVectorVal\n *\n * @todo add description for param `target`\n * @todo add description for param `conf`\n * @todo add description for function\n *\n * @param {Object} target\n * @param {Object} conf\n */\n setVectorVal(particle, conf = null) {\n if (!conf) return;\n\n if (this.hasProp(conf, \"x\")) particle.p.x = conf[\"x\"];\n if (this.hasProp(conf, \"y\")) particle.p.y = conf[\"y\"];\n\n if (this.hasProp(conf, \"vx\")) particle.v.x = conf[\"vx\"];\n if (this.hasProp(conf, \"vy\")) particle.v.y = conf[\"vy\"];\n\n if (this.hasProp(conf, \"ax\")) particle.a.x = conf[\"ax\"];\n if (this.hasProp(conf, \"ay\")) particle.a.y = conf[\"ay\"];\n\n if (this.hasProp(conf, \"p\")) particle.p.copy(conf[\"p\"]);\n if (this.hasProp(conf, \"v\")) particle.v.copy(conf[\"v\"]);\n if (this.hasProp(conf, \"a\")) particle.a.copy(conf[\"a\"]);\n\n if (this.hasProp(conf, \"position\")) particle.p.copy(conf[\"position\"]);\n if (this.hasProp(conf, \"velocity\")) particle.v.copy(conf[\"velocity\"]);\n if (this.hasProp(conf, \"accelerate\")) particle.a.copy(conf[\"accelerate\"]);\n }\n};\n","import MathUtil from \"./MathUtil\";\n\nexport default {\n easeLinear(value) {\n return value;\n },\n\n easeInQuad(value) {\n return Math.pow(value, 2);\n },\n\n easeOutQuad(value) {\n return -(Math.pow(value - 1, 2) - 1);\n },\n\n easeInOutQuad(value) {\n if ((value /= 0.5) < 1) return 0.5 * Math.pow(value, 2);\n\n return -0.5 * ((value -= 2) * value - 2);\n },\n\n easeInCubic(value) {\n return Math.pow(value, 3);\n },\n\n easeOutCubic(value) {\n return Math.pow(value - 1, 3) + 1;\n },\n\n easeInOutCubic(value) {\n if ((value /= 0.5) < 1) return 0.5 * Math.pow(value, 3);\n\n return 0.5 * (Math.pow(value - 2, 3) + 2);\n },\n\n easeInQuart(value) {\n return Math.pow(value, 4);\n },\n\n easeOutQuart(value) {\n return -(Math.pow(value - 1, 4) - 1);\n },\n\n easeInOutQuart(value) {\n if ((value /= 0.5) < 1) return 0.5 * Math.pow(value, 4);\n\n return -0.5 * ((value -= 2) * Math.pow(value, 3) - 2);\n },\n\n easeInSine(value) {\n return -Math.cos(value * MathUtil.PI_2) + 1;\n },\n\n easeOutSine(value) {\n return Math.sin(value * MathUtil.PI_2);\n },\n\n easeInOutSine(value) {\n return -0.5 * (Math.cos(Math.PI * value) - 1);\n },\n\n easeInExpo(value) {\n return value === 0 ? 0 : Math.pow(2, 10 * (value - 1));\n },\n\n easeOutExpo(value) {\n return value === 1 ? 1 : -Math.pow(2, -10 * value) + 1;\n },\n\n easeInOutExpo(value) {\n if (value === 0) return 0;\n\n if (value === 1) return 1;\n\n if ((value /= 0.5) < 1) return 0.5 * Math.pow(2, 10 * (value - 1));\n\n return 0.5 * (-Math.pow(2, -10 * --value) + 2);\n },\n\n easeInCirc(value) {\n return -(Math.sqrt(1 - value * value) - 1);\n },\n\n easeOutCirc(value) {\n return Math.sqrt(1 - Math.pow(value - 1, 2));\n },\n\n easeInOutCirc(value) {\n if ((value /= 0.5) < 1) return -0.5 * (Math.sqrt(1 - value * value) - 1);\n return 0.5 * (Math.sqrt(1 - (value -= 2) * value) + 1);\n },\n\n easeInBack(value) {\n let s = 1.70158;\n return value * value * ((s + 1) * value - s);\n },\n\n easeOutBack(value) {\n let s = 1.70158;\n return (value = value - 1) * value * ((s + 1) * value + s) + 1;\n },\n\n easeInOutBack(value) {\n let s = 1.70158;\n if ((value /= 0.5) < 1) return 0.5 * (value * value * (((s *= 1.525) + 1) * value - s));\n return 0.5 * ((value -= 2) * value * (((s *= 1.525) + 1) * value + s) + 2);\n },\n\n getEasing(ease) {\n if (typeof ease === \"function\") return ease;\n else return this[ease] || this.easeLinear;\n }\n};\n","import MathUtil from \"../math/MathUtil\";\n\nexport default class Vector2D {\n constructor(x, y) {\n this.x = x || 0;\n this.y = y || 0;\n }\n\n set(x, y) {\n this.x = x;\n this.y = y;\n return this;\n }\n\n setX(x) {\n this.x = x;\n return this;\n }\n\n setY(y) {\n this.y = y;\n return this;\n }\n\n getGradient() {\n if (this.x !== 0) return Math.atan2(this.y, this.x);\n else if (this.y > 0) return MathUtil.PI_2;\n else if (this.y < 0) return -MathUtil.PI_2;\n }\n\n copy(v) {\n this.x = v.x;\n this.y = v.y;\n\n return this;\n }\n\n add(v, w) {\n if (w !== undefined) {\n return this.addVectors(v, w);\n }\n\n this.x += v.x;\n this.y += v.y;\n\n return this;\n }\n\n addXY(a, b) {\n this.x += a;\n this.y += b;\n\n return this;\n }\n\n addVectors(a, b) {\n this.x = a.x + b.x;\n this.y = a.y + b.y;\n\n return this;\n }\n\n sub(v, w) {\n if (w !== undefined) {\n return this.subVectors(v, w);\n }\n\n this.x -= v.x;\n this.y -= v.y;\n\n return this;\n }\n\n subVectors(a, b) {\n this.x = a.x - b.x;\n this.y = a.y - b.y;\n\n return this;\n }\n\n divideScalar(s) {\n if (s !== 0) {\n this.x /= s;\n this.y /= s;\n } else {\n this.set(0, 0);\n }\n\n return this;\n }\n\n multiplyScalar(s) {\n this.x *= s;\n this.y *= s;\n\n return this;\n }\n\n negate() {\n return this.multiplyScalar(-1);\n }\n\n dot(v) {\n return this.x * v.x + this.y * v.y;\n }\n\n lengthSq() {\n return this.x * this.x + this.y * this.y;\n }\n\n length() {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n }\n\n normalize() {\n return this.divideScalar(this.length());\n }\n\n distanceTo(v) {\n return Math.sqrt(this.distanceToSquared(v));\n }\n\n rotate(tha) {\n const x = this.x;\n const y = this.y;\n\n this.x = x * Math.cos(tha) + y * Math.sin(tha);\n this.y = -x * Math.sin(tha) + y * Math.cos(tha);\n\n return this;\n }\n\n distanceToSquared(v) {\n const dx = this.x - v.x;\n const dy = this.y - v.y;\n\n return dx * dx + dy * dy;\n }\n\n lerp(v, alpha) {\n this.x += (v.x - this.x) * alpha;\n this.y += (v.y - this.y) * alpha;\n\n return this;\n }\n\n equals(v) {\n return v.x === this.x && v.y === this.y;\n }\n\n clear() {\n this.x = 0.0;\n this.y = 0.0;\n return this;\n }\n\n clone() {\n return new Vector2D(this.x, this.y);\n }\n}\n","/** @typedef {import('../behaviour/Behaviour')} Behaviour */\n/** @typedef {import('../math/Vector2D')} Vector2D */\n/** @typedef {import('../utils/Rgb')} Rgb */\nimport Rgb from \"../utils/Rgb\";\nimport Puid from \"../utils/Puid\";\nimport Util from \"../utils/Util\";\nimport PropUtil from \"../utils/PropUtil\";\nimport ease from \"../math/ease\";\nimport Vector2D from \"../math/Vector2D\";\nimport MathUtil from \"../math/MathUtil\";\n\nexport default class Particle {\n /** @type string */\n id = \"\";\n\n /** @type {{p:Vector2D,v:Vector2D,a:Vector2D}} */\n old = {};\n\n /** @type {object} */\n data = {};\n\n /** @type {Behaviour[]} */\n behaviours = [];\n\n /** @type {Vector2D} */\n p = [];\n\n /** @type {Vector2D} */\n v = [];\n\n /** @type {Vector2D} */\n a = [];\n\n /** @type {Rgb} */\n rgb = {};\n\n /**\n * the Particle class\n *\n * @class Proton.Particle\n * @constructor\n * @param {Object} pObj the parameters object;\n * for example {life:3,dead:false}\n */\n constructor(conf) {\n /**\n * The particle's id;\n * @property id\n * @type {string}\n */\n this.name = \"Particle\";\n this.id = Puid.id(this.name);\n this.old = {};\n this.data = {};\n this.behaviours = [];\n\n this.p = new Vector2D();\n this.v = new Vector2D();\n this.a = new Vector2D();\n this.old.p = new Vector2D();\n this.old.v = new Vector2D();\n this.old.a = new Vector2D();\n\n this.rgb = new Rgb();\n this.reset();\n conf && PropUtil.setProp(this, conf);\n }\n\n getDirection() {\n return Math.atan2(this.v.x, -this.v.y) * MathUtil.N180_PI;\n }\n\n reset() {\n this.life = Infinity;\n this.age = 0;\n\n this.dead = false;\n this.sleep = false;\n this.body = null;\n this.sprite = null;\n this.parent = null;\n\n this.energy = 1; // Energy Loss\n this.mass = 1;\n this.radius = 10;\n this.alpha = 1;\n this.scale = 1;\n this.rotation = 0;\n this.color = null;\n\n this.p.set(0, 0);\n this.v.set(0, 0);\n this.a.set(0, 0);\n this.old.p.set(0, 0);\n this.old.v.set(0, 0);\n this.old.a.set(0, 0);\n this.easing = ease.easeLinear;\n\n this.rgb.reset();\n Util.emptyObject(this.data);\n this.removeAllBehaviours();\n\n return this;\n }\n\n update(time, index) {\n if (!this.sleep) {\n this.age += time;\n this.applyBehaviours(time, index);\n }\n\n if (this.age < this.life) {\n const scale = this.easing(this.age / this.life);\n this.energy = Math.max(1 - scale, 0);\n } else {\n this.destroy();\n }\n }\n\n applyBehaviours(time, index) {\n const length = this.behaviours.length;\n let i;\n\n for (i = 0; i < length; i++) {\n this.behaviours[i] && this.behaviours[i].applyBehaviour(this, time, index);\n }\n }\n\n /**\n * @param {Behaviour} behaviour\n */\n addBehaviour(behaviour) {\n this.behaviours.push(behaviour);\n\n if (behaviour.hasOwnProperty(\"parents\")) behaviour.parents.push(this);\n behaviour.initialize(this);\n }\n\n /**\n * @param {Behaviour[]} behaviours\n */\n addBehaviours(behaviours) {\n const length = behaviours.length;\n let i;\n\n for (i = 0; i < length; i++) {\n this.addBehaviour(behaviours[i]);\n }\n }\n\n removeBehaviour(behaviour) {\n const index = this.behaviours.indexOf(behaviour);\n\n if (index > -1) {\n const behaviour = this.behaviours.splice(index, 1);\n behaviour.parents = null;\n }\n }\n\n removeAllBehaviours() {\n Util.emptyArray(this.behaviours);\n }\n\n /**\n * Destory this particle\n * @method destroy\n */\n destroy() {\n this.removeAllBehaviours();\n this.energy = 0;\n this.dead = true;\n this.parent = null;\n }\n}\n","export default {\n /**\n * @typedef {Object} rgbObject\n * @property {Number} r red value\n * @property {Number} g green value\n * @property {Number} b blue value\n */\n /**\n * converts a hex value to a rgb object\n *\n * @memberof Proton#Proton.Util\n * @method hexToRgb\n *\n * @param {String} h any hex value, e.g. #000000 or 000000 for black\n *\n * @return {rgbObject}\n */\n hexToRgb(h) {\n const hex16 = h.charAt(0) === \"#\" ? h.substring(1, 7) : h;\n const r = parseInt(hex16.substring(0, 2), 16);\n const g = parseInt(hex16.substring(2, 4), 16);\n const b = parseInt(hex16.substring(4, 6), 16);\n\n return { r, g, b };\n },\n\n /**\n * converts a rgb value to a rgb string\n *\n * @memberof Proton#Proton.Util\n * @method rgbToHex\n *\n * @param {Object | Proton.hexToRgb} rgb a rgb object like in {@link Proton#Proton.}\n *\n * @return {String} rgb()\n */\n rgbToHex(rbg) {\n return `rgb(${rbg.r}, ${rbg.g}, ${rbg.b})`;\n },\n\n getHex16FromParticle(p) {\n return Number(p.rgb.r) * 65536 + Number(p.rgb.g) * 256 + Number(p.rgb.b);\n }\n};\n","import Vector2D from \"./Vector2D\";\n\nexport default class Polar2D {\n constructor(r, tha) {\n this.r = Math.abs(r) || 0;\n this.tha = tha || 0;\n }\n\n set(r, tha) {\n this.r = r;\n this.tha = tha;\n return this;\n }\n\n setR(r) {\n this.r = r;\n return this;\n }\n\n setTha(tha) {\n this.tha = tha;\n return this;\n }\n\n copy(p) {\n this.r = p.r;\n this.tha = p.tha;\n return this;\n }\n\n toVector() {\n return new Vector2D(this.getX(), this.getY());\n }\n\n getX() {\n return this.r * Math.sin(this.tha);\n }\n\n getY() {\n return -this.r * Math.cos(this.tha);\n }\n\n normalize() {\n this.r = 1;\n return this;\n }\n\n equals(v) {\n return v.r === this.r && v.tha === this.tha;\n }\n\n clear() {\n this.r = 0.0;\n this.tha = 0.0;\n return this;\n }\n\n clone() {\n return new Polar2D(this.r, this.tha);\n }\n}\n","const Mat3 = {\n create(mat3) {\n const mat = new Float32Array(9);\n if (mat3) this.set(mat3, mat);\n\n return mat;\n },\n\n set(mat1, mat2) {\n for (let i = 0; i < 9; i++) mat2[i] = mat1[i];\n\n return mat2;\n },\n\n multiply(mat, mat2, mat3) {\n let a00 = mat[0],\n a01 = mat[1],\n a02 = mat[2],\n a10 = mat[3],\n a11 = mat[4],\n a20 = mat[6],\n a21 = mat[7],\n b00 = mat2[0],\n b01 = mat2[1],\n b02 = mat2[2],\n b10 = mat2[3],\n b11 = mat2[4],\n b20 = mat2[6],\n b21 = mat2[7];\n\n mat3[0] = b00 * a00 + b01 * a10;\n mat3[1] = b00 * a01 + b01 * a11;\n mat3[2] = a02 * b02;\n mat3[3] = b10 * a00 + b11 * a10;\n mat3[4] = b10 * a01 + b11 * a11;\n mat3[6] = b20 * a00 + b21 * a10 + a20;\n mat3[7] = b20 * a01 + b21 * a11 + a21;\n\n return mat3;\n },\n\n inverse(mat, mat3) {\n let a00 = mat[0],\n a01 = mat[1],\n a10 = mat[3],\n a11 = mat[4],\n a20 = mat[6],\n a21 = mat[7],\n b01 = a11,\n b11 = -a10,\n b21 = a21 * a10 - a11 * a20,\n d = a00 * b01 + a01 * b11,\n id;\n\n id = 1 / d;\n mat3[0] = b01 * id;\n mat3[1] = -a01 * id;\n mat3[3] = b11 * id;\n mat3[4] = a00 * id;\n mat3[6] = b21 * id;\n mat3[7] = (-a21 * a00 + a01 * a20) * id;\n\n return mat3;\n },\n\n multiplyVec2(m, vec, mat3) {\n let x = vec[0],\n y = vec[1];\n\n mat3[0] = x * m[0] + y * m[3] + m[6];\n mat3[1] = x * m[1] + y * m[4] + m[7];\n\n return mat3;\n }\n};\n\nexport default Mat3;\n","import Util from \"../utils/Util\";\nimport MathUtil from \"../math/MathUtil\";\n\nexport default class Span {\n constructor(a, b, center) {\n if (Util.isArray(a)) {\n this.isArray = true;\n this.a = a;\n } else {\n this.isArray = false;\n this.a = Util.initValue(a, 1);\n this.b = Util.initValue(b, this.a);\n this.center = Util.initValue(center, false);\n }\n }\n\n getValue(isInt = false) {\n if (this.isArray) {\n return Util.getRandFromArray(this.a);\n } else {\n if (!this.center) {\n return MathUtil.randomAToB(this.a, this.b, isInt);\n } else {\n return MathUtil.randomFloating(this.a, this.b, isInt);\n }\n }\n }\n\n /**\n * Returns a new Span object\n *\n * @memberof Proton#Proton.Util\n * @method setSpanValue\n *\n * @todo a, b and c should be 'Mixed' or 'Number'?\n *\n * @param {Mixed | Span} a\n * @param {Mixed} b\n * @param {Mixed} c\n *\n * @return {Span}\n */\n static setSpanValue(a, b, c) {\n if (a instanceof Span) {\n return a;\n } else {\n if (b === undefined) {\n return new Span(a);\n } else {\n if (c === undefined) return new Span(a, b);\n else return new Span(a, b, c);\n }\n }\n }\n\n /**\n * Returns the value from a Span, if the param is not a Span it will return the given parameter\n *\n * @memberof Proton#Proton.Util\n * @method getValue\n *\n * @param {Mixed | Span} pan\n *\n * @return {Mixed} the value of Span OR the parameter if it is not a Span\n */\n static getSpanValue(pan) {\n return pan instanceof Span ? pan.getValue() : pan;\n }\n}\n","import Span from \"./Span\";\nimport Util from \"../utils/Util\";\nimport MathUtil from \"./MathUtil\";\n\nexport default class ArraySpan extends Span {\n constructor(color) {\n super();\n this._arr = Util.toArray(color);\n }\n\n getValue() {\n const val = Util.getRandFromArray(this._arr);\n return val === \"random\" || val === \"Random\" ? MathUtil.randomColor() : val;\n }\n\n /**\n * Make sure that the color is an instance of Proton.ArraySpan, if not it makes a new instance\n *\n * @method setSpanValue\n * @memberof Proton#Proton.Color\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n static createArraySpan(arr) {\n if (!arr) return null;\n\n if (arr instanceof ArraySpan) return arr;\n else return new ArraySpan(arr);\n }\n}\n","export default class Rectangle {\n constructor(x, y, w, h) {\n this.x = x;\n this.y = y;\n\n this.width = w;\n this.height = h;\n\n this.bottom = this.y + this.height;\n this.right = this.x + this.width;\n }\n\n contains(x, y) {\n if (x <= this.right && x >= this.x && y <= this.bottom && y >= this.y) return true;\n else return false;\n }\n}\n","import Span from \"../math/Span\";\nimport Util from \"../utils/Util\";\n\nexport default class Rate {\n /**\n * The number of particles per second emission (a [particle]/b [s]);\n * @namespace\n * @memberof! Proton#\n * @constructor\n * @alias Rate\n *\n * @param {Array | Number | Span} numpan the number of each emission;\n * @param {Array | Number | Span} timepan the time of each emission;\n * for example: new Rate(new Span(10, 20), new Span(.1, .25));\n */\n constructor(numpan, timepan) {\n this.numPan = Span.setSpanValue(Util.initValue(numpan, 1));\n this.timePan = Span.setSpanValue(Util.initValue(timepan, 1));\n\n this.startTime = 0;\n this.nextTime = 0;\n this.init();\n }\n\n init() {\n this.startTime = 0;\n this.nextTime = this.timePan.getValue();\n }\n\n getValue(time) {\n this.startTime += time;\n\n if (this.startTime >= this.nextTime) {\n this.startTime = 0;\n this.nextTime = this.timePan.getValue();\n\n if (this.numPan.b === 1) {\n if (this.numPan.getValue(false) > 0.5) return 1;\n else return 0;\n } else {\n return this.numPan.getValue(true);\n }\n }\n\n return 0;\n }\n}\n","export default class Initialize {\n reset() {}\n\n init(emitter, particle) {\n if (particle) {\n this.initialize(particle);\n } else {\n this.initialize(emitter);\n }\n }\n\n // sub class init\n initialize(target) {}\n}\n","import Span from \"../math/Span\";\nimport Initialize from \"./Initialize\";\n\nexport default class Life extends Initialize {\n constructor(a, b, c) {\n super();\n\n this.lifePan = Span.setSpanValue(a, b, c);\n this.name = \"Life\";\n }\n\n initialize(target) {\n if (this.lifePan.a === Infinity) target.life = Infinity;\n else target.life = this.lifePan.getValue();\n }\n}\n","import Vector2D from \"../math/Vector2D\";\n\nexport default class Zone {\n constructor() {\n this.vector = new Vector2D(0, 0);\n this.random = 0;\n this.crossType = \"dead\";\n this.alert = true;\n }\n\n getPosition() {}\n\n crossing(particle) {}\n\n destroy() {\n this.vector = null;\n }\n}\n","import Zone from \"./Zone\";\n\nexport default class PointZone extends Zone {\n constructor(x, y) {\n super();\n\n this.x = x;\n this.y = y;\n }\n\n getPosition() {\n this.vector.x = this.x;\n this.vector.y = this.y;\n\n return this.vector;\n }\n\n crossing(particle) {\n if (this.alert) {\n console.error(\"Sorry, PointZone does not support crossing method!\");\n this.alert = false;\n }\n }\n}\n","import Util from \"../utils/Util\";\nimport PointZone from \"../zone/PointZone\";\nimport Initialize from \"./Initialize\";\n\nexport default class Position extends Initialize {\n constructor(zone) {\n super();\n this.zone = Util.initValue(zone, new PointZone());\n this.name = \"Position\";\n }\n\n reset(zone) {\n this.zone = Util.initValue(zone, new PointZone());\n }\n\n initialize(target) {\n this.zone.getPosition();\n\n target.p.x = this.zone.vector.x;\n target.p.y = this.zone.vector.y;\n }\n}\n","import Proton from \"../core/Proton\";\nimport Span from \"../math/Span\";\nimport Util from \"../utils/Util\";\nimport Initialize from \"./Initialize\";\nimport Polar2D from \"../math/Polar2D\";\nimport MathUtil from \"../math/MathUtil\";\n\nexport default class Velocity extends Initialize {\n constructor(rpan, thapan, type) {\n super();\n\n this.rPan = Span.setSpanValue(rpan);\n this.thaPan = Span.setSpanValue(thapan);\n this.type = Util.initValue(type, \"vector\");\n\n this.name = \"Velocity\";\n }\n\n reset(rpan, thapan, type) {\n this.rPan = Span.setSpanValue(rpan);\n this.thaPan = Span.setSpanValue(thapan);\n this.type = Util.initValue(type, \"vector\");\n }\n\n normalizeVelocity(vr) {\n return vr * Proton.MEASURE;\n }\n\n initialize(target) {\n if (this.type === \"p\" || this.type === \"P\" || this.type === \"polar\") {\n const polar2d = new Polar2D(\n this.normalizeVelocity(this.rPan.getValue()),\n this.thaPan.getValue() * MathUtil.PI_180\n );\n\n target.v.x = polar2d.getX();\n target.v.y = polar2d.getY();\n } else {\n target.v.x = this.normalizeVelocity(this.rPan.getValue());\n target.v.y = this.normalizeVelocity(this.thaPan.getValue());\n }\n }\n}\n","import Span from \"../math/Span\";\nimport Initialize from \"./Initialize\";\n\nexport default class Mass extends Initialize {\n constructor(a, b, c) {\n super();\n this.massPan = Span.setSpanValue(a, b, c);\n this.name = \"Mass\";\n }\n\n initialize(target) {\n target.mass = this.massPan.getValue();\n }\n}\n","import Span from \"../math/Span\";\nimport Initialize from \"./Initialize\";\n\nexport default class Radius extends Initialize {\n constructor(a, b, c) {\n super();\n this.radius = Span.setSpanValue(a, b, c);\n\n this.name = \"Radius\";\n }\n\n reset(a, b, c) {\n this.radius = Span.setSpanValue(a, b, c);\n }\n\n initialize(particle) {\n particle.radius = this.radius.getValue();\n particle.data.oldRadius = particle.radius;\n }\n}\n","import Util from \"../utils/Util\";\nimport ArraySpan from \"../math/ArraySpan\";\nimport Initialize from \"./Initialize\";\n\nexport default class Body extends Initialize {\n constructor(image, w, h) {\n super();\n\n this.image = this.setSpanValue(image);\n this.w = Util.initValue(w, 20);\n this.h = Util.initValue(h, this.w);\n this.name = \"Body\";\n }\n\n initialize(particle) {\n const imageTarget = this.image.getValue();\n\n if (typeof imageTarget === \"string\") {\n particle.body = {\n width: this.w,\n height: this.h,\n src: imageTarget,\n isInner: true,\n inner: true\n };\n } else {\n particle.body = imageTarget;\n }\n }\n\n setSpanValue(image) {\n return image instanceof ArraySpan ? image : new ArraySpan(image);\n }\n}\n","import Proton from \"../core/Proton\";\nimport Util from \"../utils/Util\";\nimport ease from \"../math/ease\";\n\nexport default class Behaviour {\n static id = 0;\n\n /**\n * The Behaviour class is the base for the other Behaviour\n *\n * @memberof! -\n * @interface\n * @alias Proton.Behaviour\n *\n * @param {Number} life \tthe behaviours life\n * @param {String} easing \tThe behaviour's decaying trend, for example ease.easeOutQuart\n *\n * @property {String} id \t\tThe behaviours id\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n * @property {Number} age=0 \tHow long the particle should be 'alife'\n * @property {Number} energy=1\n * @property {Boolean} dead=false The particle is dead at first\n * @property {Array} parents \tThe behaviour's parents array\n * @property {String} name \tThe behaviour name\n */\n constructor(life, easing) {\n this.life = Util.initValue(life, Infinity);\n this.easing = ease.getEasing(easing);\n\n this.age = 0;\n this.energy = 1;\n this.dead = false;\n this.parents = [];\n\n this.id = `Behaviour_${Behaviour.id++}`;\n this.name = \"Behaviour\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton.Behaviour\n * @instance\n *\n * @param {Number} [life=Infinity] \t\tthis behaviour's life\n * @param {String} [easing=easeLinear] \tthis behaviour's easing\n */\n reset(life, easing) {\n this.life = Util.initValue(life, Infinity);\n this.easing = ease.getEasing(easing);\n }\n\n /**\n * Normalize a force by 1:100;\n *\n * @method normalizeForce\n * @memberof Proton.Behaviour\n * @instance\n *\n * @param {Proton.Vector2D} force\n */\n normalizeForce(force) {\n return force.multiplyScalar(Proton.MEASURE);\n }\n\n /**\n * Normalize a value by 1:100;\n *\n * @method normalizeValue\n * @memberof Proton.Behaviour\n * @instance\n *\n * @param {Number} value\n */\n normalizeValue(value) {\n return value * Proton.MEASURE;\n }\n\n /**\n * Initialize the behaviour's parameters for all particles\n *\n * @method initialize\n * @memberof Proton.Behaviour\n * @instance\n *\n * @param {Proton.Particle} particle\n */\n initialize(particle) {}\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton.Behaviour\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} \t\t\ttime the integrate time 1/ms\n * @param {Int} \t\t\tindex the particle index\n */\n calculate(particle, time, index) {\n this.age += time;\n\n if (this.age >= this.life || this.dead) {\n this.energy = 0;\n this.dead = true;\n this.destroy();\n } else {\n const scale = this.easing(particle.age / particle.life);\n this.energy = Math.max(1 - scale, 0);\n }\n }\n\n /**\n * Destory this behaviour\n *\n * @method destroy\n * @memberof Proton.Behaviour\n * @instance\n */\n destroy() {\n let i = this.parents.length;\n while (i--) {\n this.parents[i].removeBehaviour(this);\n }\n\n this.parents.length = 0;\n }\n}\n","import Vector2D from \"../math/Vector2D\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class Force extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Force\n *\n * @param {Number} fx\n * @param {Number} fy\n * @param {Number} [life=Infinity] \t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(fx, fy, life, easing) {\n super(life, easing);\n\n this.force = this.normalizeForce(new Vector2D(fx, fy));\n this.name = \"Force\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Force\n * @instance\n *\n * @param {Number} fx\n * @param {Number} fy\n * @param {Number} [life=Infinity] \t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(fx, fy, life, easing) {\n this.force = this.normalizeForce(new Vector2D(fx, fy));\n\n life && super.reset(life, easing);\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#Proton.Force\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n particle.a.add(this.force);\n }\n}\n","import Util from \"../utils/Util\";\nimport Vector2D from \"../math/Vector2D\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class Attraction extends Behaviour {\n /**\n * This behaviour let the particles follow one specific Proton.Vector2D\n *\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Attraction\n *\n * @todo add description for 'force' and 'radius'\n *\n * @param {Proton.Vector2D} targetPosition the attraction point coordinates\n * @param {Number} [force=100]\n * @param {Number} [radius=1000]\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {Proton.Vector2D} targetPosition\n * @property {Number} radius\n * @property {Number} force\n * @property {Number} radiusSq\n * @property {Proton.Vector2D} attractionForce\n * @property {Number} lengthSq\n * @property {String} name The Behaviour name\n */\n constructor(targetPosition, force, radius, life, easing) {\n super(life, easing);\n\n this.targetPosition = Util.initValue(targetPosition, new Vector2D());\n this.radius = Util.initValue(radius, 1000);\n this.force = Util.initValue(this.normalizeValue(force), 100);\n\n this.radiusSq = this.radius * this.radius;\n this.attractionForce = new Vector2D();\n this.lengthSq = 0;\n\n this.name = \"Attraction\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Attraction\n * @instance\n *\n * @todo add description for 'force' and 'radius'\n *\n * @param {Proton.Vector2D} targetPosition the attraction point coordinates\n * @param {Number} [force=100]\n * @param {Number} [radius=1000]\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(targetPosition, force, radius, life, easing) {\n this.targetPosition = Util.initValue(targetPosition, new Vector2D());\n this.radius = Util.initValue(radius, 1000);\n this.force = Util.initValue(this.normalizeValue(force), 100);\n\n this.radiusSq = this.radius * this.radius;\n this.attractionForce = new Vector2D();\n this.lengthSq = 0;\n\n life && super.reset(life, easing);\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @memberof Proton#Proton.Attraction\n * @method applyBehaviour\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} \t\t\ttime the integrate time 1/ms\n * @param {Int} \t\t\tindex the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n\n this.attractionForce.copy(this.targetPosition);\n this.attractionForce.sub(particle.p);\n this.lengthSq = this.attractionForce.lengthSq();\n\n if (this.lengthSq > 0.00004 && this.lengthSq < this.radiusSq) {\n this.attractionForce.normalize();\n this.attractionForce.multiplyScalar(1 - this.lengthSq / this.radiusSq);\n this.attractionForce.multiplyScalar(this.force);\n\n particle.a.add(this.attractionForce);\n }\n }\n}\n","import Vector2D from \"../math/Vector2D\";\nimport MathUtil from \"../math/MathUtil\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class RandomDrift extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Behaviour\n * @constructor\n * @alias RandomDrift\n *\n * @param {Number} driftX \t\t\t\tX value of the new Vector2D\n * @param {Number} driftY \t\t\t\tY value of the new Vector2D\n * @param {Number} delay \t\t\t\tHow much delay the drift should have\n * @param {Number} [life=Infinity] \t\tthis behaviour's life\n * @param {String} [easing=easeLinear] \tthis behaviour's easing\n *\n * @property {Number} time The time of the drift\n * @property {String} name The Behaviour name\n */\n constructor(driftX, driftY, delay, life, easing) {\n super(life, easing);\n\n this.reset(driftX, driftY, delay);\n this.time = 0;\n this.name = \"RandomDrift\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#RandomDrift\n * @instance\n *\n * @param {Number} driftX \t\t\t\tX value of the new Vector2D\n * @param {Number} driftY \t\t\t\tY value of the new Vector2D\n * @param {Number} delay \t\t\t\tHow much delay the drift should have\n * @param {Number} [life=Infinity] \t\tthis behaviour's life\n * @param {String} [easing=easeLinear] \tthis behaviour's easing\n */\n reset(driftX, driftY, delay, life, easing) {\n this.panFoce = new Vector2D(driftX, driftY);\n this.panFoce = this.normalizeForce(this.panFoce);\n this.delay = delay;\n\n life && super.reset(life, easing);\n }\n\n initialize(particle) {\n particle.data.time = 0;\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#RandomDrift\n * @instance\n *\n * @param {Particle} particle\n * @param {Number} \t\t\ttime the integrate time 1/ms\n * @param {Int} \t\t\tindex the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n particle.data.time += time;\n\n if (particle.data.time >= this.delay) {\n particle.a.addXY(\n MathUtil.randomAToB(-this.panFoce.x, this.panFoce.x),\n MathUtil.randomAToB(-this.panFoce.y, this.panFoce.y)\n );\n\n particle.data.time = 0;\n }\n }\n}\n","import Force from \"./Force\";\n\nexport default class Gravity extends Force {\n /**\n * @memberof! Proton#\n * @augments Proton#Proton.Force\n * @constructor\n * @alias Proton.Gravity\n *\n * @param {Number} g \t\t\t\t\t\t\tGravity\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(g, life, easing) {\n super(0, g, life, easing);\n this.name = \"Gravity\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Gravity\n * @instance\n *\n * @param {Number} g \t\t\t\t\t\t\tGravity\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(g, life, easing) {\n super.reset(0, g, life, easing);\n }\n}\n","import Util from \"../utils/Util\";\nimport Vector2D from \"../math/Vector2D\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class Collision extends Behaviour {\n /**\n * The callback after collision\n *\n * @callback Callback\n *\n * @param {Proton.Particle} particle\n * @param {Proton.Paritcle} otherParticle\n */\n /**\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Collision\n *\n * @todo add description to mass\n *\n * @param {Proton.Emitter} \t[emitter=null] \t\tthe attraction point coordinates\n * @param {Boolean} \t\t[mass=true]\n * @param {Callback}\t \t[callback=null]\t\tthe callback after the collision\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(emitter, mass, callback, life, easing) {\n super(life, easing);\n\n this.reset(emitter, mass, callback);\n this.name = \"Collision\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @memberof Proton#Proton.Collision\n * @method reset\n * @instance\n *\n * @todo add description to mass\n *\n * @param {Proton.Emitter} \t[emitter=null] \t\tthe attraction point coordinates\n * @param {Boolean} \t\t[mass=true]\n * @param {Callback}\t \t[callback=null]\t\tthe callback after the collision\n * @param {Number} \t\t\t[life=Infinity] \tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(emitter, mass, callback, life, easing) {\n this.emitter = Util.initValue(emitter, null);\n this.mass = Util.initValue(mass, true);\n this.callback = Util.initValue(callback, null);\n\n this.collisionPool = [];\n this.delta = new Vector2D();\n\n life && super.reset(life, easing);\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @memberof Proton#Proton.Collision\n * @method applyBehaviour\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} \t\t\ttime the integrate time 1/ms\n * @param {Int} \t\t\tindex the particle index\n */\n applyBehaviour(particle, time, index) {\n const newPool = this.emitter ? this.emitter.particles.slice(index) : this.pool.slice(index);\n const length = newPool.length;\n\n let otherParticle;\n let lengthSq;\n let overlap;\n let totalMass;\n let averageMass1, averageMass2;\n let i;\n\n for (i = 0; i < length; i++) {\n otherParticle = newPool[i];\n\n if (otherParticle !== particle) {\n this.delta.copy(otherParticle.p);\n this.delta.sub(particle.p);\n\n lengthSq = this.delta.lengthSq();\n const distance = particle.radius + otherParticle.radius;\n\n if (lengthSq <= distance * distance) {\n overlap = distance - Math.sqrt(lengthSq);\n overlap += 0.5;\n\n totalMass = particle.mass + otherParticle.mass;\n averageMass1 = this.mass ? otherParticle.mass / totalMass : 0.5;\n averageMass2 = this.mass ? particle.mass / totalMass : 0.5;\n\n particle.p.add(\n this.delta\n .clone()\n .normalize()\n .multiplyScalar(overlap * -averageMass1)\n );\n otherParticle.p.add(this.delta.normalize().multiplyScalar(overlap * averageMass2));\n\n this.callback && this.callback(particle, otherParticle);\n }\n }\n }\n }\n}\n","import Util from \"../utils/Util\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class CrossZone extends Behaviour {\n /**\n * Defines what happens if the particles come to the end of the specified zone\n *\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.CrossZone\n *\n * @param {Proton.Zone} zone \t\t\t\t\t\tcan be any Proton.Zone - e.g. Proton.RectZone()\n * @param {String} \t\t[crossType=dead] \t\t\twhat happens if the particles pass the zone - allowed strings: dead | bound | cross\n * @param {Number} \t\t[life=Infinity] \t\t\tthis behaviour's life\n * @param {String} \t\t[easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(zone, crossType, life, easing) {\n super(life, easing);\n\n this.reset(zone, crossType);\n this.name = \"CrossZone\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.CrossZone\n * @instance\n *\n * @param {Proton.Zone} zone \t\t\t\tcan be any Proton.Zone - e.g. Proton.RectZone()\n * @param {String} \t\t[crossType=dead] \twhat happens if the particles pass the zone - allowed strings: dead | bound | cross\n * @param {Number} \t\t[life=Infinity] \tthis behaviour's life\n * @param {String} \t\t[easing=easeLinear]\tthis behaviour's easing\n */\n reset(zone, crossType, life, easing) {\n this.zone = zone;\n this.zone.crossType = Util.initValue(crossType, \"dead\");\n\n life && super.reset(life, easing);\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#Proton.CrossZone\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n this.zone.crossing(particle);\n }\n}\n","import Util from \"../utils/Util\";\nimport Span from \"../math/Span\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class Alpha extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Alpha\n *\n * @todo add description for 'a' and 'b'\n *\n * @param {Number} a\n * @param {String} b\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(a, b, life, easing) {\n super(life, easing);\n\n this.reset(a, b);\n this.name = \"Alpha\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Alpha\n * @instance\n *\n * @todo add description for 'a' and 'b'\n *\n * @param {Number} a\n * @param {String} b\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(a, b, life, easing) {\n this.same = b === null || b === undefined ? true : false;\n this.a = Span.setSpanValue(Util.initValue(a, 1));\n this.b = Span.setSpanValue(b);\n\n life && super.reset(life, easing);\n }\n\n /**\n * Sets the new alpha value of the particle\n *\n * @method initialize\n * @memberof Proton#Proton.Alpha\n * @instance\n *\n * @param {Proton.Particle} particle A single Proton generated particle\n */\n initialize(particle) {\n particle.data.alphaA = this.a.getValue();\n\n if (this.same) particle.data.alphaB = particle.data.alphaA;\n else particle.data.alphaB = this.b.getValue();\n }\n\n /**\n * @method applyBehaviour\n * @memberof Proton#Proton.Alpha\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} \t\t\ttime the integrate time 1/ms\n * @param {Int} \t\t\tindex the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n\n particle.alpha = particle.data.alphaB + (particle.data.alphaA - particle.data.alphaB) * this.energy;\n\n if (particle.alpha < 0.001) particle.alpha = 0;\n }\n}\n","import Span from \"../math/Span\";\nimport Util from \"../utils/Util\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class Scale extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Scale\n *\n * @todo add description for 'a' and 'b'\n *\n * @param {Number} a\n * @param {String} b\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(a, b, life, easing) {\n super(life, easing);\n\n this.reset(a, b);\n this.name = \"Scale\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Scale\n * @instance\n *\n * @param {Number} a\n * @param {String} b\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(a, b, life, easing) {\n this.same = b === null || b === undefined ? true : false;\n this.a = Span.setSpanValue(Util.initValue(a, 1));\n this.b = Span.setSpanValue(b);\n\n life && super.reset(life, easing);\n }\n\n /**\n * Initialize the behaviour's parameters for all particles\n *\n * @method initialize\n * @memberof Proton#Proton.Scale\n * @instance\n *\n * @param {Proton.Particle} particle\n */\n initialize(particle) {\n particle.data.scaleA = this.a.getValue();\n particle.data.oldRadius = particle.radius;\n particle.data.scaleB = this.same ? particle.data.scaleA : this.b.getValue();\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#Proton.Scale\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} \t\t\ttime the integrate time 1/ms\n * @param {Int} \t\t\tindex the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n particle.scale = particle.data.scaleB + (particle.data.scaleA - particle.data.scaleB) * this.energy;\n\n if (particle.scale < 0.0001) particle.scale = 0;\n particle.radius = particle.data.oldRadius * particle.scale;\n }\n}\n","import Span from \"../math/Span\";\nimport Util from \"../utils/Util\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class Rotate extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Rotate\n *\n * @todo add description for 'a', 'b' and 'style'\n *\n * @param {String} [influence=Velocity] The rotation's influence\n * @param {String} b\n * @param {String} [style=to]\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(influence, b, style, life, easing) {\n super(life, easing);\n\n this.reset(influence, b, style);\n this.name = \"Rotate\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Rotate\n * @instance\n *\n * @todo add description for 'a', 'b' and 'style'\n *\n * @param {String} a\n * @param {String} b\n * @param {String} [style=to]\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(a, b, style, life, easing) {\n this.same = b === null || b === undefined ? true : false;\n\n this.a = Span.setSpanValue(Util.initValue(a, \"Velocity\"));\n this.b = Span.setSpanValue(Util.initValue(b, 0));\n this.style = Util.initValue(style, \"to\");\n\n life && super.reset(life, easing);\n }\n\n /**\n * Initialize the behaviour's parameters for all particles\n *\n * @method initialize\n * @memberof Proton#Proton.Rotate\n * @instance\n *\n * @param {Proton.Particle} particle\n */\n initialize(particle) {\n particle.rotation = this.a.getValue();\n particle.data.rotationA = this.a.getValue();\n\n if (!this.same) particle.data.rotationB = this.b.getValue();\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#Proton.Rotate\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} \t\t\ttime the integrate time 1/ms\n * @param {Int} \t\t\tindex the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n\n if (!this.same) {\n if (this.style === \"to\" || this.style === \"TO\" || this.style === \"_\") {\n particle.rotation +=\n particle.data.rotationB + (particle.data.rotationA - particle.data.rotationB) * this.energy;\n } else {\n particle.rotation += particle.data.rotationB;\n }\n } else if (this.a.a === \"V\" || this.a.a === \"Velocity\" || this.a.a === \"v\") {\n // beta...\n particle.rotation = particle.getDirection();\n }\n }\n}\n","import ColorUtil from \"../utils/ColorUtil\";\nimport ArraySpan from \"../math/ArraySpan\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class Color extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Color\n *\n * @param {Proton.ArraySpan | String} a the string should be a hex e.g. #000000 for black\n * @param {Proton.ArraySpan | String} b the string should be a hex e.g. #000000 for black\n * @param {Number} [life=Infinity] \tthis behaviour's life\n * @param {String} [easing=easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(a, b, life, easing) {\n super(life, easing);\n\n this.reset(a, b);\n this.name = \"Color\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Color\n * @instance\n *\n * @param {Proton.ArraySpan | String} a the string should be a hex e.g. #000000 for black\n * @param {Proton.ArraySpan | String} b the string should be a hex e.g. #000000 for black\n * @param {Number} [life=Infinity] \tthis behaviour's life\n * @param {String} [easing=easeLinear] \tthis behaviour's easing\n */\n reset(a, b, life, easing) {\n this.a = ArraySpan.createArraySpan(a);\n this.b = ArraySpan.createArraySpan(b);\n life && super.reset(life, easing);\n }\n\n /**\n * Initialize the behaviour's parameters for all particles\n *\n * @method initialize\n * @memberof Proton#Proton.Color\n * @instance\n *\n * @param {Proton.Particle} particle\n */\n initialize(particle) {\n particle.color = this.a.getValue();\n particle.data.colorA = ColorUtil.hexToRgb(particle.color);\n\n if (this.b) particle.data.colorB = ColorUtil.hexToRgb(this.b.getValue());\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#Proton.Color\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n applyBehaviour(particle, time, index) {\n if (this.b) {\n this.calculate(particle, time, index);\n\n particle.rgb.r = particle.data.colorB.r + (particle.data.colorA.r - particle.data.colorB.r) * this.energy;\n particle.rgb.g = particle.data.colorB.g + (particle.data.colorA.g - particle.data.colorB.g) * this.energy;\n particle.rgb.b = particle.data.colorB.b + (particle.data.colorA.b - particle.data.colorB.b) * this.energy;\n\n particle.rgb.r = particle.rgb.r << 0;\n particle.rgb.g = particle.rgb.g << 0;\n particle.rgb.b = particle.rgb.b << 0;\n } else {\n particle.rgb.r = particle.data.colorA.r;\n particle.rgb.g = particle.data.colorA.g;\n particle.rgb.b = particle.data.colorA.b;\n }\n }\n}\n","import MathUtil from \"../math/MathUtil\";\nimport Vector2D from \"../math/Vector2D\";\nimport Span from \"../math/Span\";\nimport Behaviour from \"./Behaviour\";\n\nconst CHANGING = \"changing\";\n\nexport default class Cyclone extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Cyclone\n *\n * @param {Number} angle\n * @param {Number} force\n * @param {Number} [life=Infinity] \t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(angle, force, life, easing) {\n super(life, easing);\n this.setAngleAndForce(angle, force);\n this.name = \"Cyclone\";\n }\n\n setAngleAndForce(angle, force) {\n this.force = CHANGING;\n this.angle = MathUtil.PI / 2;\n\n if (angle === \"right\") {\n this.angle = MathUtil.PI / 2;\n } else if (angle === \"left\") {\n this.angle = -MathUtil.PI / 2;\n } else if (angle === \"random\") {\n this.angle = \"random\";\n } else if (angle instanceof Span) {\n this.angle = \"span\";\n this.span = angle;\n } else if (angle) {\n this.angle = angle;\n }\n\n if (\n String(force).toLowerCase() === \"changing\" ||\n String(force).toLowerCase() === \"chang\" ||\n String(force).toLowerCase() === \"auto\"\n ) {\n this.force = CHANGING;\n } else if (force) {\n this.force = force;\n }\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Cyclone\n * @instance\n *\n * @param {Number} angle\n * @param {Number} force\n * @param {Number} [life=Infinity] \t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(angle, force, life, easing) {\n this.angle = MathUtil.PI / 2;\n this.setAngleAndForce(angle, force);\n life && super.reset(life, easing);\n }\n\n initialize(particle) {\n if (this.angle === \"random\") {\n particle.data.cangle = MathUtil.randomAToB(-MathUtil.PI, MathUtil.PI);\n } else if (this.angle === \"span\") {\n particle.data.cangle = this.span.getValue();\n }\n\n particle.data.cyclone = new Vector2D(0, 0);\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#Proton.Cyclone\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n\n let length;\n let gradient = particle.v.getGradient();\n if (this.angle === \"random\" || this.angle === \"span\") {\n gradient += particle.data.cangle;\n } else {\n gradient += this.angle;\n }\n\n if (this.force === CHANGING) {\n length = particle.v.length() / 100;\n } else {\n length = this.force;\n }\n\n particle.data.cyclone.x = length * Math.cos(gradient);\n particle.data.cyclone.y = length * Math.sin(gradient);\n particle.data.cyclone = this.normalizeForce(particle.data.cyclone);\n particle.a.add(particle.data.cyclone);\n }\n}\n","import Attraction from \"./Attraction\";\n\nexport default class Repulsion extends Attraction {\n /**\n * The oppisite of Proton.Attraction - turns the force\n *\n * @memberof! Proton#\n * @augments Proton#Proton.Attraction\n * @constructor\n * @alias Proton.Repulsion\n *\n * @todo add description for 'force' and 'radius'\n *\n * @param {Proton.Vector2D} targetPosition the attraction point coordinates\n * @param {Number} [force=100]\n * @param {Number} [radius=1000]\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {Number} force\n * @property {String} name The Behaviour name\n */\n constructor(targetPosition, force, radius, life, easing) {\n super(targetPosition, force, radius, life, easing);\n\n this.force *= -1;\n this.name = \"Repulsion\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Repulsion\n * @instance\n *\n * @todo add description for 'force' and 'radius'\n *\n * @param {Proton.Vector2D} targetPosition the attraction point coordinates\n * @param {Number} [force=100]\n * @param {Number} [radius=1000]\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(targetPosition, force, radius, life, easing) {\n super.reset(targetPosition, force, radius, life, easing);\n this.force *= -1;\n }\n}\n","import Util from \"../utils/Util\";\nimport Vector2D from \"../math/Vector2D\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class GravityWell extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Behaviour\n * @constructor\n * @alias GravityWell\n *\n * @param {Vector2D} [centerPoint=new Vector2D] The point in the center\n * @param {Number} [force=100]\t\t\t\t\tThe force\n * @param {Number} [life=Infinity]\t\t\t\tthis behaviour's life\n * @param {String} [easing=easeLinear]\tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(centerPoint, force, life, easing) {\n super(life, easing);\n\n this.distanceVec = new Vector2D();\n this.centerPoint = Util.initValue(centerPoint, new Vector2D());\n this.force = Util.initValue(this.normalizeValue(force), 100);\n\n this.name = \"GravityWell\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#GravityWell\n * @instance\n *\n * @param {Vector2D} [centerPoint=new Vector2D] The point in the center\n * @param {Number} [force=100]\t\t\t\t\tThe force\n * @param {Number} [life=Infinity]\t\t\t\tthis behaviour's life\n * @param {String} [easing=easeLinear]\tthis behaviour's easing\n */\n reset(centerPoint, force, life, easing) {\n this.distanceVec = new Vector2D();\n this.centerPoint = Util.initValue(centerPoint, new Vector2D());\n this.force = Util.initValue(this.normalizeValue(force), 100);\n\n life && super.reset(life, easing);\n }\n\n /**\n * @inheritdoc\n */\n initialize(particle) {}\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#GravityWell\n * @instance\n *\n * @param {Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n applyBehaviour(particle, time, index) {\n this.distanceVec.set(this.centerPoint.x - particle.p.x, this.centerPoint.y - particle.p.y);\n const distanceSq = this.distanceVec.lengthSq();\n\n if (distanceSq !== 0) {\n const distance = this.distanceVec.length();\n const factor = (this.force * time) / (distanceSq * distance);\n\n particle.v.x += factor * this.distanceVec.x;\n particle.v.y += factor * this.distanceVec.y;\n }\n }\n}\n","import PropUtil from \"../utils/PropUtil\";\nimport Initialize from \"./Initialize\";\nimport MathUtil from \"../math/MathUtil\";\n\nexport default {\n initialize(emitter, particle, initializes) {\n const length = initializes.length;\n let i;\n\n for (i = 0; i < length; i++) {\n if (initializes[i] instanceof Initialize) {\n initializes[i].init(emitter, particle);\n } else {\n this.init(emitter, particle, initializes[i]);\n }\n }\n\n this.bindEmitter(emitter, particle);\n },\n\n // init\n init(emitter, particle, initialize) {\n PropUtil.setProp(particle, initialize);\n PropUtil.setVectorVal(particle, initialize);\n },\n\n bindEmitter(emitter, particle) {\n if (emitter.bindEmitter) {\n particle.p.add(emitter.p);\n particle.v.add(emitter.v);\n particle.a.add(emitter.a);\n\n particle.v.rotate(MathUtil.degreeTransform(emitter.rotation));\n }\n }\n};\n","import Util from \"../utils/Util\";\nimport Puid from \"../utils/Puid\";\nimport Particle from \"../core/Particle\";\nimport EventDispatcher from \"../events/EventDispatcher\";\n\nimport Rate from \"../initialize/Rate\";\nimport InitializeUtil from \"../initialize/InitializeUtil\";\n\nexport default class Emitter extends Particle {\n /**\n * You can use this emit particles.\n *\n * It will dispatch follow events:\n * PARTICLE_CREATED\n * PARTICLE_UPDATA\n * PARTICLE_DEAD\n *\n * @class Emitter\n * @constructor\n * @param {Object} conf the parameters object;\n * for example {damping:0.01,bindEmitter:false}\n */\n constructor(conf = {}) {\n super(conf);\n\n this.particles = [];\n this.behaviours = [];\n this.initializes = [];\n\n this.emitTime = 0;\n this.emitSpeed = 0;\n this.totalTime = -1;\n\n /**\n * The friction coefficient for all particle emit by This;\n * @property damping\n * @type {Number}\n * @default 0.006\n */\n this.damping = 0.006;\n\n /**\n * If bindEmitter the particles can bind this emitter's property;\n * @property bindEmitter\n * @type {Boolean}\n * @default true\n */\n this.bindEmitter = true;\n\n /**\n * The number of particles per second emit (a [particle]/b [s]);\n * @property rate\n * @type {Rate}\n * @default Rate(1, .1)\n */\n this.rate = new Rate(1, 0.1);\n\n this.name = \"Emitter\";\n this.id = Puid.id(this.name);\n }\n\n /**\n * start emit particle\n * @method emit\n * @param {Number} emitTime begin emit time;\n * @param {String} life the life of this emitter\n */\n emit(totalTime, life) {\n this.stoped = false;\n this.emitTime = 0;\n this.totalTime = Util.initValue(totalTime, Infinity);\n\n if (life === true || life === \"life\" || life === \"destroy\") {\n this.life = totalTime === \"once\" ? 1 : this.totalTime;\n } else if (!isNaN(life)) {\n this.life = life;\n }\n\n this.rate.init();\n }\n\n /**\n * stop emiting\n * @method stop\n */\n stop() {\n this.totalTime = -1;\n this.emitTime = 0;\n this.stoped = true;\n }\n\n preEmit(time) {\n let oldStoped = this.stoped;\n let oldEmitTime = this.emitTime;\n let oldTotalTime = this.totalTime;\n\n this.stoped = false;\n this.emitTime = 0;\n this.totalTime = time;\n this.rate.init();\n\n const step = 0.0167;\n while (time > step) {\n time -= step;\n this.update(step);\n }\n\n this.stoped = oldStoped;\n this.emitTime = oldEmitTime + Math.max(time, 0);\n this.totalTime = oldTotalTime;\n }\n\n /**\n * remove current all particles\n * @method removeAllParticles\n */\n removeAllParticles() {\n let i = this.particles.length;\n while (i--) this.particles[i].dead = true;\n }\n\n /**\n * add initialize to this emitter\n * @method addSelfInitialize\n */\n addSelfInitialize(initialize) {\n if (initialize[\"init\"]) {\n initialize.init(this);\n } else {\n this.initAll();\n }\n }\n\n /**\n * add the Initialize to particles;\n *\n * you can use initializes array:for example emitter.addInitialize(initialize1,initialize2,initialize3);\n * @method addInitialize\n * @param {Initialize} initialize like this new Radius(1, 12)\n */\n addInitialize(...rest) {\n let i = rest.length;\n while (i--) this.initializes.push(rest[i]);\n }\n\n /**\n * remove the Initialize\n * @method removeInitialize\n * @param {Initialize} initialize a initialize\n */\n removeInitialize(initializer) {\n const index = this.initializes.indexOf(initializer);\n if (index > -1) this.initializes.splice(index, 1);\n }\n\n /**\n * remove all Initializes\n * @method removeInitializers\n */\n removeAllInitializers() {\n Util.emptyArray(this.initializes);\n }\n\n /**\n * add the Behaviour to particles;\n *\n * you can use Behaviours array:emitter.addBehaviour(Behaviour1,Behaviour2,Behaviour3);\n * @method addBehaviour\n * @param {Behaviour} behaviour like this new Color('random')\n */\n addBehaviour(...rest) {\n let i = arguments.length;\n while (i--) {\n let behaviour = rest[i];\n this.behaviours.push(behaviour);\n if (behaviour.parents) behaviour.parents.push(this);\n }\n }\n\n /**\n * remove the Behaviour\n * @method removeBehaviour\n * @param {Behaviour} behaviour a behaviour\n */\n removeBehaviour(behaviour) {\n let index = this.behaviours.indexOf(behaviour);\n this.behaviours.splice(index, 1);\n\n if (behaviour.parents) {\n index = behaviour.parents.indexOf(behaviour);\n behaviour.parents.splice(index, 1);\n }\n\n return index;\n }\n\n /**\n * remove all behaviours\n * @method removeAllBehaviours\n */\n removeAllBehaviours() {\n Util.emptyArray(this.behaviours);\n }\n\n // emitter update\n update(time) {\n this.age += time;\n if (this.age >= this.life || this.dead) this.destroy();\n\n this.emitting(time);\n this.integrate(time);\n }\n\n integrate(time) {\n if (!this.parent) return;\n\n const damping = 1 - this.damping;\n this.parent.integrator.calculate(this, time, damping);\n\n const length = this.particles.length;\n let i, particle;\n\n for (i = length - 1; i >= 0; i--) {\n particle = this.particles[i];\n\n // particle update\n particle.update(time, i);\n this.parent.integrator.calculate(particle, time, damping);\n this.dispatch(\"PARTICLE_UPDATE\", particle);\n\n // check dead\n if (particle.dead) {\n this.dispatch(\"PARTICLE_DEAD\", particle);\n\n this.parent.pool.expire(particle);\n this.particles.splice(i, 1);\n }\n }\n }\n\n dispatch(event, target) {\n this.parent && this.parent.dispatchEvent(event, target);\n this.bindEvent && this.dispatchEvent(event, target);\n }\n\n emitting(time) {\n if (this.totalTime === \"once\") {\n let i;\n const length = this.rate.getValue(99999);\n\n if (length > 0) this.emitSpeed = length;\n for (i = 0; i < length; i++) this.createParticle();\n this.totalTime = \"none\";\n } else {\n this.emitTime += time;\n\n if (this.emitTime < this.totalTime) {\n const length = this.rate.getValue(time);\n let i;\n\n if (length > 0) this.emitSpeed = length;\n for (i = 0; i < length; i++) this.createParticle();\n }\n }\n }\n\n /**\n * create single particle;\n *\n * can use emit({x:10},new Gravity(10),{'particleUpdate',fun}) or emit([{x:10},new Initialize],new Gravity(10),{'particleUpdate',fun})\n * @method removeAllParticles\n */\n createParticle(initialize, behaviour) {\n const particle = this.parent.pool.get(Particle);\n this.setupParticle(particle, initialize, behaviour);\n this.dispatch(\"PARTICLE_CREATED\", particle);\n\n return particle;\n }\n\n setupParticle(particle, initialize, behaviour) {\n let initializes = this.initializes;\n let behaviours = this.behaviours;\n\n if (initialize) initializes = Util.toArray(initialize);\n if (behaviour) behaviours = Util.toArray(behaviour);\n\n particle.reset();\n InitializeUtil.initialize(this, particle, initializes);\n particle.addBehaviours(behaviours);\n particle.parent = this;\n\n this.particles.push(particle);\n }\n\n remove() {\n this.stop();\n Util.destroyAll(this.particles);\n }\n\n /**\n * Destory this Emitter\n * @method destroy\n */\n destroy() {\n this.dead = true;\n this.remove();\n this.removeAllInitializers();\n this.removeAllBehaviours();\n this.parent && this.parent.removeEmitter(this);\n }\n}\n\nEventDispatcher.bind(Emitter);\n","import Types from \"../utils/Types\";\nimport ColorUtil from \"../utils/ColorUtil\";\nimport MathUtil from \"../math/MathUtil\";\nimport BaseRenderer from \"./BaseRenderer\";\n\nlet PIXIClass;\nexport default class PixiRenderer extends BaseRenderer {\n constructor(element, stroke) {\n super(element);\n\n this.stroke = stroke;\n this.color = false;\n this.setColor = false;\n this.blendMode = null;\n this.pool.create = (body, particle) => this.createBody(body, particle);\n this.setPIXI(window.PIXI);\n\n this.name = \"PixiRenderer\";\n }\n\n setPIXI(PIXI) {\n try {\n PIXIClass = PIXI || { Sprite: {} };\n this.createFromImage = PIXIClass.Sprite.from || PIXIClass.Sprite.fromImage;\n } catch (e) {}\n }\n\n onProtonUpdate() {}\n\n /**\n * @param particle\n */\n onParticleCreated(particle) {\n if (particle.body) {\n particle.body = this.pool.get(particle.body, particle);\n } else {\n particle.body = this.pool.get(this.circleConf, particle);\n }\n\n if (this.blendMode) {\n particle.body.blendMode = this.blendMode;\n }\n\n this.element.addChild(particle.body);\n }\n\n /**\n * @param particle\n */\n onParticleUpdate(particle) {\n this.transform(particle, particle.body);\n\n if (this.setColor === true || this.color === true) {\n particle.body.tint = ColorUtil.getHex16FromParticle(particle);\n }\n }\n\n /**\n * @param particle\n */\n onParticleDead(particle) {\n this.element.removeChild(particle.body);\n this.pool.expire(particle.body);\n particle.body = null;\n }\n\n transform(particle, target) {\n target.x = particle.p.x;\n target.y = particle.p.y;\n\n target.alpha = particle.alpha;\n\n target.scale.x = particle.scale;\n target.scale.y = particle.scale;\n\n // using cached version of MathUtil.PI_180 for slight performance increase.\n target.rotation = particle.rotation * MathUtil.PI_180; // MathUtil.PI_180;\n }\n\n createBody(body, particle) {\n if (body.isCircle) return this.createCircle(particle);\n else return this.createSprite(body);\n }\n\n createSprite(body) {\n const sprite = body.isInner ? this.createFromImage(body.src) : new PIXIClass.Sprite(body);\n\n sprite.anchor.x = 0.5;\n sprite.anchor.y = 0.5;\n\n return sprite;\n }\n\n createCircle(particle) {\n const graphics = new PIXIClass.Graphics();\n\n if (this.stroke) {\n const stroke = Types.isString(this.stroke) ? this.stroke : 0x000000;\n graphics.beginStroke(stroke);\n }\n\n graphics.beginFill(particle.color || 0x008ced);\n graphics.drawCircle(0, 0, particle.radius);\n graphics.endFill();\n\n return graphics;\n }\n\n destroy(particles) {\n super.destroy();\n\n let i = particles.length;\n while (i--) {\n let particle = particles[i];\n if (particle.body) {\n this.element.removeChild(particle.body);\n }\n }\n }\n}\n","import Emitter from \"./Emitter\";\n\nexport default class BehaviourEmitter extends Emitter {\n /**\n * The BehaviourEmitter class inherits from Proton.Emitter\n *\n * use the BehaviourEmitter you can add behaviours to self;\n * @class Proton.BehaviourEmitter\n * @constructor\n * @param {Object} conf the parameters object;\n */\n constructor(conf) {\n super(conf);\n\n this.selfBehaviours = [];\n }\n\n /**\n * add the Behaviour to emitter;\n *\n * you can use Behaviours array:emitter.addSelfBehaviour(Behaviour1,Behaviour2,Behaviour3);\n * @method addSelfBehaviour\n * @param {Proton.Behaviour} behaviour like this new Proton.Color('random')\n */\n addSelfBehaviour(...rest) {\n let i,\n length = rest.length;\n\n for (i = 0; i < length; i++) {\n let behaviour = rest[i];\n this.selfBehaviours.push(behaviour);\n behaviour.initialize(this);\n }\n }\n\n /**\n * remove the Behaviour for self\n * @method removeSelfBehaviour\n * @param {Proton.Behaviour} behaviour a behaviour\n */\n removeSelfBehaviour(behaviour) {\n const index = this.selfBehaviours.indexOf(behaviour);\n if (index > -1) this.selfBehaviours.splice(index, 1);\n }\n\n update(time) {\n super.update(time);\n\n if (!this.sleep) {\n const length = this.selfBehaviours.length;\n let i;\n\n for (i = 0; i < length; i++) {\n this.selfBehaviours[i].applyBehaviour(this, time, i);\n }\n }\n }\n}\n","import Util from \"../utils/Util\";\nimport Emitter from \"./Emitter\";\n\nexport default class FollowEmitter extends Emitter {\n /**\n * The FollowEmitter class inherits from Proton.Emitter\n *\n * use the FollowEmitter will emit particle when mousemoving\n *\n * @class Proton.FollowEmitter\n * @constructor\n * @param {Element} mouseTarget mouseevent's target;\n * @param {Number} ease the easing of following speed;\n * @default 0.7\n * @param {Object} conf the parameters object;\n */\n constructor(mouseTarget, ease, conf) {\n super(conf);\n\n this.mouseTarget = Util.initValue(mouseTarget, window);\n this.ease = Util.initValue(ease, 0.7);\n\n this._allowEmitting = false;\n this.initEventHandler();\n }\n\n initEventHandler() {\n this.mousemoveHandler = e => this.mousemove.call(this, e);\n this.mousedownHandler = e => this.mousedown.call(this, e);\n this.mouseupHandler = e => this.mouseup.call(this, e);\n this.mouseTarget.addEventListener(\"mousemove\", this.mousemoveHandler, false);\n }\n\n /**\n * start emit particle\n * @method emit\n */\n emit() {\n this._allowEmitting = true;\n }\n\n /**\n * stop emiting\n * @method stop\n */\n stop() {\n this._allowEmitting = false;\n }\n\n mousemove(e) {\n if (e.layerX || e.layerX === 0) {\n this.p.x += (e.layerX - this.p.x) * this.ease;\n this.p.y += (e.layerY - this.p.y) * this.ease;\n } else if (e.offsetX || e.offsetX === 0) {\n this.p.x += (e.offsetX - this.p.x) * this.ease;\n this.p.y += (e.offsetY - this.p.y) * this.ease;\n }\n\n if (this._allowEmitting) super.emit(\"once\");\n }\n\n /**\n * Destory this Emitter\n * @method destroy\n */\n destroy() {\n super.destroy();\n this.mouseTarget.removeEventListener(\"mousemove\", this.mousemoveHandler, false);\n }\n}\n","export default {\n /**\n * Determine whether it is a picture object\n *\n * @return {boolean} is or no\n */\n isImage(obj) {\n if (!obj) return false;\n\n const tagName = `${obj.tagName}`.toUpperCase();\n const nodeName = `${obj.nodeName}`.toUpperCase();\n if (nodeName === \"IMG\" || tagName === \"IMG\") return true;\n return false;\n },\n\n /**\n * Determine whether it is a string object\n *\n * @return {boolean} is or no\n */\n isString(obj) {\n return typeof obj === \"string\";\n }\n};\n","import Pool from \"../core/Pool\";\n\nexport default class BaseRenderer {\n constructor(element, stroke) {\n this.pool = new Pool();\n this.element = element;\n this.stroke = stroke;\n this.circleConf = { isCircle: true };\n\n this.initEventHandler();\n this.name = \"BaseRenderer\";\n }\n\n setStroke(color = \"#000000\", thinkness = 1) {\n this.stroke = { color, thinkness };\n }\n\n initEventHandler() {\n this._protonUpdateHandler = () => {\n this.onProtonUpdate.call(this);\n };\n\n this._protonUpdateAfterHandler = () => {\n this.onProtonUpdateAfter.call(this);\n };\n\n this._emitterAddedHandler = emitter => {\n this.onEmitterAdded.call(this, emitter);\n };\n\n this._emitterRemovedHandler = emitter => {\n this.onEmitterRemoved.call(this, emitter);\n };\n\n this._particleCreatedHandler = particle => {\n this.onParticleCreated.call(this, particle);\n };\n\n this._particleUpdateHandler = particle => {\n this.onParticleUpdate.call(this, particle);\n };\n\n this._particleDeadHandler = particle => {\n this.onParticleDead.call(this, particle);\n };\n }\n\n init(proton) {\n this.parent = proton;\n\n proton.addEventListener(\"PROTON_UPDATE\", this._protonUpdateHandler);\n proton.addEventListener(\"PROTON_UPDATE_AFTER\", this._protonUpdateAfterHandler);\n\n proton.addEventListener(\"EMITTER_ADDED\", this._emitterAddedHandler);\n proton.addEventListener(\"EMITTER_REMOVED\", this._emitterRemovedHandler);\n\n proton.addEventListener(\"PARTICLE_CREATED\", this._particleCreatedHandler);\n proton.addEventListener(\"PARTICLE_UPDATE\", this._particleUpdateHandler);\n proton.addEventListener(\"PARTICLE_DEAD\", this._particleDeadHandler);\n }\n\n resize(width, height) {}\n\n destroy() {\n this.remove();\n this.pool.destroy();\n this.pool = null;\n this.element = null;\n this.stroke = null;\n }\n\n remove(proton) {\n this.parent.removeEventListener(\"PROTON_UPDATE\", this._protonUpdateHandler);\n this.parent.removeEventListener(\"PROTON_UPDATE_AFTER\", this._protonUpdateAfterHandler);\n\n this.parent.removeEventListener(\"EMITTER_ADDED\", this._emitterAddedHandler);\n this.parent.removeEventListener(\"EMITTER_REMOVED\", this._emitterRemovedHandler);\n\n this.parent.removeEventListener(\"PARTICLE_CREATED\", this._particleCreatedHandler);\n this.parent.removeEventListener(\"PARTICLE_UPDATE\", this._particleUpdateHandler);\n this.parent.removeEventListener(\"PARTICLE_DEAD\", this._particleDeadHandler);\n\n this.parent = null;\n }\n\n onProtonUpdate() {}\n onProtonUpdateAfter() {}\n\n onEmitterAdded(emitter) {}\n onEmitterRemoved(emitter) {}\n\n onParticleCreated(particle) {}\n onParticleUpdate(particle) {}\n onParticleDead(particle) {}\n}\n","import Types from \"../utils/Types\";\nimport ImgUtil from \"../utils/ImgUtil\";\nimport ColorUtil from \"../utils/ColorUtil\";\nimport MathUtil from \"../math/MathUtil\";\nimport BaseRenderer from \"./BaseRenderer\";\n\nexport default class CanvasRenderer extends BaseRenderer {\n constructor(element) {\n super(element);\n\n this.stroke = null;\n this.context = this.element.getContext(\"2d\");\n this.bufferCache = {};\n this.name = \"CanvasRenderer\";\n }\n\n resize(width, height) {\n this.element.width = width;\n this.element.height = height;\n }\n\n onProtonUpdate() {\n this.context.clearRect(0, 0, this.element.width, this.element.height);\n }\n\n onParticleCreated(particle) {\n if (particle.body) {\n ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle);\n } else {\n particle.color = particle.color || \"#ff0000\";\n }\n }\n\n onParticleUpdate(particle) {\n if (particle.body) {\n if (Types.isImage(particle.body)) {\n this.drawImage(particle);\n }\n } else {\n this.drawCircle(particle);\n }\n }\n\n onParticleDead(particle) {\n particle.body = null;\n }\n\n // private method\n addImg2Body(img, particle) {\n particle.body = img;\n }\n\n // private drawImage method\n drawImage(particle) {\n const w = (particle.body.width * particle.scale) | 0;\n const h = (particle.body.height * particle.scale) | 0;\n const x = particle.p.x - w / 2;\n const y = particle.p.y - h / 2;\n\n if (!!particle.color) {\n if (!particle.data[\"buffer\"]) particle.data.buffer = this.createBuffer(particle.body);\n\n const bufContext = particle.data.buffer.getContext(\"2d\");\n bufContext.clearRect(0, 0, particle.data.buffer.width, particle.data.buffer.height);\n bufContext.globalAlpha = particle.alpha;\n bufContext.drawImage(particle.body, 0, 0);\n\n bufContext.globalCompositeOperation = \"source-atop\";\n bufContext.fillStyle = ColorUtil.rgbToHex(particle.rgb);\n bufContext.fillRect(0, 0, particle.data.buffer.width, particle.data.buffer.height);\n bufContext.globalCompositeOperation = \"source-over\";\n bufContext.globalAlpha = 1;\n\n this.context.drawImage(\n particle.data.buffer,\n 0,\n 0,\n particle.data.buffer.width,\n particle.data.buffer.height,\n x,\n y,\n w,\n h\n );\n } else {\n this.context.save();\n\n this.context.globalAlpha = particle.alpha;\n this.context.translate(particle.p.x, particle.p.y);\n this.context.rotate(MathUtil.degreeTransform(particle.rotation));\n this.context.translate(-particle.p.x, -particle.p.y);\n this.context.drawImage(particle.body, 0, 0, particle.body.width, particle.body.height, x, y, w, h);\n\n this.context.globalAlpha = 1;\n this.context.restore();\n }\n }\n\n // private drawCircle --\n drawCircle(particle) {\n if (particle.rgb) {\n this.context.fillStyle = `rgba(${particle.rgb.r},${particle.rgb.g},${particle.rgb.b},${particle.alpha})`;\n } else {\n this.context.fillStyle = particle.color;\n }\n\n // draw circle\n this.context.beginPath();\n this.context.arc(particle.p.x, particle.p.y, particle.radius, 0, Math.PI * 2, true);\n\n if (this.stroke) {\n this.context.strokeStyle = this.stroke.color;\n this.context.lineWidth = this.stroke.thinkness;\n this.context.stroke();\n }\n\n this.context.closePath();\n this.context.fill();\n }\n\n // private createBuffer\n createBuffer(image) {\n if (Types.isImage(image)) {\n const size = image.width + \"_\" + image.height;\n let canvas = this.bufferCache[size];\n\n if (!canvas) {\n canvas = document.createElement(\"canvas\");\n canvas.width = image.width;\n canvas.height = image.height;\n this.bufferCache[size] = canvas;\n }\n\n return canvas;\n }\n }\n\n destroy() {\n super.destroy();\n this.stroke = null;\n this.context = null;\n this.bufferCache = null;\n }\n}\n","import DomUtil from \"../utils/DomUtil\";\nimport ImgUtil from \"../utils/ImgUtil\";\nimport BaseRenderer from \"./BaseRenderer\";\n\nexport default class DomRenderer extends BaseRenderer {\n constructor(element) {\n super(element);\n\n this.stroke = null;\n this.transform3d = false;\n this.pool.create = (body, particle) => this.createBody(body, particle);\n this.addImg2Body = this.addImg2Body.bind(this);\n\n this.name = \"DomRenderer\";\n }\n\n onParticleCreated(particle) {\n if (particle.body) {\n ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle);\n } else {\n particle.body = this.pool.get(this.circleConf, particle);\n this.element.appendChild(particle.body);\n }\n }\n\n onParticleUpdate(particle) {\n if (this.bodyReady(particle)) {\n if (this.transform3d) {\n DomUtil.transform3d(particle.body, particle.p.x, particle.p.y, particle.scale, particle.rotation);\n } else {\n DomUtil.transform(particle.body, particle.p.x, particle.p.y, particle.scale, particle.rotation);\n }\n\n particle.body.style.opacity = particle.alpha;\n\n if (particle.body.isCircle) {\n particle.body.style.backgroundColor = particle.color || \"#ff0000\";\n }\n }\n }\n\n onParticleDead(particle) {\n if (this.bodyReady(particle)) {\n this.element.removeChild(particle.body);\n this.pool.expire(particle.body);\n particle.body = null;\n }\n }\n\n bodyReady(particle) {\n return typeof particle.body === \"object\" && particle.body && !particle.body.isInner;\n }\n\n // private method\n addImg2Body(img, particle) {\n if (particle.dead) return;\n particle.body = this.pool.get(img, particle);\n DomUtil.resize(particle.body, img.width, img.height);\n\n this.element.appendChild(particle.body);\n }\n\n createBody(body, particle) {\n if (body.isCircle) return this.createCircle(particle);\n return this.createSprite(body, particle);\n }\n\n // private methods\n createCircle(particle) {\n const dom = DomUtil.createDiv(`${particle.id}_dom`, 2 * particle.radius, 2 * particle.radius);\n dom.style.borderRadius = `${particle.radius}px`;\n\n if (this.stroke) {\n dom.style.borderColor = this.stroke.color;\n dom.style.borderWidth = `${this.stroke.thinkness}px`;\n }\n dom.isCircle = true;\n\n return dom;\n }\n\n createSprite(body, particle) {\n const url = typeof body === \"string\" ? body : body.src;\n const dom = DomUtil.createDiv(`${particle.id}_dom`, body.width, body.height);\n dom.style.backgroundImage = `url(${url})`;\n\n return dom;\n }\n\n destroy() {\n super.destroy();\n this.stroke = null;\n }\n}\n","import Types from \"../utils/Types\";\nimport BaseRenderer from \"./BaseRenderer\";\n\nexport default class EaselRenderer extends BaseRenderer {\n constructor(element, stroke) {\n super(element);\n\n this.stroke = stroke;\n this.name = \"EaselRenderer\";\n }\n\n onParticleCreated(particle) {\n if (particle.body) {\n this.createSprite(particle);\n } else {\n this.createCircle(particle);\n }\n\n this.element.addChild(particle.body);\n }\n\n onParticleUpdate(particle) {\n if (particle.body) {\n particle.body.x = particle.p.x;\n particle.body.y = particle.p.y;\n\n particle.body.alpha = particle.alpha;\n particle.body.scaleX = particle.body.scaleY = particle.scale;\n particle.body.rotation = particle.rotation;\n }\n }\n\n onParticleDead(particle) {\n if (particle.body) {\n particle.body.parent && particle.body.parent.removeChild(particle.body);\n this.pool.expire(particle.body);\n particle.body = null;\n }\n\n if (particle.graphics) this.pool.expire(particle.graphics);\n }\n\n // private\n createSprite(particle) {\n particle.body = this.pool.get(particle.body);\n\n if (particle.body.parent) return;\n if (particle.body[\"image\"]) {\n particle.body.regX = particle.body.image.width / 2;\n particle.body.regY = particle.body.image.height / 2;\n }\n }\n\n createCircle(particle) {\n const graphics = this.pool.get(createjs.Graphics);\n\n if (this.stroke) {\n if (Types.isString(this.stroke)) {\n graphics.beginStroke(this.stroke);\n } else {\n graphics.beginStroke(\"#000000\");\n }\n }\n graphics.beginFill(particle.color || \"#ff0000\").drawCircle(0, 0, particle.radius);\n const shape = this.pool.get(createjs.Shape, [graphics]);\n\n particle.body = shape;\n particle.graphics = graphics;\n }\n\n destroy() {\n super.destroy();\n this.stroke = null;\n }\n}\n","import Rectangle from \"../math/Rectangle\";\nimport BaseRenderer from \"./BaseRenderer\";\n\nexport default class PixelRenderer extends BaseRenderer {\n constructor(element, rectangle) {\n super(element);\n\n this.context = this.element.getContext(\"2d\");\n this.imageData = null;\n this.rectangle = rectangle;\n this.createImageData(rectangle);\n\n this.name = \"PixelRenderer\";\n }\n\n resize(width, height) {\n this.element.width = width;\n this.element.height = height;\n }\n\n createImageData(rectangle) {\n this.rectangle = rectangle ? rectangle : new Rectangle(0, 0, this.element.width, this.element.height);\n this.imageData = this.context.createImageData(this.rectangle.width, this.rectangle.height);\n this.context.putImageData(this.imageData, this.rectangle.x, this.rectangle.y);\n }\n\n onProtonUpdate() {\n this.context.clearRect(this.rectangle.x, this.rectangle.y, this.rectangle.width, this.rectangle.height);\n this.imageData = this.context.getImageData(\n this.rectangle.x,\n this.rectangle.y,\n this.rectangle.width,\n this.rectangle.height\n );\n }\n\n onProtonUpdateAfter() {\n this.context.putImageData(this.imageData, this.rectangle.x, this.rectangle.y);\n }\n\n onParticleCreated(particle) {}\n\n onParticleUpdate(particle) {\n if (this.imageData) {\n this.setPixel(\n this.imageData,\n (particle.p.x - this.rectangle.x) >> 0,\n (particle.p.y - this.rectangle.y) >> 0,\n particle\n );\n }\n }\n\n setPixel(imagedata, x, y, particle) {\n const rgb = particle.rgb;\n if (x < 0 || x > this.element.width || y < 0 || y > this.elementwidth) return;\n\n const i = ((y >> 0) * imagedata.width + (x >> 0)) * 4;\n imagedata.data[i] = rgb.r;\n imagedata.data[i + 1] = rgb.g;\n imagedata.data[i + 2] = rgb.b;\n imagedata.data[i + 3] = particle.alpha * 255;\n }\n\n onParticleDead(particle) {}\n\n destroy() {\n super.destroy();\n this.stroke = null;\n this.context = null;\n this.imageData = null;\n this.rectangle = null;\n }\n}\n","import Mat3 from \"../math/Mat3\";\n\nexport default class MStack {\n constructor() {\n this.mats = [];\n this.size = 0;\n\n for (let i = 0; i < 20; i++) this.mats.push(Mat3.create([0, 0, 0, 0, 0, 0, 0, 0, 0]));\n }\n\n set(m, i) {\n if (i === 0) Mat3.set(m, this.mats[0]);\n else Mat3.multiply(this.mats[i - 1], m, this.mats[i]);\n\n this.size = Math.max(this.size, i + 1);\n }\n\n push(m) {\n if (this.size === 0) Mat3.set(m, this.mats[0]);\n else Mat3.multiply(this.mats[this.size - 1], m, this.mats[this.size]);\n\n this.size++;\n }\n\n pop() {\n if (this.size > 0) this.size--;\n }\n\n top() {\n return this.mats[this.size - 1];\n }\n}\n","import Mat3 from \"../math/Mat3\";\nimport BaseRenderer from \"./BaseRenderer\";\n\nimport Util from \"../utils/Util\";\nimport ImgUtil from \"../utils/ImgUtil\";\nimport MStack from \"../utils/MStack\";\nimport DomUtil from \"../utils/DomUtil\";\nimport WebGLUtil from \"../utils/WebGLUtil\";\nimport MathUtil from \"../math/MathUtil\";\n\nexport default class WebGLRenderer extends BaseRenderer {\n constructor(element) {\n super(element);\n\n this.gl = this.element.getContext(\"experimental-webgl\", { antialias: true, stencil: false, depth: false });\n if (!this.gl) alert(\"Sorry your browser do not suppest WebGL!\");\n\n this.initVar();\n this.setMaxRadius();\n this.initShaders();\n this.initBuffers();\n\n this.gl.blendEquation(this.gl.FUNC_ADD);\n this.gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);\n this.gl.enable(this.gl.BLEND);\n this.addImg2Body = this.addImg2Body.bind(this);\n\n this.name = \"WebGLRenderer\";\n }\n\n init(proton) {\n super.init(proton);\n this.resize(this.element.width, this.element.height);\n }\n\n resize(width, height) {\n this.umat[4] = -2;\n this.umat[7] = 1;\n\n this.smat[0] = 1 / width;\n this.smat[4] = 1 / height;\n\n this.mstack.set(this.umat, 0);\n this.mstack.set(this.smat, 1);\n\n this.gl.viewport(0, 0, width, height);\n this.element.width = width;\n this.element.height = height;\n }\n\n setMaxRadius(radius) {\n this.circleCanvasURL = this.createCircle(radius);\n }\n\n getVertexShader() {\n const vsSource = [\n \"uniform vec2 viewport;\",\n \"attribute vec2 aVertexPosition;\",\n \"attribute vec2 aTextureCoord;\",\n \"uniform mat3 tMat;\",\n \"varying vec2 vTextureCoord;\",\n \"varying float alpha;\",\n \"void main() {\",\n \"vec3 v = tMat * vec3(aVertexPosition, 1.0);\",\n \"gl_Position = vec4(v.x, v.y, 0, 1);\",\n \"vTextureCoord = aTextureCoord;\",\n \"alpha = tMat[0][2];\",\n \"}\"\n ].join(\"\\n\");\n return vsSource;\n }\n\n getFragmentShader() {\n const fsSource = [\n \"precision mediump float;\",\n \"varying vec2 vTextureCoord;\",\n \"varying float alpha;\",\n \"uniform sampler2D uSampler;\",\n \"uniform vec4 color;\",\n \"uniform bool useTexture;\",\n \"uniform vec3 uColor;\",\n \"void main() {\",\n \"vec4 textureColor = texture2D(uSampler, vTextureCoord);\",\n \"gl_FragColor = textureColor * vec4(uColor, 1.0);\",\n \"gl_FragColor.w *= alpha;\",\n \"}\"\n ].join(\"\\n\");\n return fsSource;\n }\n\n initVar() {\n this.mstack = new MStack();\n this.umat = Mat3.create([2, 0, 1, 0, -2, 0, -1, 1, 1]);\n this.smat = Mat3.create([1 / 100, 0, 1, 0, 1 / 100, 0, 0, 0, 1]);\n this.texturebuffers = {};\n }\n\n blendEquation(A) {\n this.gl.blendEquation(this.gl[A]);\n }\n\n blendFunc(A, B) {\n this.gl.blendFunc(this.gl[A], this.gl[B]);\n }\n\n getShader(gl, str, fs) {\n const shader = fs ? gl.createShader(gl.FRAGMENT_SHADER) : gl.createShader(gl.VERTEX_SHADER);\n\n gl.shaderSource(shader, str);\n gl.compileShader(shader);\n\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n alert(gl.getShaderInfoLog(shader));\n return null;\n }\n\n return shader;\n }\n\n initShaders() {\n const fragmentShader = this.getShader(this.gl, this.getFragmentShader(), true);\n const vertexShader = this.getShader(this.gl, this.getVertexShader(), false);\n\n this.sprogram = this.gl.createProgram();\n this.gl.attachShader(this.sprogram, vertexShader);\n this.gl.attachShader(this.sprogram, fragmentShader);\n this.gl.linkProgram(this.sprogram);\n\n if (!this.gl.getProgramParameter(this.sprogram, this.gl.LINK_STATUS)) alert(\"Could not initialise shaders\");\n\n this.gl.useProgram(this.sprogram);\n this.sprogram.vpa = this.gl.getAttribLocation(this.sprogram, \"aVertexPosition\");\n this.sprogram.tca = this.gl.getAttribLocation(this.sprogram, \"aTextureCoord\");\n this.gl.enableVertexAttribArray(this.sprogram.tca);\n this.gl.enableVertexAttribArray(this.sprogram.vpa);\n\n this.sprogram.tMatUniform = this.gl.getUniformLocation(this.sprogram, \"tMat\");\n this.sprogram.samplerUniform = this.gl.getUniformLocation(this.sprogram, \"uSampler\");\n this.sprogram.useTex = this.gl.getUniformLocation(this.sprogram, \"useTexture\");\n this.sprogram.color = this.gl.getUniformLocation(this.sprogram, \"uColor\");\n this.gl.uniform1i(this.sprogram.useTex, 1);\n }\n\n initBuffers() {\n const vs = [0, 3, 1, 0, 2, 3];\n let idx;\n\n this.unitIBuffer = this.gl.createBuffer();\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitIBuffer);\n this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(vs), this.gl.STATIC_DRAW);\n\n let i;\n let ids = [];\n for (i = 0; i < 100; i++) ids.push(i);\n idx = new Uint16Array(ids);\n\n this.unitI33 = this.gl.createBuffer();\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitI33);\n this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, idx, this.gl.STATIC_DRAW);\n\n ids = [];\n for (i = 0; i < 100; i++) ids.push(i, i + 1, i + 2);\n idx = new Uint16Array(ids);\n\n this.stripBuffer = this.gl.createBuffer();\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.stripBuffer);\n this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, idx, this.gl.STATIC_DRAW);\n }\n\n createCircle(raidus) {\n this.circleCanvasRadius = WebGLUtil.nhpot(Util.initValue(raidus, 32));\n const canvas = DomUtil.createCanvas(\"circle_canvas\", this.circleCanvasRadius * 2, this.circleCanvasRadius * 2);\n const context = canvas.getContext(\"2d\");\n\n context.beginPath();\n context.arc(this.circleCanvasRadius, this.circleCanvasRadius, this.circleCanvasRadius, 0, Math.PI * 2, true);\n context.closePath();\n context.fillStyle = \"#FFF\";\n context.fill();\n\n return canvas.toDataURL();\n }\n\n drawImg2Canvas(particle) {\n const _w = particle.body.width;\n const _h = particle.body.height;\n\n const _width = WebGLUtil.nhpot(particle.body.width);\n const _height = WebGLUtil.nhpot(particle.body.height);\n\n const _scaleX = particle.body.width / _width;\n const _scaleY = particle.body.height / _height;\n\n if (!this.texturebuffers[particle.data.src])\n this.texturebuffers[particle.data.src] = [\n this.gl.createTexture(),\n this.gl.createBuffer(),\n this.gl.createBuffer()\n ];\n\n particle.data.texture = this.texturebuffers[particle.data.src][0];\n particle.data.vcBuffer = this.texturebuffers[particle.data.src][1];\n particle.data.tcBuffer = this.texturebuffers[particle.data.src][2];\n\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.data.tcBuffer);\n this.gl.bufferData(\n this.gl.ARRAY_BUFFER,\n new Float32Array([0.0, 0.0, _scaleX, 0.0, 0.0, _scaleY, _scaleY, _scaleY]),\n this.gl.STATIC_DRAW\n );\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.data.vcBuffer);\n this.gl.bufferData(\n this.gl.ARRAY_BUFFER,\n new Float32Array([0.0, 0.0, _w, 0.0, 0.0, _h, _w, _h]),\n this.gl.STATIC_DRAW\n );\n\n const context = particle.data.canvas.getContext(\"2d\");\n const data = context.getImageData(0, 0, _width, _height);\n\n this.gl.bindTexture(this.gl.TEXTURE_2D, particle.data.texture);\n this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.gl.RGBA, this.gl.UNSIGNED_BYTE, data);\n this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, this.gl.LINEAR);\n this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR_MIPMAP_NEAREST);\n this.gl.generateMipmap(this.gl.TEXTURE_2D);\n\n particle.data.textureLoaded = true;\n particle.data.textureWidth = _w;\n particle.data.textureHeight = _h;\n }\n\n onProtonUpdate() {\n // this.gl.clearColor(0, 0, 0, 1);\n // this.gl.clear(this.gl.COLOR_BUFFER_BIT | this.gl.DEPTH_BUFFER_BIT);\n }\n\n onParticleCreated(particle) {\n particle.data.textureLoaded = false;\n particle.data.tmat = Mat3.create();\n particle.data.tmat[8] = 1;\n particle.data.imat = Mat3.create();\n particle.data.imat[8] = 1;\n\n if (particle.body) {\n ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle);\n } else {\n ImgUtil.getImgFromCache(this.circleCanvasURL, this.addImg2Body, particle);\n particle.data.oldScale = particle.radius / this.circleCanvasRadius;\n }\n }\n\n // private\n addImg2Body(img, particle) {\n if (particle.dead) return;\n particle.body = img;\n particle.data.src = img.src;\n particle.data.canvas = ImgUtil.getCanvasFromCache(img);\n particle.data.oldScale = 1;\n\n this.drawImg2Canvas(particle);\n }\n\n onParticleUpdate(particle) {\n if (particle.data.textureLoaded) {\n this.updateMatrix(particle);\n\n this.gl.uniform3f(this.sprogram.color, particle.rgb.r / 255, particle.rgb.g / 255, particle.rgb.b / 255);\n this.gl.uniformMatrix3fv(this.sprogram.tMatUniform, false, this.mstack.top());\n\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.data.vcBuffer);\n this.gl.vertexAttribPointer(this.sprogram.vpa, 2, this.gl.FLOAT, false, 0, 0);\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.data.tcBuffer);\n this.gl.vertexAttribPointer(this.sprogram.tca, 2, this.gl.FLOAT, false, 0, 0);\n this.gl.bindTexture(this.gl.TEXTURE_2D, particle.data.texture);\n this.gl.uniform1i(this.sprogram.samplerUniform, 0);\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitIBuffer);\n\n this.gl.drawElements(this.gl.TRIANGLES, 6, this.gl.UNSIGNED_SHORT, 0);\n this.mstack.pop();\n }\n }\n\n onParticleDead(particle) {}\n\n updateMatrix(particle) {\n const moveOriginMatrix = WebGLUtil.makeTranslation(\n -particle.data.textureWidth / 2,\n -particle.data.textureHeight / 2\n );\n const translationMatrix = WebGLUtil.makeTranslation(particle.p.x, particle.p.y);\n\n const angel = particle.rotation * MathUtil.PI_180;\n const rotationMatrix = WebGLUtil.makeRotation(angel);\n\n const scale = particle.scale * particle.data.oldScale;\n const scaleMatrix = WebGLUtil.makeScale(scale, scale);\n let matrix = WebGLUtil.matrixMultiply(moveOriginMatrix, scaleMatrix);\n\n matrix = WebGLUtil.matrixMultiply(matrix, rotationMatrix);\n matrix = WebGLUtil.matrixMultiply(matrix, translationMatrix);\n\n Mat3.inverse(matrix, particle.data.imat);\n matrix[2] = particle.alpha;\n\n this.mstack.push(matrix);\n }\n\n destroy() {\n super.destroy();\n this.gl = null;\n this.mstack = null;\n this.umat = null;\n this.smat = null;\n this.texturebuffers = null;\n }\n}\n","import BaseRenderer from \"./BaseRenderer\";\n\nexport default class CustomRenderer extends BaseRenderer {\n constructor(element) {\n super(element);\n\n this.name = \"CustomRenderer\";\n }\n}\n","import Zone from \"./Zone\";\nimport Util from \"../utils/Util\";\nimport MathUtil from \"../math/MathUtil\";\n\nexport default class LineZone extends Zone {\n constructor(x1, y1, x2, y2, direction) {\n super();\n\n if (x2 - x1 >= 0) {\n this.x1 = x1;\n this.y1 = y1;\n this.x2 = x2;\n this.y2 = y2;\n } else {\n this.x1 = x2;\n this.y1 = y2;\n this.x2 = x1;\n this.y2 = y1;\n }\n\n this.dx = this.x2 - this.x1;\n this.dy = this.y2 - this.y1;\n\n this.minx = Math.min(this.x1, this.x2);\n this.miny = Math.min(this.y1, this.y2);\n this.maxx = Math.max(this.x1, this.x2);\n this.maxy = Math.max(this.y1, this.y2);\n\n this.dot = this.x2 * this.y1 - this.x1 * this.y2;\n this.xxyy = this.dx * this.dx + this.dy * this.dy;\n\n this.gradient = this.getGradient();\n this.length = this.getLength();\n this.direction = Util.initValue(direction, \">\");\n }\n\n getPosition() {\n this.random = Math.random();\n this.vector.x = this.x1 + this.random * this.length * Math.cos(this.gradient);\n this.vector.y = this.y1 + this.random * this.length * Math.sin(this.gradient);\n\n return this.vector;\n }\n\n getDirection(x, y) {\n const A = this.dy;\n const B = -this.dx;\n const C = this.dot;\n const D = B === 0 ? 1 : B;\n\n if ((A * x + B * y + C) * D > 0) return true;\n else return false;\n }\n\n getDistance(x, y) {\n const A = this.dy;\n const B = -this.dx;\n const C = this.dot;\n const D = A * x + B * y + C;\n\n return D / Math.sqrt(this.xxyy);\n }\n\n getSymmetric(v) {\n const tha2 = v.getGradient();\n const tha1 = this.getGradient();\n const tha = 2 * (tha1 - tha2);\n\n const oldx = v.x;\n const oldy = v.y;\n\n v.x = oldx * Math.cos(tha) - oldy * Math.sin(tha);\n v.y = oldx * Math.sin(tha) + oldy * Math.cos(tha);\n\n return v;\n }\n\n getGradient() {\n return Math.atan2(this.dy, this.dx);\n }\n\n rangeOut(particle) {\n const angle = Math.abs(this.getGradient());\n\n if (angle <= MathUtil.PI / 4) {\n if (particle.p.x <= this.maxx && particle.p.x >= this.minx) return true;\n } else {\n if (particle.p.y <= this.maxy && particle.p.y >= this.miny) return true;\n }\n\n return false;\n }\n\n getLength() {\n return Math.sqrt(this.dx * this.dx + this.dy * this.dy);\n }\n\n crossing(particle) {\n if (this.crossType === \"dead\") {\n if (this.direction === \">\" || this.direction === \"R\" || this.direction === \"right\" || this.direction === \"down\") {\n if (!this.rangeOut(particle)) return;\n if (this.getDirection(particle.p.x, particle.p.y)) particle.dead = true;\n } else {\n if (!this.rangeOut(particle)) return;\n if (!this.getDirection(particle.p.x, particle.p.y)) particle.dead = true;\n }\n } else if (this.crossType === \"bound\") {\n if (!this.rangeOut(particle)) return;\n\n if (this.getDistance(particle.p.x, particle.p.y) <= particle.radius) {\n if (this.dx === 0) {\n particle.v.x *= -1;\n } else if (this.dy === 0) {\n particle.v.y *= -1;\n } else {\n this.getSymmetric(particle.v);\n }\n }\n } else if (this.crossType === \"cross\") {\n if (this.alert) {\n console.error(\"Sorry, LineZone does not support cross method!\");\n this.alert = false;\n }\n }\n }\n}\n","import Zone from \"./Zone\";\nimport MathUtil from \"../math/MathUtil\";\n\nexport default class CircleZone extends Zone {\n constructor(x, y, radius) {\n super();\n\n this.x = x;\n this.y = y;\n this.radius = radius;\n this.angle = 0;\n this.center = { x, y };\n }\n\n getPosition() {\n this.angle = MathUtil.PIx2 * Math.random();\n this.randomRadius = Math.random() * this.radius;\n this.vector.x = this.x + this.randomRadius * Math.cos(this.angle);\n this.vector.y = this.y + this.randomRadius * Math.sin(this.angle);\n\n return this.vector;\n }\n\n setCenter(x, y) {\n this.center.x = x;\n this.center.y = y;\n }\n\n crossing(particle) {\n const d = particle.p.distanceTo(this.center);\n\n if (this.crossType === \"dead\") {\n if (d - particle.radius > this.radius) particle.dead = true;\n } else if (this.crossType === \"bound\") {\n if (d + particle.radius >= this.radius) this.getSymmetric(particle);\n } else if (this.crossType === \"cross\") {\n if (this.alert) {\n console.error(\"Sorry, CircleZone does not support cross method!\");\n this.alert = false;\n }\n }\n }\n\n getSymmetric(particle) {\n const tha2 = particle.v.getGradient();\n const tha1 = this.getGradient(particle);\n\n const tha = 2 * (tha1 - tha2);\n const oldx = particle.v.x;\n const oldy = particle.v.y;\n\n particle.v.x = oldx * Math.cos(tha) - oldy * Math.sin(tha);\n particle.v.y = oldx * Math.sin(tha) + oldy * Math.cos(tha);\n }\n\n getGradient(particle) {\n return -MathUtil.PI_2 + Math.atan2(particle.p.y - this.center.y, particle.p.x - this.center.x);\n }\n}\n","import Zone from \"./Zone\";\n\nexport default class RectZone extends Zone {\n constructor(x, y, width, height) {\n super();\n\n this.x = x;\n this.y = y;\n this.width = width;\n this.height = height;\n }\n\n getPosition() {\n this.vector.x = this.x + Math.random() * this.width;\n this.vector.y = this.y + Math.random() * this.height;\n\n return this.vector;\n }\n\n crossing(particle) {\n // particle dead zone\n if (this.crossType === \"dead\") {\n if (particle.p.x + particle.radius < this.x) particle.dead = true;\n else if (particle.p.x - particle.radius > this.x + this.width) particle.dead = true;\n\n if (particle.p.y + particle.radius < this.y) particle.dead = true;\n else if (particle.p.y - particle.radius > this.y + this.height) particle.dead = true;\n }\n\n // particle bound zone\n else if (this.crossType === \"bound\") {\n if (particle.p.x - particle.radius < this.x) {\n particle.p.x = this.x + particle.radius;\n particle.v.x *= -1;\n } else if (particle.p.x + particle.radius > this.x + this.width) {\n particle.p.x = this.x + this.width - particle.radius;\n particle.v.x *= -1;\n }\n\n if (particle.p.y - particle.radius < this.y) {\n particle.p.y = this.y + particle.radius;\n particle.v.y *= -1;\n } else if (particle.p.y + particle.radius > this.y + this.height) {\n particle.p.y = this.y + this.height - particle.radius;\n particle.v.y *= -1;\n }\n }\n\n // particle cross zone\n else if (this.crossType === \"cross\") {\n if (particle.p.x + particle.radius < this.x && particle.v.x <= 0) {\n particle.p.x = this.x + this.width + particle.radius;\n } else if (particle.p.x - particle.radius > this.x + this.width && particle.v.x >= 0) {\n particle.p.x = this.x - particle.radius;\n }\n\n if (particle.p.y + particle.radius < this.y && particle.v.y <= 0) {\n particle.p.y = this.y + this.height + particle.radius;\n } else if (particle.p.y - particle.radius > this.y + this.height && particle.v.y >= 0) {\n particle.p.y = this.y - particle.radius;\n }\n }\n }\n}\n","import Zone from \"./Zone\";\nimport Util from \"../utils/Util\";\n\nexport default class ImageZone extends Zone {\n constructor(imageData, x, y, d) {\n super();\n this.reset(imageData, x, y, d);\n }\n\n reset(imageData, x, y, d) {\n this.imageData = imageData;\n this.x = Util.initValue(x, 0);\n this.y = Util.initValue(y, 0);\n this.d = Util.initValue(d, 2);\n\n this.vectors = [];\n this.setVectors();\n }\n\n setVectors() {\n let i, j;\n const length1 = this.imageData.width;\n const length2 = this.imageData.height;\n\n for (i = 0; i < length1; i += this.d) {\n for (j = 0; j < length2; j += this.d) {\n let index = ((j >> 0) * length1 + (i >> 0)) * 4;\n\n if (this.imageData.data[index + 3] > 0) {\n this.vectors.push({ x: i + this.x, y: j + this.y });\n }\n }\n }\n\n return this.vector;\n }\n\n getBound(x, y) {\n const index = ((y >> 0) * this.imageData.width + (x >> 0)) * 4;\n if (this.imageData.data[index + 3] > 0) return true;\n else return false;\n }\n\n getPosition() {\n const vector = Util.getRandFromArray(this.vectors);\n return this.vector.copy(vector);\n }\n\n getColor(x, y) {\n x -= this.x;\n y -= this.y;\n const i = ((y >> 0) * this.imageData.width + (x >> 0)) * 4;\n\n return {\n r: this.imageData.data[i],\n g: this.imageData.data[i + 1],\n b: this.imageData.data[i + 2],\n a: this.imageData.data[i + 3]\n };\n }\n\n crossing(particle) {\n if (this.crossType === \"dead\") {\n if (this.getBound(particle.p.x - this.x, particle.p.y - this.y)) particle.dead = true;\n else particle.dead = false;\n } else if (this.crossType === \"bound\") {\n if (!this.getBound(particle.p.x - this.x, particle.p.y - this.y)) particle.v.negate();\n }\n }\n\n destroy() {\n super.destroy();\n this.imageData = null;\n }\n}\n","import ColorUtil from \"../utils/ColorUtil\";\nimport CircleZone from \"../zone/CircleZone\";\nimport PointZone from \"../zone/PointZone\";\nimport LineZone from \"../zone/LineZone\";\nimport RectZone from \"../zone/RectZone\";\n\nexport default {\n addEventListener(proton, func) {\n proton.addEventListener(\"PROTON_UPDATE_AFTER\", () => func());\n },\n\n getStyle(color = \"#ff0000\") {\n const rgb = ColorUtil.hexToRgb(color);\n return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, 0.5)`;\n },\n\n drawZone(proton, canvas, zone, clear) {\n const context = canvas.getContext(\"2d\");\n const style = this.getStyle();\n\n this.addEventListener(proton, () => {\n if (clear) context.clearRect(0, 0, canvas.width, canvas.height);\n\n if (zone instanceof PointZone) {\n context.beginPath();\n context.fillStyle = style;\n context.arc(zone.x, zone.y, 10, 0, Math.PI * 2, true);\n context.fill();\n context.closePath();\n } else if (zone instanceof LineZone) {\n context.beginPath();\n context.strokeStyle = style;\n context.moveTo(zone.x1, zone.y1);\n context.lineTo(zone.x2, zone.y2);\n context.stroke();\n context.closePath();\n } else if (zone instanceof RectZone) {\n context.beginPath();\n context.strokeStyle = style;\n context.drawRect(zone.x, zone.y, zone.width, zone.height);\n context.stroke();\n context.closePath();\n } else if (zone instanceof CircleZone) {\n context.beginPath();\n context.strokeStyle = style;\n context.arc(zone.x, zone.y, zone.radius, 0, Math.PI * 2, true);\n context.stroke();\n context.closePath();\n }\n });\n },\n\n drawEmitter(proton, canvas, emitter, clear) {\n const context = canvas.getContext(\"2d\");\n const style = this.getStyle();\n\n this.addEventListener(proton, () => {\n if (clear) context.clearRect(0, 0, canvas.width, canvas.height);\n\n context.beginPath();\n context.fillStyle = style;\n context.arc(emitter.p.x, emitter.p.y, 10, 0, Math.PI * 2, true);\n context.fill();\n context.closePath();\n });\n }\n};\n","import Proton from \"./core/Proton\";\nimport Particle from \"./core/Particle\";\nimport Pool from \"./core/Pool\";\n\nimport Util from \"./utils/Util\";\nimport ColorUtil from \"./utils/ColorUtil\";\nimport MathUtil from \"./math/MathUtil\";\nimport Vector2D from \"./math/Vector2D\";\nimport Polar2D from \"./math/Polar2D\";\nimport Mat3 from \"./math/Mat3\";\nimport Span from \"./math/Span\";\nimport ArraySpan from \"./math/ArraySpan\";\nimport Rectangle from \"./math/Rectangle\";\nimport ease from \"./math/ease\";\n\nimport Rate from \"./initialize/Rate\";\nimport Initialize from \"./initialize/Initialize\";\nimport Life from \"./initialize/Life\";\nimport Position from \"./initialize/Position\";\nimport Velocity from \"./initialize/Velocity\";\nimport Mass from \"./initialize/Mass\";\nimport Radius from \"./initialize/Radius\";\nimport Body from \"./initialize/Body\";\n\nimport Behaviour from \"./behaviour/Behaviour\";\nimport Force from \"./behaviour/Force\";\nimport Attraction from \"./behaviour/Attraction\";\nimport RandomDrift from \"./behaviour/RandomDrift\";\nimport Gravity from \"./behaviour/Gravity\";\nimport Collision from \"./behaviour/Collision\";\nimport CrossZone from \"./behaviour/CrossZone\";\nimport Alpha from \"./behaviour/Alpha\";\nimport Scale from \"./behaviour/Scale\";\nimport Rotate from \"./behaviour/Rotate\";\nimport Color from \"./behaviour/Color\";\nimport Cyclone from \"./behaviour/Cyclone\";\nimport Repulsion from \"./behaviour/Repulsion\";\nimport GravityWell from \"./behaviour/GravityWell\";\n\nimport Emitter from \"./emitter/Emitter\";\nimport BehaviourEmitter from \"./emitter/BehaviourEmitter\";\nimport FollowEmitter from \"./emitter/FollowEmitter\";\n\nimport CanvasRenderer from \"./render/CanvasRenderer\";\nimport DomRenderer from \"./render/DomRenderer\";\nimport EaselRenderer from \"./render/EaselRenderer\";\nimport PixelRenderer from \"./render/PixelRenderer\";\nimport PixiRenderer from \"./render/PixiRenderer\";\nimport WebGLRenderer from \"./render/WebGLRenderer\";\nimport CustomRenderer from \"./render/CustomRenderer\";\n\nimport Zone from \"./zone/Zone\";\nimport LineZone from \"./zone/LineZone\";\nimport CircleZone from \"./zone/CircleZone\";\nimport PointZone from \"./zone/PointZone\";\nimport RectZone from \"./zone/RectZone\";\nimport ImageZone from \"./zone/ImageZone\";\n\nimport Debug from \"./debug/Debug\";\n\n// namespace\nProton.Particle = Particle;\nProton.Pool = Pool;\n\nProton.Util = Util;\nProton.ColorUtil = ColorUtil;\nProton.MathUtil = MathUtil;\nProton.Vector2D = Proton.Vector = Vector2D;\nProton.Polar2D = Proton.Polar = Polar2D;\nProton.ArraySpan = ArraySpan;\nProton.Rectangle = Rectangle;\nProton.Rate = Rate;\nProton.ease = ease;\nProton.Span = Span;\nProton.Mat3 = Mat3;\nProton.getSpan = (a, b, center) => new Span(a, b, center);\nProton.createArraySpan = ArraySpan.createArraySpan;\n\nProton.Initialize = Proton.Init = Initialize;\nProton.Life = Proton.L = Life;\nProton.Position = Proton.P = Position;\nProton.Velocity = Proton.V = Velocity;\nProton.Mass = Proton.M = Mass;\nProton.Radius = Proton.R = Radius;\nProton.Body = Proton.B = Body;\n\nProton.Behaviour = Behaviour;\nProton.Force = Proton.F = Force;\nProton.Attraction = Proton.A = Attraction;\nProton.RandomDrift = Proton.RD = RandomDrift;\nProton.Gravity = Proton.G = Gravity;\nProton.Collision = Collision;\nProton.CrossZone = CrossZone;\nProton.Alpha = Alpha;\nProton.Scale = Proton.S = Scale;\nProton.Rotate = Rotate;\nProton.Color = Color;\nProton.Repulsion = Repulsion;\nProton.Cyclone = Cyclone;\nProton.GravityWell = GravityWell;\n\nProton.Emitter = Emitter;\nProton.BehaviourEmitter = BehaviourEmitter;\nProton.FollowEmitter = FollowEmitter;\n\nProton.Zone = Zone;\nProton.LineZone = LineZone;\nProton.CircleZone = CircleZone;\nProton.PointZone = PointZone;\nProton.RectZone = RectZone;\nProton.ImageZone = ImageZone;\n\nProton.CanvasRenderer = CanvasRenderer;\nProton.DomRenderer = DomRenderer;\nProton.EaselRenderer = EaselRenderer;\nProton.PixiRenderer = PixiRenderer;\nProton.PixelRenderer = PixelRenderer;\nProton.WebGLRenderer = Proton.WebGlRenderer = WebGLRenderer;\nProton.CustomRenderer = CustomRenderer;\n\nProton.Debug = Debug;\nUtil.assign(Proton, ease);\n\n// export\nexport default Proton;\n"],"names":["length","i","tx","ty","angleInRadians","c","Math","cos","s","sin","sx","sy","a","b","a00","a01","a02","a10","a11","a12","a20","a21","a22","b00","b01","b02","b10","b11","b12","b20","b21","b22","createCanvas","id","width","height","position","dom","document","createElement","style","opacity","transform","createDiv","resize","marginLeft","marginTop","div","x","y","scale","rotate","willChange","css3","transform3d","key","val","bkey","charAt","toUpperCase","substr","imgsCache","canvasCache","canvasId","context","image","rect","drawImage","imagedata","getImageData","clearRect","img","callback","param","src","Image","onload","e","target","WebGLUtil","canvas","DomUtil","getContext","initValue","value","defaults","isArray","Object","prototype","toString","call","emptyArray","arr","toArray","this","getRandFromArray","floor","random","emptyObject","obj","ignore","indexOf","classApply","constructor","args","bind","apply","concat","ImgUtil","destroyAll","destroy","assign","source","hasOwnProperty","idsMap","Puid","_index","_cache","type","undefined","getId","uid","getIdFromCache","isBody","isInner","getTarget","Pool","num","total","cache","get","params","p","__puid","pop","createOrClone","expire","getCache","push","create","Util","clone","getCount","count","Stats","proton","container","emitterIndex","rendererIndex","update","body","add","emitter","getEmitter","renderer","getRenderer","str","emitters","emitSpeed","getEmitterPos","initializes","concatArr","behaviours","name","getCreatedNumber","pool","innerHTML","bg","color","cssText","join","addEventListener","_this","parentNode","appendChild","renderers","result","cpool","round","removeChild","EventDispatcher","_listeners","dispatchEvent","hasEventListener","removeEventListener","removeAllEventListeners","listener","splice","listeners","handler","PI","MathUtil","PIx2","PI_2","PI_180","N180_PI","Infinity","isInfinity","randomAToB","isInt","randomFloating","center","f","randomColor","slice","randomZone","display","k","digits","pow","degreeTransform","toColor16","Integration","calculate","particles","time","damping","eulerIntegrate","particle","sleep","old","copy","v","multiplyScalar","mass","clear","Proton","integrationType","now","then","elapsed","stats","EULER","integrator","_fps","_interval","DEFAULT_INTERVAL","addRenderer","render","init","removeRenderer","index","remove","addEmitter","parent","EMITTER_ADDED","removeEmitter","EMITTER_REMOVED","PROTON_UPDATE","USE_CLOCK","Date","getTime","amendChangeTabsBug","emittersUpdate","PROTON_UPDATE_AFTER","getAllParticles","destroyAllEmitters","destroyOther","setTimeout","fps","MEASURE","RK2","PARTICLE_CREATED","PARTICLE_UPDATE","PARTICLE_SLEEP","PARTICLE_DEAD","Rgb","r","g","reset","hasProp","setProp","props","prop","Span","getSpanValue","setVectorVal","conf","easeLinear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInSine","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","sqrt","easeOutCirc","easeInOutCirc","easeInBack","easeOutBack","easeInOutBack","getEasing","ease","Vector2D","set","setX","setY","getGradient","atan2","w","addVectors","addXY","sub","subVectors","divideScalar","negate","dot","lengthSq","normalize","distanceTo","distanceToSquared","tha","dx","dy","lerp","alpha","equals","Particle","data","rgb","PropUtil","getDirection","life","age","dead","sprite","energy","radius","rotation","easing","removeAllBehaviours","applyBehaviours","max","applyBehaviour","addBehaviour","behaviour","parents","initialize","addBehaviours","removeBehaviour","hexToRgb","h","hex16","substring","parseInt","rgbToHex","rbg","getHex16FromParticle","Number","Polar2D","abs","setR","setTha","toVector","getX","getY","Mat3","mat3","mat","Float32Array","mat1","mat2","multiply","inverse","multiplyVec2","m","vec","getValue","setSpanValue","pan","ArraySpan","_arr","createArraySpan","Rectangle","bottom","right","contains","Rate","numpan","timepan","numPan","timePan","startTime","nextTime","Initialize","Life","lifePan","Zone","vector","crossType","alert","getPosition","crossing","PointZone","console","error","Position","zone","Velocity","rpan","thapan","rPan","thaPan","normalizeVelocity","vr","polar2d","Mass","massPan","Radius","oldRadius","Body","imageTarget","inner","Behaviour","normalizeForce","force","normalizeValue","Force","fx","fy","Attraction","targetPosition","radiusSq","attractionForce","RandomDrift","driftX","driftY","delay","panFoce","Gravity","Collision","collisionPool","delta","otherParticle","overlap","totalMass","averageMass1","averageMass2","newPool","distance","CrossZone","Alpha","same","alphaA","alphaB","Scale","scaleA","scaleB","Rotate","influence","rotationA","rotationB","Color","colorA","ColorUtil","colorB","CHANGING","Cyclone","angle","setAngleAndForce","span","String","toLowerCase","cangle","cyclone","gradient","Repulsion","GravityWell","centerPoint","distanceVec","distanceSq","factor","bindEmitter","Emitter","emitTime","totalTime","rate","emit","stoped","isNaN","stop","preEmit","oldStoped","oldEmitTime","oldTotalTime","step","removeAllParticles","addSelfInitialize","initAll","addInitialize","rest","removeInitialize","initializer","removeAllInitializers","arguments","emitting","integrate","dispatch","event","bindEvent","createParticle","setupParticle","InitializeUtil","PIXIClass","BehaviourEmitter","selfBehaviours","addSelfBehaviour","removeSelfBehaviour","FollowEmitter","mouseTarget","window","_allowEmitting","initEventHandler","mousemoveHandler","_this2","mousemove","mousedownHandler","mousedown","mouseupHandler","mouseup","layerX","layerY","offsetX","offsetY","_Emitter","tagName","nodeName","BaseRenderer","element","stroke","circleConf","isCircle","setStroke","thinkness","_protonUpdateHandler","onProtonUpdate","_protonUpdateAfterHandler","onProtonUpdateAfter","_emitterAddedHandler","onEmitterAdded","_emitterRemovedHandler","onEmitterRemoved","_particleCreatedHandler","onParticleCreated","_particleUpdateHandler","onParticleUpdate","_particleDeadHandler","onParticleDead","CanvasRenderer","bufferCache","addImg2Body","Types","drawCircle","buffer","createBuffer","bufContext","globalAlpha","globalCompositeOperation","fillStyle","fillRect","save","translate","restore","beginPath","arc","strokeStyle","lineWidth","closePath","fill","size","DomRenderer","createBody","bodyReady","backgroundColor","createCircle","createSprite","borderRadius","borderColor","borderWidth","url","backgroundImage","EaselRenderer","addChild","scaleX","scaleY","graphics","regX","regY","createjs","Graphics","beginStroke","beginFill","shape","Shape","PixelRenderer","rectangle","imageData","createImageData","putImageData","setPixel","elementwidth","PixiRenderer","setColor","blendMode","setPIXI","PIXI","Sprite","createFromImage","from","fromImage","tint","anchor","endFill","MStack","mats","top","WebGLRenderer","gl","antialias","stencil","depth","initVar","setMaxRadius","initShaders","initBuffers","blendEquation","FUNC_ADD","blendFunc","SRC_ALPHA","ONE_MINUS_SRC_ALPHA","enable","BLEND","umat","smat","mstack","viewport","circleCanvasURL","getVertexShader","getFragmentShader","texturebuffers","A","B","getShader","fs","shader","createShader","FRAGMENT_SHADER","VERTEX_SHADER","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","getShaderInfoLog","fragmentShader","vertexShader","sprogram","createProgram","attachShader","linkProgram","getProgramParameter","LINK_STATUS","useProgram","vpa","getAttribLocation","tca","enableVertexAttribArray","tMatUniform","getUniformLocation","samplerUniform","useTex","uniform1i","idx","unitIBuffer","bindBuffer","ELEMENT_ARRAY_BUFFER","bufferData","Uint16Array","STATIC_DRAW","ids","unitI33","stripBuffer","raidus","circleCanvasRadius","toDataURL","drawImg2Canvas","_w","_h","_width","_height","_scaleX","_scaleY","createTexture","texture","vcBuffer","tcBuffer","ARRAY_BUFFER","bindTexture","TEXTURE_2D","texImage2D","RGBA","UNSIGNED_BYTE","texParameteri","TEXTURE_MAG_FILTER","LINEAR","TEXTURE_MIN_FILTER","LINEAR_MIPMAP_NEAREST","generateMipmap","textureLoaded","textureWidth","textureHeight","tmat","imat","oldScale","updateMatrix","uniform3f","uniformMatrix3fv","vertexAttribPointer","FLOAT","drawElements","TRIANGLES","UNSIGNED_SHORT","moveOriginMatrix","translationMatrix","angel","rotationMatrix","scaleMatrix","matrix","CustomRenderer","LineZone","x1","y1","x2","y2","direction","minx","min","miny","maxx","maxy","xxyy","getLength","getDistance","getSymmetric","tha2","oldx","oldy","rangeOut","CircleZone","randomRadius","setCenter","d","RectZone","ImageZone","vectors","setVectors","j","length1","length2","getBound","getColor","func","getStyle","drawZone","moveTo","lineTo","drawRect","drawEmitter","Vector","Polar","getSpan","Init","L","P","V","M","R","F","RD","G","S","WebGlRenderer","Debug"],"mappings":"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"} \ No newline at end of file diff --git a/example/emitter/destroy/testDestroy.html b/example/emitter/destroy/testDestroy.html index 2338ea8..fcad058 100644 --- a/example/emitter/destroy/testDestroy.html +++ b/example/emitter/destroy/testDestroy.html @@ -18,7 +18,7 @@ #container { width: 1003px; height: 610px; - margin-top: 50px; + margin-top: 100px; margin-left: -501px; left: 50%; position: absolute; @@ -43,7 +43,7 @@ diff --git a/package.json b/package.json index 8fec953..e7e6355 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "proton-engine", - "version": "5.2.6", + "version": "5.2.7", "description": "Proton is a simple and powerful javascript particle animation engine.", "keywords": [ "particle", diff --git a/src/core/Proton.js b/src/core/Proton.js index 34f6923..58c236e 100755 --- a/src/core/Proton.js +++ b/src/core/Proton.js @@ -235,9 +235,16 @@ export default class Proton { this.time = 0; this.then = 0; this.pool.destroy(); + this.stats.destroy(); Util.destroyAll(this.emitters); Util.destroyAll(this.renderers, this.getAllParticles()); + + this.integrator = null; + this.renderers = null; + this.emitters = null; + this.stats = null; + this.pool = null; }; if (remove) { diff --git a/src/debug/Stats.js b/src/debug/Stats.js index 0468bcc..4d6239f 100755 --- a/src/debug/Stats.js +++ b/src/debug/Stats.js @@ -117,4 +117,14 @@ export default class Stats { getEmitterPos(e) { return Math.round(e.p.x) + "," + Math.round(e.p.y); } + + destroy() { + if (this.container && this.container.parentNode) { + const body = this.body || document.body; + body.removeChild(this.container); + } + + this.proton = null; + this.container = null; + } }