Skip to content

Instantly share code, notes, and snippets.

@Anish-Agnihotri
Last active July 23, 2018 17:53
Show Gist options
  • Save Anish-Agnihotri/47e76d3e8699b315f739c0ebecb3746a to your computer and use it in GitHub Desktop.
Save Anish-Agnihotri/47e76d3e8699b315f739c0ebecb3746a to your computer and use it in GitHub Desktop.
(function() {
// Hungarian notation
// (http://en.wikipedia.org/wiki/Hungarian_notation)
// n - HTML-Node
// o - object
// s - string
// i - integer
// a - array
// b - boolean
// f - float
// p - Particle
// fn - function
// ctx - 2D Context
// General Functions
var app, fnAddEventListener, fnRequestAnimationFrame;
fnRequestAnimationFrame = function(fnCallback) {
var fnAnimFrame;
fnAnimFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(fnCallback) {
window.setTimeOut(fnCallback, 1000 / 60);
};
fnAnimFrame(fnCallback);
};
// Add Event Listener
fnAddEventListener = function(o, sEvent, fn) {
if (o.addEventListener) {
o.addEventListener(sEvent, fn, false);
} else {
o['on' + sEvent] = fn;
}
};
app = function() {
var Particle, ctxRender, fAngle, fCosAngle, fMaxAX, fMaxAY, fMaxAZ, fPI, fSinAngle, fStartVX, fStartVY, fStartVZ, fVX, fnACos, fnCos, fnMax, fnMin, fnNextFrame, fnRender, fnRnd, fnRnd2, fnSetSize, fnSin, fnSwapList, gui, h, iProjSphereX, iProjSphereY, iRadiusSphere, nBody, oBuffer, oDoc, oRadGrad, oRender, oStats, w;
oStats = new Stats();
oStats.setMode(0);
oStats.domElement.style.position = 'absolute';
oStats.domElement.style.left = '0px';
oStats.domElement.style.top = '0px';
document.body.appendChild(oStats.domElement);
// General Elements
oDoc = document;
nBody = oDoc.body;
// Shortcuts
fPI = Math.PI;
fnMax = Math.max;
fnMin = Math.min;
fnRnd = Math.random;
fnRnd2 = function() {
return 2.0 * fnRnd() - 1.0;
};
fnCos = Math.cos;
fnACos = Math.acos;
fnSin = Math.sin;
// Sphere Settings
iRadiusSphere = 150;
iProjSphereX = 0;
iProjSphereY = 0;
// Particle Settings
fMaxAX = 0.1;
fMaxAY = 0.1;
fMaxAZ = 0.1;
fStartVX = 0.001;
fStartVY = 0.001;
fStartVZ = 0.001;
fAngle = 0.0;
fSinAngle = 0.0;
fCosAngle = 0.0;
window.iFramesToRotate = 2100.0;
window.iPerspective = 220;
window.iNewParticlePerFrame = 4;
window.fGrowDuration = 120.0;
window.fWaitDuration = 340.0;
window.fShrinkDuration = 430.0;
window.aColor = [0, 126, 255];
window.bgColor = [255, 255, 255];
fVX = (2.0 * fPI) / window.iFramesToRotate;
oRadGrad = null;
ctxRender = nCanvasRender.getContext('2d');
oRender = {
pFirst: null
};
oBuffer = {
pFirst: null
};
w = h = 0;
// gets/sets size
fnSetSize = function() {
nCanvasRender.width = w = window.innerWidth;
nCanvasRender.height = h = window.innerHeight;
iProjSphereX = w / 2;
iProjSphereY = h / 2;
return {
w: w,
h: h
};
};
fnSetSize();
// window.onresize
fnAddEventListener(window, 'resize', fnSetSize);
fnSwapList = function(p, oSrc, oDst) {
if (p != null) {
// remove p from oSrc
if (oSrc.pFirst === p) {
oSrc.pFirst = p.pNext;
if (p.pNext != null) {
p.pNext.pPrev = null;
}
} else {
p.pPrev.pNext = p.pNext;
if (p.pNext != null) {
p.pNext.pPrev = p.pPrev;
}
}
} else {
// create new p
p = new Particle();
}
p.pNext = oDst.pFirst;
if (oDst.pFirst != null) {
oDst.pFirst.pPrev = p;
}
oDst.pFirst = p;
p.pPrev = null;
return p;
};
Particle = (function() {
// Particle
class Particle {
fnInit() {
this.fAngle = fnRnd() * fPI * 2;
this.fForce = fnACos(fnRnd2());
this.fAlpha = 0;
this.bIsDead = false;
this.iFramesAlive = 0;
this.fX = iRadiusSphere * fnSin(this.fForce) * fnCos(this.fAngle);
this.fY = iRadiusSphere * fnSin(this.fForce) * fnSin(this.fAngle);
this.fZ = iRadiusSphere * fnCos(this.fForce);
this.fVX = fStartVX * this.fX;
this.fVY = fStartVY * this.fY;
this.fVZ = fStartVZ * this.fZ;
this.fGrowDuration = window.fGrowDuration + fnRnd2() * (window.fGrowDuration / 4.0);
this.fWaitDuration = window.fWaitDuration + fnRnd2() * (window.fWaitDuration / 4.0);
this.fShrinkDuration = window.fShrinkDuration + fnRnd2() * (window.fShrinkDuration / 4.0);
this.fAX = 0.0;
this.fAY = 0.0;
this.fAZ = 0.0;
}
fnUpdate() {
if (this.iFramesAlive > this.fGrowDuration + this.fWaitDuration) {
this.fVX += this.fAX + fMaxAX * fnRnd2();
this.fVY += this.fAY + fMaxAY * fnRnd2();
this.fVZ += this.fAZ + fMaxAZ * fnRnd2();
this.fX += this.fVX;
this.fY += this.fVY;
this.fZ += this.fVZ;
}
this.fRotX = fCosAngle * this.fX + fSinAngle * this.fZ;
this.fRotZ = -fSinAngle * this.fX + fCosAngle * this.fZ;
this.fRadiusCurrent = Math.max(0.01, window.iPerspective / (window.iPerspective - this.fRotZ));
this.fProjX = this.fRotX * this.fRadiusCurrent + iProjSphereX;
this.fProjY = this.fY * this.fRadiusCurrent + iProjSphereY;
this.iFramesAlive += 1;
if (this.iFramesAlive < this.fGrowDuration) {
this.fAlpha = this.iFramesAlive * 1.0 / this.fGrowDuration;
} else if (this.iFramesAlive < this.fGrowDuration + this.fWaitDuration) {
this.fAlpha = 1.0;
} else if (this.iFramesAlive < this.fGrowDuration + this.fWaitDuration + this.fShrinkDuration) {
this.fAlpha = (this.fGrowDuration + this.fWaitDuration + this.fShrinkDuration - this.iFramesAlive) * 1.0 / this.fShrinkDuration;
} else {
this.bIsDead = true;
}
if (this.bIsDead === true) {
fnSwapList(this, oRender, oBuffer);
}
this.fAlpha *= fnMin(1.0, fnMax(0.5, this.fRotZ / iRadiusSphere));
this.fAlpha = fnMin(1.0, fnMax(0.0, this.fAlpha));
}
};
// Current Position
Particle.prototype.fX = 0.0;
Particle.prototype.fY = 0.0;
Particle.prototype.fZ = 0.0;
// Current Velocity
Particle.prototype.fVX = 0.0;
Particle.prototype.fVY = 0.0;
Particle.prototype.fVZ = 0.0;
// Current Acceleration
Particle.prototype.fAX = 0.0;
Particle.prototype.fAY = 0.0;
Particle.prototype.fAZ = 0.0;
// Projection Position
Particle.prototype.fProjX = 0.0;
Particle.prototype.fProjY = 0.0;
// Rotation
Particle.prototype.fRotX = 0.0;
Particle.prototype.fRotZ = 0.0;
// double linked list
Particle.prototype.pPrev = null;
Particle.prototype.pNext = null;
Particle.prototype.fAngle = 0.0;
Particle.prototype.fForce = 0.0;
Particle.prototype.fGrowDuration = 0.0;
Particle.prototype.fWaitDuration = 0.0;
Particle.prototype.fShrinkDuration = 0.0;
Particle.prototype.fRadiusCurrent = 0.0;
Particle.prototype.iFramesAlive = 0;
Particle.prototype.bIsDead = false;
return Particle;
}).call(this);
fnRender = function() {
var iCount, p;
ctxRender.fillStyle = "rgb(" + window.bgColor.join(',') + ")";
ctxRender.fillRect(0, 0, w, h);
p = oRender.pFirst;
iCount = 0;
while (p != null) {
ctxRender.fillStyle = "rgba(" + window.aColor.join(',') + ',' + p.fAlpha.toFixed(4) + ")";
ctxRender.beginPath();
ctxRender.arc(p.fProjX, p.fProjY, p.fRadiusCurrent, 0, 2 * fPI, false);
ctxRender.closePath();
ctxRender.fill();
p = p.pNext;
iCount += 1;
}
};
fnNextFrame = function() {
var iAddParticle, iCount, p, pNext;
oStats.begin();
fAngle = (fAngle + fVX) % (2.0 * fPI);
fSinAngle = fnSin(fAngle);
fCosAngle = fnCos(fAngle);
iAddParticle = 0;
iCount = 0;
while (iAddParticle++ < window.iNewParticlePerFrame) {
p = fnSwapList(oBuffer.pFirst, oBuffer, oRender);
p.fnInit();
}
p = oRender.pFirst;
while (p != null) {
pNext = p.pNext;
p.fnUpdate();
p = pNext;
iCount++;
}
fnRender();
oStats.end();
return fnRequestAnimationFrame(function() {
return fnNextFrame();
});
};
fnNextFrame();
gui = new dat.GUI();
gui.add(window, 'fGrowDuration').min(10).max(500).step(1);
gui.add(window, 'fWaitDuration').min(10).max(500).step(1);
gui.add(window, 'fShrinkDuration').min(10).max(500).step(1);
gui.add(window, 'iPerspective').min(150).max(1000).step(1);
gui.add(window, 'iNewParticlePerFrame').min(1).max(20).step(1);
gui.add(window, 'iFramesToRotate').min(50).max(2500).step(50).onChange(function() {
return fVX = (2.0 * fPI) / window.iFramesToRotate;
});
gui.addColor(window, 'aColor').onChange(function() {
window.aColor[0] = ~~window.aColor[0];
window.aColor[1] = ~~window.aColor[1];
return window.aColor[2] = ~~window.aColor[2];
});
gui.addColor(window, 'bgColor').onChange(function() {
window.bgColor[0] = ~~window.bgColor[0];
window.bgColor[1] = ~~window.bgColor[1];
return window.bgColor[2] = ~~window.bgColor[2];
});
if (window.innerWidth < 1000) {
gui.close();
window.iNewParticlePerFrame = 5;
}
window.app = this;
};
fnAddEventListener(window, 'load', app);
}).call(this);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiPGFub255bW91cz4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7RUFBQTs7Ozs7Ozs7Ozs7Ozs7QUFBQSxNQUFBLEdBQUEsRUFBQSxrQkFBQSxFQUFBOztFQWNBLHVCQUFBLEdBQTBCLFFBQUEsQ0FBQyxVQUFELENBQUE7QUFDeEIsUUFBQTtJQUFBLFdBQUEsR0FDRSxNQUFNLENBQUMscUJBQVAsSUFDQSxNQUFNLENBQUMsMkJBRFAsSUFFQSxNQUFNLENBQUMsd0JBRlAsSUFHQSxNQUFNLENBQUMsc0JBSFAsSUFJQSxNQUFNLENBQUMsdUJBSlAsSUFLQSxRQUFBLENBQUMsVUFBRCxDQUFBO01BQ0UsTUFBTSxDQUFDLFVBQVAsQ0FBa0IsVUFBbEIsRUFBOEIsSUFBQSxHQUFPLEVBQXJDO0lBREY7SUFHRixXQUFBLENBQVksVUFBWjtFQVZ3QixFQWQxQjs7O0VBNEJBLGtCQUFBLEdBQXFCLFFBQUEsQ0FBQyxDQUFELEVBQUksTUFBSixFQUFZLEVBQVosQ0FBQTtJQUNuQixJQUFHLENBQUMsQ0FBQyxnQkFBTDtNQUNFLENBQUMsQ0FBQyxnQkFBRixDQUFtQixNQUFuQixFQUEyQixFQUEzQixFQUErQixLQUEvQixFQURGO0tBQUEsTUFBQTtNQUdFLENBQUUsQ0FBQSxJQUFBLEdBQU8sTUFBUCxDQUFGLEdBQW1CLEdBSHJCOztFQURtQjs7RUFPckIsR0FBQSxHQUFNLFFBQUEsQ0FBQSxDQUFBO0FBRUosUUFBQSxRQUFBLEVBQUEsU0FBQSxFQUFBLE1BQUEsRUFBQSxTQUFBLEVBQUEsTUFBQSxFQUFBLE1BQUEsRUFBQSxNQUFBLEVBQUEsR0FBQSxFQUFBLFNBQUEsRUFBQSxRQUFBLEVBQUEsUUFBQSxFQUFBLFFBQUEsRUFBQSxHQUFBLEVBQUEsTUFBQSxFQUFBLEtBQUEsRUFBQSxLQUFBLEVBQUEsS0FBQSxFQUFBLFdBQUEsRUFBQSxRQUFBLEVBQUEsS0FBQSxFQUFBLE1BQUEsRUFBQSxTQUFBLEVBQUEsS0FBQSxFQUFBLFVBQUEsRUFBQSxHQUFBLEVBQUEsQ0FBQSxFQUFBLFlBQUEsRUFBQSxZQUFBLEVBQUEsYUFBQSxFQUFBLEtBQUEsRUFBQSxPQUFBLEVBQUEsSUFBQSxFQUFBLFFBQUEsRUFBQSxPQUFBLEVBQUEsTUFBQSxFQUFBO0lBQUEsTUFBQSxHQUFTLElBQUksS0FBSixDQUFBO0lBQ1QsTUFBTSxDQUFDLE9BQVAsQ0FBZSxDQUFmO0lBQ0EsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsUUFBeEIsR0FBbUM7SUFDbkMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBeEIsR0FBK0I7SUFDL0IsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBeEIsR0FBOEI7SUFDOUIsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFkLENBQTBCLE1BQU0sQ0FBQyxVQUFqQyxFQUxBOztJQVFBLElBQUEsR0FBTztJQUNQLEtBQUEsR0FBUSxJQUFJLENBQUMsS0FUYjs7SUFXQSxHQUFBLEdBQU0sSUFBSSxDQUFDO0lBQ1gsS0FBQSxHQUFRLElBQUksQ0FBQztJQUNiLEtBQUEsR0FBUSxJQUFJLENBQUM7SUFDYixLQUFBLEdBQVEsSUFBSSxDQUFDO0lBQ2IsTUFBQSxHQUFTLFFBQUEsQ0FBQSxDQUFBO2FBQU0sR0FBQSxHQUFNLEtBQUEsQ0FBQSxDQUFOLEdBQWdCO0lBQXRCO0lBQ1QsS0FBQSxHQUFRLElBQUksQ0FBQztJQUNiLE1BQUEsR0FBUyxJQUFJLENBQUM7SUFDZCxLQUFBLEdBQVEsSUFBSSxDQUFDLElBbEJiOztJQW9CQSxhQUFBLEdBQWdCO0lBQ2hCLFlBQUEsR0FBZTtJQUNmLFlBQUEsR0FBZSxFQXRCZjs7SUF3QkEsTUFBQSxHQUFTO0lBQ1QsTUFBQSxHQUFTO0lBQ1QsTUFBQSxHQUFTO0lBQ1QsUUFBQSxHQUFXO0lBQ1gsUUFBQSxHQUFXO0lBQ1gsUUFBQSxHQUFXO0lBQ1gsTUFBQSxHQUFTO0lBQ1QsU0FBQSxHQUFZO0lBQ1osU0FBQSxHQUFZO0lBRVosTUFBTSxDQUFDLGVBQVAsR0FBeUI7SUFDekIsTUFBTSxDQUFDLFlBQVAsR0FBc0I7SUFDdEIsTUFBTSxDQUFDLG9CQUFQLEdBQThCO0lBQzlCLE1BQU0sQ0FBQyxhQUFQLEdBQXVCO0lBQ3ZCLE1BQU0sQ0FBQyxhQUFQLEdBQXVCO0lBQ3ZCLE1BQU0sQ0FBQyxlQUFQLEdBQXlCO0lBQ3pCLE1BQU0sQ0FBQyxNQUFQLEdBQWdCLENBQUMsQ0FBRCxFQUFJLEdBQUosRUFBUyxHQUFUO0lBQ2hCLE1BQU0sQ0FBQyxPQUFQLEdBQWlCLENBQUMsR0FBRCxFQUFNLEdBQU4sRUFBVyxHQUFYO0lBRWpCLEdBQUEsR0FBTSxDQUFDLEdBQUEsR0FBTSxHQUFQLENBQUEsR0FBYyxNQUFNLENBQUM7SUFFM0IsUUFBQSxHQUFXO0lBQ1gsU0FBQSxHQUFZLGFBQWEsQ0FBQyxVQUFkLENBQXlCLElBQXpCO0lBR1osT0FBQSxHQUFVO01BQUMsTUFBQSxFQUFRO0lBQVQ7SUFDVixPQUFBLEdBQVU7TUFBQyxNQUFBLEVBQVE7SUFBVDtJQUVWLENBQUEsR0FBSSxDQUFBLEdBQUksRUFwRFI7O0lBdURBLFNBQUEsR0FBWSxRQUFBLENBQUEsQ0FBQTtNQUNWLGFBQWEsQ0FBQyxLQUFkLEdBQXNCLENBQUEsR0FBSSxNQUFNLENBQUM7TUFDakMsYUFBYSxDQUFDLE1BQWQsR0FBdUIsQ0FBQSxHQUFJLE1BQU0sQ0FBQztNQUNsQyxZQUFBLEdBQWUsQ0FBQSxHQUFJO01BQ25CLFlBQUEsR0FBZSxDQUFBLEdBQUk7YUFDbkI7UUFBQyxDQUFBLEVBQUcsQ0FBSjtRQUFPLENBQUEsRUFBRztNQUFWO0lBTFU7SUFPWixTQUFBLENBQUEsRUE5REE7OztJQWlFQSxrQkFBQSxDQUFtQixNQUFuQixFQUEyQixRQUEzQixFQUFxQyxTQUFyQztJQUVBLFVBQUEsR0FBYSxRQUFBLENBQUMsQ0FBRCxFQUFJLElBQUosRUFBVSxJQUFWLENBQUE7TUFDWCxJQUFHLFNBQUg7O1FBRUUsSUFBRyxJQUFJLENBQUMsTUFBTCxLQUFlLENBQWxCO1VBQ0UsSUFBSSxDQUFDLE1BQUwsR0FBYyxDQUFDLENBQUM7VUFDaEIsSUFBd0IsZUFBeEI7WUFBQSxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQVIsR0FBZ0IsS0FBaEI7V0FGRjtTQUFBLE1BQUE7VUFJRSxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQVIsR0FBZ0IsQ0FBQyxDQUFDO1VBQ2xCLElBQTJCLGVBQTNCO1lBQUEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFSLEdBQWdCLENBQUMsQ0FBQyxNQUFsQjtXQUxGO1NBRkY7T0FBQSxNQUFBOztRQVVFLENBQUEsR0FBSSxJQUFJLFFBQUosQ0FBQSxFQVZOOztNQVlBLENBQUMsQ0FBQyxLQUFGLEdBQVUsSUFBSSxDQUFDO01BQ2YsSUFBeUIsbUJBQXpCO1FBQUEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFaLEdBQW9CLEVBQXBCOztNQUNBLElBQUksQ0FBQyxNQUFMLEdBQWM7TUFDZCxDQUFDLENBQUMsS0FBRixHQUFVO2FBQ1Y7SUFqQlc7SUFvQlA7OztNQUFOLE1BQUEsU0FBQTtRQW1DRSxNQUFRLENBQUEsQ0FBQTtVQUNOLElBQUMsQ0FBQSxNQUFELEdBQVUsS0FBQSxDQUFBLENBQUEsR0FBVSxHQUFWLEdBQWdCO1VBQzFCLElBQUMsQ0FBQSxNQUFELEdBQVUsTUFBQSxDQUFPLE1BQUEsQ0FBQSxDQUFQO1VBQ1YsSUFBQyxDQUFBLE1BQUQsR0FBVTtVQUNWLElBQUMsQ0FBQSxPQUFELEdBQVc7VUFDWCxJQUFDLENBQUEsWUFBRCxHQUFnQjtVQUNoQixJQUFDLENBQUEsRUFBRCxHQUFNLGFBQUEsR0FBZ0IsS0FBQSxDQUFNLElBQUMsQ0FBQSxNQUFQLENBQWhCLEdBQWlDLEtBQUEsQ0FBTSxJQUFDLENBQUEsTUFBUDtVQUN2QyxJQUFDLENBQUEsRUFBRCxHQUFNLGFBQUEsR0FBZ0IsS0FBQSxDQUFNLElBQUMsQ0FBQSxNQUFQLENBQWhCLEdBQWlDLEtBQUEsQ0FBTSxJQUFDLENBQUEsTUFBUDtVQUN2QyxJQUFDLENBQUEsRUFBRCxHQUFNLGFBQUEsR0FBZ0IsS0FBQSxDQUFNLElBQUMsQ0FBQSxNQUFQO1VBQ3RCLElBQUMsQ0FBQSxHQUFELEdBQU8sUUFBQSxHQUFXLElBQUMsQ0FBQTtVQUNuQixJQUFDLENBQUEsR0FBRCxHQUFPLFFBQUEsR0FBVyxJQUFDLENBQUE7VUFDbkIsSUFBQyxDQUFBLEdBQUQsR0FBTyxRQUFBLEdBQVcsSUFBQyxDQUFBO1VBQ25CLElBQUMsQ0FBQSxhQUFELEdBQWlCLE1BQU0sQ0FBQyxhQUFQLEdBQXVCLE1BQUEsQ0FBQSxDQUFBLEdBQVcsQ0FBQyxNQUFNLENBQUMsYUFBUCxHQUF1QixHQUF4QjtVQUNuRCxJQUFDLENBQUEsYUFBRCxHQUFpQixNQUFNLENBQUMsYUFBUCxHQUF1QixNQUFBLENBQUEsQ0FBQSxHQUFXLENBQUMsTUFBTSxDQUFDLGFBQVAsR0FBdUIsR0FBeEI7VUFDbkQsSUFBQyxDQUFBLGVBQUQsR0FBbUIsTUFBTSxDQUFDLGVBQVAsR0FBeUIsTUFBQSxDQUFBLENBQUEsR0FBVyxDQUFDLE1BQU0sQ0FBQyxlQUFQLEdBQXlCLEdBQTFCO1VBQ3ZELElBQUMsQ0FBQSxHQUFELEdBQU87VUFDUCxJQUFDLENBQUEsR0FBRCxHQUFPO1VBQ1AsSUFBQyxDQUFBLEdBQUQsR0FBTztRQWpCRDs7UUFvQlIsUUFBVSxDQUFBLENBQUE7VUFDUixJQUFHLElBQUMsQ0FBQSxZQUFELEdBQWdCLElBQUMsQ0FBQSxhQUFELEdBQWlCLElBQUMsQ0FBQSxhQUFyQztZQUNFLElBQUMsQ0FBQSxHQUFELElBQVEsSUFBQyxDQUFBLEdBQUQsR0FBTyxNQUFBLEdBQVMsTUFBQSxDQUFBO1lBQ3hCLElBQUMsQ0FBQSxHQUFELElBQVEsSUFBQyxDQUFBLEdBQUQsR0FBTyxNQUFBLEdBQVMsTUFBQSxDQUFBO1lBQ3hCLElBQUMsQ0FBQSxHQUFELElBQVEsSUFBQyxDQUFBLEdBQUQsR0FBTyxNQUFBLEdBQVMsTUFBQSxDQUFBO1lBQ3hCLElBQUMsQ0FBQSxFQUFELElBQU8sSUFBQyxDQUFBO1lBQ1IsSUFBQyxDQUFBLEVBQUQsSUFBTyxJQUFDLENBQUE7WUFDUixJQUFDLENBQUEsRUFBRCxJQUFPLElBQUMsQ0FBQSxJQU5WOztVQVFBLElBQUMsQ0FBQSxLQUFELEdBQVMsU0FBQSxHQUFZLElBQUMsQ0FBQSxFQUFiLEdBQWtCLFNBQUEsR0FBWSxJQUFDLENBQUE7VUFDeEMsSUFBQyxDQUFBLEtBQUQsR0FBUyxDQUFDLFNBQUQsR0FBYSxJQUFDLENBQUEsRUFBZCxHQUFtQixTQUFBLEdBQVksSUFBQyxDQUFBO1VBQ3pDLElBQUMsQ0FBQSxjQUFELEdBQWtCLElBQUksQ0FBQyxHQUFMLENBQVMsSUFBVCxFQUFlLE1BQU0sQ0FBQyxZQUFQLEdBQXNCLENBQUMsTUFBTSxDQUFDLFlBQVAsR0FBc0IsSUFBQyxDQUFBLEtBQXhCLENBQXJDO1VBQ2xCLElBQUMsQ0FBQSxNQUFELEdBQVUsSUFBQyxDQUFBLEtBQUQsR0FBUyxJQUFDLENBQUEsY0FBVixHQUEyQjtVQUNyQyxJQUFDLENBQUEsTUFBRCxHQUFVLElBQUMsQ0FBQSxFQUFELEdBQU0sSUFBQyxDQUFBLGNBQVAsR0FBd0I7VUFFbEMsSUFBQyxDQUFBLFlBQUQsSUFBaUI7VUFFakIsSUFBRyxJQUFDLENBQUEsWUFBRCxHQUFnQixJQUFDLENBQUEsYUFBcEI7WUFDRSxJQUFDLENBQUEsTUFBRCxHQUFVLElBQUMsQ0FBQSxZQUFELEdBQWdCLEdBQWhCLEdBQXNCLElBQUMsQ0FBQSxjQURuQztXQUFBLE1BRUssSUFBRyxJQUFDLENBQUEsWUFBRCxHQUFnQixJQUFDLENBQUEsYUFBRCxHQUFpQixJQUFDLENBQUEsYUFBckM7WUFDSCxJQUFDLENBQUEsTUFBRCxHQUFVLElBRFA7V0FBQSxNQUVBLElBQUcsSUFBQyxDQUFBLFlBQUQsR0FBZ0IsSUFBQyxDQUFBLGFBQUQsR0FBaUIsSUFBQyxDQUFBLGFBQWxCLEdBQWtDLElBQUMsQ0FBQSxlQUF0RDtZQUNILElBQUMsQ0FBQSxNQUFELEdBQVUsQ0FBQyxJQUFDLENBQUEsYUFBRCxHQUFpQixJQUFDLENBQUEsYUFBbEIsR0FBa0MsSUFBQyxDQUFBLGVBQW5DLEdBQXFELElBQUMsQ0FBQSxZQUF2RCxDQUFBLEdBQXVFLEdBQXZFLEdBQTZFLElBQUMsQ0FBQSxnQkFEckY7V0FBQSxNQUFBO1lBR0gsSUFBQyxDQUFBLE9BQUQsR0FBVyxLQUhSOztVQUtMLElBQUcsSUFBQyxDQUFBLE9BQUQsS0FBWSxJQUFmO1lBQ0UsVUFBQSxDQUFXLElBQVgsRUFBYyxPQUFkLEVBQXVCLE9BQXZCLEVBREY7O1VBR0EsSUFBQyxDQUFBLE1BQUQsSUFBVyxLQUFBLENBQU0sR0FBTixFQUFXLEtBQUEsQ0FBTSxHQUFOLEVBQVcsSUFBQyxDQUFBLEtBQUQsR0FBUyxhQUFwQixDQUFYO1VBQ1gsSUFBQyxDQUFBLE1BQUQsR0FBVSxLQUFBLENBQU0sR0FBTixFQUFXLEtBQUEsQ0FBTSxHQUFOLEVBQVcsSUFBQyxDQUFBLE1BQVosQ0FBWDtRQTlCRjs7TUF2RFo7Ozt5QkFFRSxFQUFBLEdBQUk7O3lCQUNKLEVBQUEsR0FBSTs7eUJBQ0osRUFBQSxHQUFJOzs7eUJBRUosR0FBQSxHQUFLOzt5QkFDTCxHQUFBLEdBQUs7O3lCQUNMLEdBQUEsR0FBSzs7O3lCQUVMLEdBQUEsR0FBSzs7eUJBQ0wsR0FBQSxHQUFLOzt5QkFDTCxHQUFBLEdBQUs7Ozt5QkFFTCxNQUFBLEdBQVE7O3lCQUNSLE1BQUEsR0FBUTs7O3lCQUVSLEtBQUEsR0FBTzs7eUJBQ1AsS0FBQSxHQUFPOzs7eUJBRVAsS0FBQSxHQUFPOzt5QkFDUCxLQUFBLEdBQU87O3lCQUVQLE1BQUEsR0FBUTs7eUJBQ1IsTUFBQSxHQUFROzt5QkFFUixhQUFBLEdBQWU7O3lCQUNmLGFBQUEsR0FBZTs7eUJBQ2YsZUFBQSxHQUFpQjs7eUJBRWpCLGNBQUEsR0FBZ0I7O3lCQUVoQixZQUFBLEdBQWM7O3lCQUNkLE9BQUEsR0FBUzs7Ozs7SUF1RFgsUUFBQSxHQUFXLFFBQUEsQ0FBQSxDQUFBO0FBQ1QsVUFBQSxNQUFBLEVBQUE7TUFBQSxTQUFTLENBQUMsU0FBVixHQUFzQixNQUFBLEdBQVMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFmLENBQW9CLEdBQXBCLENBQVQsR0FBb0M7TUFDMUQsU0FBUyxDQUFDLFFBQVYsQ0FBbUIsQ0FBbkIsRUFBc0IsQ0FBdEIsRUFBeUIsQ0FBekIsRUFBNEIsQ0FBNUI7TUFFQSxDQUFBLEdBQUksT0FBTyxDQUFDO01BQ1osTUFBQSxHQUFTO0FBQ1QsYUFBTSxTQUFOO1FBQ0UsU0FBUyxDQUFDLFNBQVYsR0FBc0IsT0FBQSxHQUFVLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBZCxDQUFtQixHQUFuQixDQUFWLEdBQW9DLEdBQXBDLEdBQTBDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBVCxDQUFpQixDQUFqQixDQUExQyxHQUFnRTtRQUN0RixTQUFTLENBQUMsU0FBVixDQUFBO1FBQ0EsU0FBUyxDQUFDLEdBQVYsQ0FBYyxDQUFDLENBQUMsTUFBaEIsRUFBd0IsQ0FBQyxDQUFDLE1BQTFCLEVBQWtDLENBQUMsQ0FBQyxjQUFwQyxFQUFvRCxDQUFwRCxFQUF1RCxDQUFBLEdBQUksR0FBM0QsRUFBZ0UsS0FBaEU7UUFDQSxTQUFTLENBQUMsU0FBVixDQUFBO1FBQ0EsU0FBUyxDQUFDLElBQVYsQ0FBQTtRQUNBLENBQUEsR0FBSSxDQUFDLENBQUM7UUFDTixNQUFBLElBQVU7TUFQWjtJQU5TO0lBZ0JYLFdBQUEsR0FBYyxRQUFBLENBQUEsQ0FBQTtBQUNaLFVBQUEsWUFBQSxFQUFBLE1BQUEsRUFBQSxDQUFBLEVBQUE7TUFBQSxNQUFNLENBQUMsS0FBUCxDQUFBO01BQ0EsTUFBQSxHQUFTLENBQUMsTUFBQSxHQUFTLEdBQVYsQ0FBQSxHQUFpQixDQUFDLEdBQUEsR0FBTSxHQUFQO01BQzFCLFNBQUEsR0FBWSxLQUFBLENBQU0sTUFBTjtNQUNaLFNBQUEsR0FBWSxLQUFBLENBQU0sTUFBTjtNQUVaLFlBQUEsR0FBZTtNQUNmLE1BQUEsR0FBUztBQUNULGFBQU0sWUFBQSxFQUFBLEdBQWlCLE1BQU0sQ0FBQyxvQkFBOUI7UUFDRSxDQUFBLEdBQUksVUFBQSxDQUFXLE9BQU8sQ0FBQyxNQUFuQixFQUEyQixPQUEzQixFQUFvQyxPQUFwQztRQUNKLENBQUMsQ0FBQyxNQUFGLENBQUE7TUFGRjtNQUlBLENBQUEsR0FBSSxPQUFPLENBQUM7QUFDWixhQUFNLFNBQU47UUFDRSxLQUFBLEdBQVEsQ0FBQyxDQUFDO1FBQ1YsQ0FBQyxDQUFDLFFBQUYsQ0FBQTtRQUNBLENBQUEsR0FBSTtRQUNKLE1BQUE7TUFKRjtNQUtBLFFBQUEsQ0FBQTtNQUVBLE1BQU0sQ0FBQyxHQUFQLENBQUE7YUFDQSx1QkFBQSxDQUF3QixRQUFBLENBQUEsQ0FBQTtlQUFNLFdBQUEsQ0FBQTtNQUFOLENBQXhCO0lBckJZO0lBdUJkLFdBQUEsQ0FBQTtJQUVBLEdBQUEsR0FBTSxJQUFJLEdBQUcsQ0FBQyxHQUFSLENBQUE7SUFDTixHQUFHLENBQUMsR0FBSixDQUFRLE1BQVIsRUFBZ0IsZUFBaEIsQ0FBZ0MsQ0FBQyxHQUFqQyxDQUFxQyxFQUFyQyxDQUF3QyxDQUFDLEdBQXpDLENBQTZDLEdBQTdDLENBQWlELENBQUMsSUFBbEQsQ0FBdUQsQ0FBdkQ7SUFDQSxHQUFHLENBQUMsR0FBSixDQUFRLE1BQVIsRUFBZ0IsZUFBaEIsQ0FBZ0MsQ0FBQyxHQUFqQyxDQUFxQyxFQUFyQyxDQUF3QyxDQUFDLEdBQXpDLENBQTZDLEdBQTdDLENBQWlELENBQUMsSUFBbEQsQ0FBdUQsQ0FBdkQ7SUFDQSxHQUFHLENBQUMsR0FBSixDQUFRLE1BQVIsRUFBZ0IsaUJBQWhCLENBQWtDLENBQUMsR0FBbkMsQ0FBdUMsRUFBdkMsQ0FBMEMsQ0FBQyxHQUEzQyxDQUErQyxHQUEvQyxDQUFtRCxDQUFDLElBQXBELENBQXlELENBQXpEO0lBQ0EsR0FBRyxDQUFDLEdBQUosQ0FBUSxNQUFSLEVBQWdCLGNBQWhCLENBQStCLENBQUMsR0FBaEMsQ0FBb0MsR0FBcEMsQ0FBd0MsQ0FBQyxHQUF6QyxDQUE2QyxJQUE3QyxDQUFrRCxDQUFDLElBQW5ELENBQXdELENBQXhEO0lBQ0EsR0FBRyxDQUFDLEdBQUosQ0FBUSxNQUFSLEVBQWdCLHNCQUFoQixDQUF1QyxDQUFDLEdBQXhDLENBQTRDLENBQTVDLENBQThDLENBQUMsR0FBL0MsQ0FBbUQsRUFBbkQsQ0FBc0QsQ0FBQyxJQUF2RCxDQUE0RCxDQUE1RDtJQUNBLEdBQUcsQ0FBQyxHQUFKLENBQVEsTUFBUixFQUFnQixpQkFBaEIsQ0FBa0MsQ0FBQyxHQUFuQyxDQUF1QyxFQUF2QyxDQUEwQyxDQUFDLEdBQTNDLENBQStDLElBQS9DLENBQW9ELENBQUMsSUFBckQsQ0FBMEQsRUFBMUQsQ0FBNkQsQ0FBQyxRQUE5RCxDQUF1RSxRQUFBLENBQUEsQ0FBQTthQUNyRSxHQUFBLEdBQU0sQ0FBQyxHQUFBLEdBQU0sR0FBUCxDQUFBLEdBQWMsTUFBTSxDQUFDO0lBRDBDLENBQXZFO0lBR0EsR0FBRyxDQUFDLFFBQUosQ0FBYSxNQUFiLEVBQXFCLFFBQXJCLENBQThCLENBQUMsUUFBL0IsQ0FBd0MsUUFBQSxDQUFBLENBQUE7TUFDdEMsTUFBTSxDQUFDLE1BQU8sQ0FBQSxDQUFBLENBQWQsR0FBbUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFPLENBQUEsQ0FBQTtNQUNuQyxNQUFNLENBQUMsTUFBTyxDQUFBLENBQUEsQ0FBZCxHQUFtQixDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU8sQ0FBQSxDQUFBO2FBQ25DLE1BQU0sQ0FBQyxNQUFPLENBQUEsQ0FBQSxDQUFkLEdBQW1CLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTyxDQUFBLENBQUE7SUFIRyxDQUF4QztJQUtBLEdBQUcsQ0FBQyxRQUFKLENBQWEsTUFBYixFQUFxQixTQUFyQixDQUErQixDQUFDLFFBQWhDLENBQXlDLFFBQUEsQ0FBQSxDQUFBO01BQ3ZDLE1BQU0sQ0FBQyxPQUFRLENBQUEsQ0FBQSxDQUFmLEdBQW9CLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBUSxDQUFBLENBQUE7TUFDckMsTUFBTSxDQUFDLE9BQVEsQ0FBQSxDQUFBLENBQWYsR0FBb0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFRLENBQUEsQ0FBQTthQUNyQyxNQUFNLENBQUMsT0FBUSxDQUFBLENBQUEsQ0FBZixHQUFvQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQVEsQ0FBQSxDQUFBO0lBSEUsQ0FBekM7SUFLQSxJQUFHLE1BQU0sQ0FBQyxVQUFQLEdBQW9CLElBQXZCO01BQ0UsR0FBRyxDQUFDLEtBQUosQ0FBQTtNQUNBLE1BQU0sQ0FBQyxvQkFBUCxHQUE4QixFQUZoQzs7SUFJQSxNQUFNLENBQUMsR0FBUCxHQUFhO0VBalBUOztFQW9QTixrQkFBQSxDQUFtQixNQUFuQixFQUEyQixNQUEzQixFQUFtQyxHQUFuQztBQXZSQSIsInNvdXJjZXNDb250ZW50IjpbIiMgSHVuZ2FyaWFuIG5vdGF0aW9uXG4jIChodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0h1bmdhcmlhbl9ub3RhdGlvbilcbiMgbiAtIEhUTUwtTm9kZVxuIyBvIC0gb2JqZWN0XG4jIHMgLSBzdHJpbmdcbiMgaSAtIGludGVnZXJcbiMgYSAtIGFycmF5XG4jIGIgLSBib29sZWFuXG4jIGYgLSBmbG9hdFxuIyBwIC0gUGFydGljbGVcbiMgZm4gLSBmdW5jdGlvblxuIyBjdHggLSAyRCBDb250ZXh0XG5cbiMgR2VuZXJhbCBGdW5jdGlvbnNcbmZuUmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gKGZuQ2FsbGJhY2spIC0+XG4gIGZuQW5pbUZyYW1lID1cbiAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lIG9yXG4gICAgd2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSBvclxuICAgIHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgb3JcbiAgICB3aW5kb3cub1JlcXVlc3RBbmltYXRpb25GcmFtZSBvclxuICAgIHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZSBvclxuICAgIChmbkNhbGxiYWNrKSAtPlxuICAgICAgd2luZG93LnNldFRpbWVPdXQoZm5DYWxsYmFjaywgMTAwMCAvIDYwKVxuICAgICAgcmV0dXJuXG4gIGZuQW5pbUZyYW1lIGZuQ2FsbGJhY2tcbiAgcmV0dXJuXG5cbiMgQWRkIEV2ZW50IExpc3RlbmVyXG5mbkFkZEV2ZW50TGlzdGVuZXIgPSAobywgc0V2ZW50LCBmbikgLT5cbiAgaWYgby5hZGRFdmVudExpc3RlbmVyXG4gICAgby5hZGRFdmVudExpc3RlbmVyKHNFdmVudCwgZm4sIGZhbHNlKVxuICBlbHNlXG4gICAgb1snb24nICsgc0V2ZW50XSA9IGZuXG4gIHJldHVyblxuXG5hcHAgPSAoKSAtPlxuXG4gIG9TdGF0cyA9IG5ldyBTdGF0cygpXG4gIG9TdGF0cy5zZXRNb2RlKDApXG4gIG9TdGF0cy5kb21FbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICBvU3RhdHMuZG9tRWxlbWVudC5zdHlsZS5sZWZ0ID0gJzBweCdcbiAgb1N0YXRzLmRvbUVsZW1lbnQuc3R5bGUudG9wID0gJzBweCdcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChvU3RhdHMuZG9tRWxlbWVudClcblxuICAjIEdlbmVyYWwgRWxlbWVudHNcbiAgb0RvYyA9IGRvY3VtZW50XG4gIG5Cb2R5ID0gb0RvYy5ib2R5XG4gICMgU2hvcnRjdXRzXG4gIGZQSSA9IE1hdGguUElcbiAgZm5NYXggPSBNYXRoLm1heFxuICBmbk1pbiA9IE1hdGgubWluXG4gIGZuUm5kID0gTWF0aC5yYW5kb21cbiAgZm5SbmQyID0gKCkgLT4gMi4wICogZm5SbmQoKSAtIDEuMFxuICBmbkNvcyA9IE1hdGguY29zXG4gIGZuQUNvcyA9IE1hdGguYWNvc1xuICBmblNpbiA9IE1hdGguc2luXG4gICMgU3BoZXJlIFNldHRpbmdzXG4gIGlSYWRpdXNTcGhlcmUgPSAxNTBcbiAgaVByb2pTcGhlcmVYID0gMFxuICBpUHJvalNwaGVyZVkgPSAwXG4gICMgUGFydGljbGUgU2V0dGluZ3NcbiAgZk1heEFYID0gMC4xXG4gIGZNYXhBWSA9IDAuMVxuICBmTWF4QVogPSAwLjFcbiAgZlN0YXJ0VlggPSAwLjAwMVxuICBmU3RhcnRWWSA9IDAuMDAxXG4gIGZTdGFydFZaID0gMC4wMDFcbiAgZkFuZ2xlID0gMC4wXG4gIGZTaW5BbmdsZSA9IDAuMFxuICBmQ29zQW5nbGUgPSAwLjBcblxuICB3aW5kb3cuaUZyYW1lc1RvUm90YXRlID0gMjEwMC4wXG4gIHdpbmRvdy5pUGVyc3BlY3RpdmUgPSAyMjBcbiAgd2luZG93LmlOZXdQYXJ0aWNsZVBlckZyYW1lID0gNFxuICB3aW5kb3cuZkdyb3dEdXJhdGlvbiA9IDEyMC4wXG4gIHdpbmRvdy5mV2FpdER1cmF0aW9uID0gMzQwLjBcbiAgd2luZG93LmZTaHJpbmtEdXJhdGlvbiA9IDQzMC4wXG4gIHdpbmRvdy5hQ29sb3IgPSBbMCwgMTI2LCAyNTVdXG4gIHdpbmRvdy5iZ0NvbG9yID0gWzI1NSwgMjU1LCAyNTVdXG5cbiAgZlZYID0gKDIuMCAqIGZQSSkgLyB3aW5kb3cuaUZyYW1lc1RvUm90YXRlXG5cbiAgb1JhZEdyYWQgPSBudWxsXG4gIGN0eFJlbmRlciA9IG5DYW52YXNSZW5kZXIuZ2V0Q29udGV4dCAnMmQnXG5cblxuICBvUmVuZGVyID0ge3BGaXJzdDogbnVsbH1cbiAgb0J1ZmZlciA9IHtwRmlyc3Q6IG51bGx9XG4gIFxuICB3ID0gaCA9IDBcblxuICAjIGdldHMvc2V0cyBzaXplXG4gIGZuU2V0U2l6ZSA9ICgpIC0+XG4gICAgbkNhbnZhc1JlbmRlci53aWR0aCA9IHcgPSB3aW5kb3cuaW5uZXJXaWR0aFxuICAgIG5DYW52YXNSZW5kZXIuaGVpZ2h0ID0gaCA9IHdpbmRvdy5pbm5lckhlaWdodFxuICAgIGlQcm9qU3BoZXJlWCA9IHcgLyAyXG4gICAgaVByb2pTcGhlcmVZID0gaCAvIDJcbiAgICB7dzogdywgaDogaH1cblxuICBmblNldFNpemUoKVxuICBcbiAgIyB3aW5kb3cub25yZXNpemVcbiAgZm5BZGRFdmVudExpc3RlbmVyKHdpbmRvdywgJ3Jlc2l6ZScsIGZuU2V0U2l6ZSlcblxuICBmblN3YXBMaXN0ID0gKHAsIG9TcmMsIG9Ec3QpIC0+XG4gICAgaWYgcD9cbiAgICAgICMgcmVtb3ZlIHAgZnJvbSBvU3JjXG4gICAgICBpZiBvU3JjLnBGaXJzdCBpcyBwXG4gICAgICAgIG9TcmMucEZpcnN0ID0gcC5wTmV4dFxuICAgICAgICBwLnBOZXh0LnBQcmV2ID0gbnVsbCBpZiBwLnBOZXh0P1xuICAgICAgZWxzZVxuICAgICAgICBwLnBQcmV2LnBOZXh0ID0gcC5wTmV4dFxuICAgICAgICBwLnBOZXh0LnBQcmV2ID0gcC5wUHJldiBpZiBwLnBOZXh0P1xuICAgIGVsc2VcbiAgICAgICMgY3JlYXRlIG5ldyBwXG4gICAgICBwID0gbmV3IFBhcnRpY2xlKClcbiAgXG4gICAgcC5wTmV4dCA9IG9Ec3QucEZpcnN0XG4gICAgb0RzdC5wRmlyc3QucFByZXYgPSBwIGlmIG9Ec3QucEZpcnN0P1xuICAgIG9Ec3QucEZpcnN0ID0gcFxuICAgIHAucFByZXYgPSBudWxsXG4gICAgcFxuICBcbiAgIyBQYXJ0aWNsZVxuICBjbGFzcyBQYXJ0aWNsZVxuICAgICMgQ3VycmVudCBQb3NpdGlvblxuICAgIGZYOiAwLjBcbiAgICBmWTogMC4wXG4gICAgZlo6IDAuMFxuICAgICMgQ3VycmVudCBWZWxvY2l0eVxuICAgIGZWWDogMC4wXG4gICAgZlZZOiAwLjBcbiAgICBmVlo6IDAuMFxuICAgICMgQ3VycmVudCBBY2NlbGVyYXRpb25cbiAgICBmQVg6IDAuMFxuICAgIGZBWTogMC4wXG4gICAgZkFaOiAwLjBcbiAgICAjIFByb2plY3Rpb24gUG9zaXRpb25cbiAgICBmUHJvalg6IDAuMFxuICAgIGZQcm9qWTogMC4wXG4gICAgIyBSb3RhdGlvblxuICAgIGZSb3RYOiAwLjBcbiAgICBmUm90WjogMC4wXG4gICAgIyBkb3VibGUgbGlua2VkIGxpc3RcbiAgICBwUHJldjogbnVsbFxuICAgIHBOZXh0OiBudWxsXG4gICAgXG4gICAgZkFuZ2xlOiAwLjBcbiAgICBmRm9yY2U6IDAuMFxuXG4gICAgZkdyb3dEdXJhdGlvbjogMC4wXG4gICAgZldhaXREdXJhdGlvbjogMC4wXG4gICAgZlNocmlua0R1cmF0aW9uOiAwLjBcbiAgICBcbiAgICBmUmFkaXVzQ3VycmVudDogMC4wXG4gICAgXG4gICAgaUZyYW1lc0FsaXZlOiAwXG4gICAgYklzRGVhZDogZmFsc2VcbiAgICAgIFxuICAgIGZuSW5pdDogKCkgLT5cbiAgICAgIEBmQW5nbGUgPSBmblJuZCgpICogZlBJICogMlxuICAgICAgQGZGb3JjZSA9IGZuQUNvcyhmblJuZDIoKSlcbiAgICAgIEBmQWxwaGEgPSAwXG4gICAgICBAYklzRGVhZCA9IGZhbHNlO1xuICAgICAgQGlGcmFtZXNBbGl2ZSA9IDA7XG4gICAgICBAZlggPSBpUmFkaXVzU3BoZXJlICogZm5TaW4oQGZGb3JjZSkgKiBmbkNvcyhAZkFuZ2xlKVxuICAgICAgQGZZID0gaVJhZGl1c1NwaGVyZSAqIGZuU2luKEBmRm9yY2UpICogZm5TaW4oQGZBbmdsZSlcbiAgICAgIEBmWiA9IGlSYWRpdXNTcGhlcmUgKiBmbkNvcyhAZkZvcmNlKVxuICAgICAgQGZWWCA9IGZTdGFydFZYICogQGZYXG4gICAgICBAZlZZID0gZlN0YXJ0VlkgKiBAZllcbiAgICAgIEBmVlogPSBmU3RhcnRWWiAqIEBmWlxuICAgICAgQGZHcm93RHVyYXRpb24gPSB3aW5kb3cuZkdyb3dEdXJhdGlvbiArIGZuUm5kMigpICogKHdpbmRvdy5mR3Jvd0R1cmF0aW9uIC8gNC4wKVxuICAgICAgQGZXYWl0RHVyYXRpb24gPSB3aW5kb3cuZldhaXREdXJhdGlvbiArIGZuUm5kMigpICogKHdpbmRvdy5mV2FpdER1cmF0aW9uIC8gNC4wKVxuICAgICAgQGZTaHJpbmtEdXJhdGlvbiA9IHdpbmRvdy5mU2hyaW5rRHVyYXRpb24gKyBmblJuZDIoKSAqICh3aW5kb3cuZlNocmlua0R1cmF0aW9uIC8gNC4wKVxuICAgICAgQGZBWCA9IDAuMFxuICAgICAgQGZBWSA9IDAuMFxuICAgICAgQGZBWiA9IDAuMFxuICAgICAgcmV0dXJuXG4gIFxuICAgIGZuVXBkYXRlOiAoKSAtPlxuICAgICAgaWYgQGlGcmFtZXNBbGl2ZSA+IEBmR3Jvd0R1cmF0aW9uICsgQGZXYWl0RHVyYXRpb25cbiAgICAgICAgQGZWWCArPSBAZkFYICsgZk1heEFYICogZm5SbmQyKClcbiAgICAgICAgQGZWWSArPSBAZkFZICsgZk1heEFZICogZm5SbmQyKClcbiAgICAgICAgQGZWWiArPSBAZkFaICsgZk1heEFaICogZm5SbmQyKClcbiAgICAgICAgQGZYICs9IEBmVlhcbiAgICAgICAgQGZZICs9IEBmVllcbiAgICAgICAgQGZaICs9IEBmVlpcblxuICAgICAgQGZSb3RYID0gZkNvc0FuZ2xlICogQGZYICsgZlNpbkFuZ2xlICogQGZaXG4gICAgICBAZlJvdFogPSAtZlNpbkFuZ2xlICogQGZYICsgZkNvc0FuZ2xlICogQGZaXG4gICAgICBAZlJhZGl1c0N1cnJlbnQgPSBNYXRoLm1heCgwLjAxLCB3aW5kb3cuaVBlcnNwZWN0aXZlIC8gKHdpbmRvdy5pUGVyc3BlY3RpdmUgLSBAZlJvdFopKVxuICAgICAgQGZQcm9qWCA9IEBmUm90WCAqIEBmUmFkaXVzQ3VycmVudCArIGlQcm9qU3BoZXJlWCBcbiAgICAgIEBmUHJvalkgPSBAZlkgKiBAZlJhZGl1c0N1cnJlbnQgKyBpUHJvalNwaGVyZVkgXG5cbiAgICAgIEBpRnJhbWVzQWxpdmUgKz0gMVxuXG4gICAgICBpZiBAaUZyYW1lc0FsaXZlIDwgQGZHcm93RHVyYXRpb25cbiAgICAgICAgQGZBbHBoYSA9IEBpRnJhbWVzQWxpdmUgKiAxLjAgLyBAZkdyb3dEdXJhdGlvblxuICAgICAgZWxzZSBpZiBAaUZyYW1lc0FsaXZlIDwgQGZHcm93RHVyYXRpb24gKyBAZldhaXREdXJhdGlvblxuICAgICAgICBAZkFscGhhID0gMS4wXG4gICAgICBlbHNlIGlmIEBpRnJhbWVzQWxpdmUgPCBAZkdyb3dEdXJhdGlvbiArIEBmV2FpdER1cmF0aW9uICsgQGZTaHJpbmtEdXJhdGlvblxuICAgICAgICBAZkFscGhhID0gKEBmR3Jvd0R1cmF0aW9uICsgQGZXYWl0RHVyYXRpb24gKyBAZlNocmlua0R1cmF0aW9uIC0gQGlGcmFtZXNBbGl2ZSkgKiAxLjAgLyBAZlNocmlua0R1cmF0aW9uXG4gICAgICBlbHNlXG4gICAgICAgIEBiSXNEZWFkID0gdHJ1ZVxuXG4gICAgICBpZiBAYklzRGVhZCBpcyB0cnVlXG4gICAgICAgIGZuU3dhcExpc3QoQCwgb1JlbmRlciwgb0J1ZmZlcilcblxuICAgICAgQGZBbHBoYSAqPSBmbk1pbigxLjAsIGZuTWF4KDAuNSwgQGZSb3RaIC8gaVJhZGl1c1NwaGVyZSkpXG4gICAgICBAZkFscGhhID0gZm5NaW4oMS4wLCBmbk1heCgwLjAsIEBmQWxwaGEpKVxuICAgICAgcmV0dXJuXG4gICAgICBcbiAgZm5SZW5kZXIgPSAoKSAtPlxuICAgIGN0eFJlbmRlci5maWxsU3R5bGUgPSBcInJnYihcIiArIHdpbmRvdy5iZ0NvbG9yLmpvaW4oJywnKSArIFwiKVwiXG4gICAgY3R4UmVuZGVyLmZpbGxSZWN0KDAsIDAsIHcsIGgpXG5cbiAgICBwID0gb1JlbmRlci5wRmlyc3RcbiAgICBpQ291bnQgPSAwXG4gICAgd2hpbGUgcD9cbiAgICAgIGN0eFJlbmRlci5maWxsU3R5bGUgPSBcInJnYmEoXCIgKyB3aW5kb3cuYUNvbG9yLmpvaW4oJywnKSArICcsJyArIHAuZkFscGhhLnRvRml4ZWQoNCkgKyBcIilcIlxuICAgICAgY3R4UmVuZGVyLmJlZ2luUGF0aCgpXG4gICAgICBjdHhSZW5kZXIuYXJjKHAuZlByb2pYLCBwLmZQcm9qWSwgcC5mUmFkaXVzQ3VycmVudCwgMCwgMiAqIGZQSSwgZmFsc2UpXG4gICAgICBjdHhSZW5kZXIuY2xvc2VQYXRoKClcbiAgICAgIGN0eFJlbmRlci5maWxsKClcbiAgICAgIHAgPSBwLnBOZXh0XG4gICAgICBpQ291bnQgKz0gMVxuICAgIHJldHVyblxuICBcbiAgZm5OZXh0RnJhbWUgPSAoKSAtPlxuICAgIG9TdGF0cy5iZWdpbigpXG4gICAgZkFuZ2xlID0gKGZBbmdsZSArIGZWWCkgJSAoMi4wICogZlBJKVxuICAgIGZTaW5BbmdsZSA9IGZuU2luKGZBbmdsZSlcbiAgICBmQ29zQW5nbGUgPSBmbkNvcyhmQW5nbGUpXG5cbiAgICBpQWRkUGFydGljbGUgPSAwXG4gICAgaUNvdW50ID0gMFxuICAgIHdoaWxlIGlBZGRQYXJ0aWNsZSsrIDwgd2luZG93LmlOZXdQYXJ0aWNsZVBlckZyYW1lXG4gICAgICBwID0gZm5Td2FwTGlzdChvQnVmZmVyLnBGaXJzdCwgb0J1ZmZlciwgb1JlbmRlcilcbiAgICAgIHAuZm5Jbml0KClcbiAgXG4gICAgcCA9IG9SZW5kZXIucEZpcnN0XG4gICAgd2hpbGUgcD9cbiAgICAgIHBOZXh0ID0gcC5wTmV4dFxuICAgICAgcC5mblVwZGF0ZSgpXG4gICAgICBwID0gcE5leHRcbiAgICAgIGlDb3VudCsrXG4gICAgZm5SZW5kZXIoKVxuXG4gICAgb1N0YXRzLmVuZCgpXG4gICAgZm5SZXF1ZXN0QW5pbWF0aW9uRnJhbWUgKCkgLT4gZm5OZXh0RnJhbWUoKSBcbiAgICBcbiAgZm5OZXh0RnJhbWUoKSAgXG5cbiAgZ3VpID0gbmV3IGRhdC5HVUkoKTtcbiAgZ3VpLmFkZCh3aW5kb3csICdmR3Jvd0R1cmF0aW9uJykubWluKDEwKS5tYXgoNTAwKS5zdGVwKDEpXG4gIGd1aS5hZGQod2luZG93LCAnZldhaXREdXJhdGlvbicpLm1pbigxMCkubWF4KDUwMCkuc3RlcCgxKVxuICBndWkuYWRkKHdpbmRvdywgJ2ZTaHJpbmtEdXJhdGlvbicpLm1pbigxMCkubWF4KDUwMCkuc3RlcCgxKVxuICBndWkuYWRkKHdpbmRvdywgJ2lQZXJzcGVjdGl2ZScpLm1pbigxNTApLm1heCgxMDAwKS5zdGVwKDEpXG4gIGd1aS5hZGQod2luZG93LCAnaU5ld1BhcnRpY2xlUGVyRnJhbWUnKS5taW4oMSkubWF4KDIwKS5zdGVwKDEpXG4gIGd1aS5hZGQod2luZG93LCAnaUZyYW1lc1RvUm90YXRlJykubWluKDUwKS5tYXgoMjUwMCkuc3RlcCg1MCkub25DaGFuZ2UoKCkgLT5cbiAgICBmVlggPSAoMi4wICogZlBJKSAvIHdpbmRvdy5pRnJhbWVzVG9Sb3RhdGVcbiAgKVxuICBndWkuYWRkQ29sb3Iod2luZG93LCAnYUNvbG9yJykub25DaGFuZ2UoKCkgLT5cbiAgICB3aW5kb3cuYUNvbG9yWzBdID0gfn53aW5kb3cuYUNvbG9yWzBdXG4gICAgd2luZG93LmFDb2xvclsxXSA9IH5+d2luZG93LmFDb2xvclsxXVxuICAgIHdpbmRvdy5hQ29sb3JbMl0gPSB+fndpbmRvdy5hQ29sb3JbMl1cbiAgKVxuICBndWkuYWRkQ29sb3Iod2luZG93LCAnYmdDb2xvcicpLm9uQ2hhbmdlKCgpIC0+XG4gICAgd2luZG93LmJnQ29sb3JbMF0gPSB+fndpbmRvdy5iZ0NvbG9yWzBdXG4gICAgd2luZG93LmJnQ29sb3JbMV0gPSB+fndpbmRvdy5iZ0NvbG9yWzFdXG4gICAgd2luZG93LmJnQ29sb3JbMl0gPSB+fndpbmRvdy5iZ0NvbG9yWzJdXG4gIClcbiAgaWYgd2luZG93LmlubmVyV2lkdGggPCAxMDAwXG4gICAgZ3VpLmNsb3NlKClcbiAgICB3aW5kb3cuaU5ld1BhcnRpY2xlUGVyRnJhbWUgPSA1XG5cbiAgd2luZG93LmFwcCA9IEBcbiAgcmV0dXJuXG4gIFxuZm5BZGRFdmVudExpc3RlbmVyKHdpbmRvdywgJ2xvYWQnLCBhcHApIl19
//# sourceURL=coffeescript
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment