ngx-spine
Version:
[](https://travis-ci.org/PoiScript/ngx-spine)
371 lines • 35 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/******************************************************************************
* Spine Runtimes License Agreement
* Last updated May 1, 2019. Replaces all prior versions.
*
* Copyright (c) 2013-2019, Esoteric Software LLC
*
* Integration of the Spine Runtimes into software or otherwise creating
* derivative works of the Spine Runtimes is permitted under the terms and
* conditions of Section 2 of the Spine Editor License Agreement:
* http://esotericsoftware.com/spine-editor-license
*
* Otherwise, it is permitted to integrate the Spine Runtimes into software
* or otherwise create derivative works of the Spine Runtimes (collectively,
* "Products"), provided that each user of the Products must obtain their own
* Spine Editor license and redistribution of the Products in any form must
* include this license and copyright notice.
*
* THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
* NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS
* INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*****************************************************************************/
import { Pool } from "../core/Utils";
var Input = /** @class */ (function () {
function Input(element) {
this.lastX = 0;
this.lastY = 0;
this.buttonDown = false;
this.currTouch = null;
this.touchesPool = new Pool((/**
* @return {?}
*/
function () {
return new Touch(0, 0, 0);
}));
this.listeners = new Array();
this.element = element;
this.setupCallbacks(element);
}
/**
* @private
* @param {?} element
* @return {?}
*/
Input.prototype.setupCallbacks = /**
* @private
* @param {?} element
* @return {?}
*/
function (element) {
var _this = this;
/** @type {?} */
var mouseDown = (/**
* @param {?} ev
* @return {?}
*/
function (ev) {
if (ev instanceof MouseEvent) {
/** @type {?} */
var rect = element.getBoundingClientRect();
/** @type {?} */
var x = ev.clientX - rect.left;
/** @type {?} */
var y = ev.clientY - rect.top;
/** @type {?} */
var listeners = _this.listeners;
for (var i = 0; i < listeners.length; i++) {
listeners[i].down(x, y);
}
_this.lastX = x;
_this.lastY = y;
_this.buttonDown = true;
document.addEventListener("mousemove", mouseMove);
document.addEventListener("mouseup", mouseUp);
}
});
/** @type {?} */
var mouseMove = (/**
* @param {?} ev
* @return {?}
*/
function (ev) {
if (ev instanceof MouseEvent) {
/** @type {?} */
var rect = element.getBoundingClientRect();
/** @type {?} */
var x = ev.clientX - rect.left;
/** @type {?} */
var y = ev.clientY - rect.top;
/** @type {?} */
var listeners = _this.listeners;
for (var i = 0; i < listeners.length; i++) {
if (_this.buttonDown) {
listeners[i].dragged(x, y);
}
else {
listeners[i].moved(x, y);
}
}
_this.lastX = x;
_this.lastY = y;
}
});
/** @type {?} */
var mouseUp = (/**
* @param {?} ev
* @return {?}
*/
function (ev) {
if (ev instanceof MouseEvent) {
/** @type {?} */
var rect = element.getBoundingClientRect();
/** @type {?} */
var x = ev.clientX - rect.left;
/** @type {?} */
var y = ev.clientY - rect.top;
/** @type {?} */
var listeners = _this.listeners;
for (var i = 0; i < listeners.length; i++) {
listeners[i].up(x, y);
}
_this.lastX = x;
_this.lastY = y;
_this.buttonDown = false;
document.removeEventListener("mousemove", mouseMove);
document.removeEventListener("mouseup", mouseUp);
}
});
element.addEventListener("mousedown", mouseDown, true);
element.addEventListener("mousemove", mouseMove, true);
element.addEventListener("mouseup", mouseUp, true);
element.addEventListener("touchstart", (/**
* @param {?} ev
* @return {?}
*/
function (ev) {
if (_this.currTouch != null)
return;
/** @type {?} */
var touches = ev.changedTouches;
for (var i = 0; i < touches.length; i++) {
/** @type {?} */
var touch = touches[i];
/** @type {?} */
var rect = element.getBoundingClientRect();
/** @type {?} */
var x = touch.clientX - rect.left;
/** @type {?} */
var y = touch.clientY - rect.top;
_this.currTouch = _this.touchesPool.obtain();
_this.currTouch.identifier = touch.identifier;
_this.currTouch.x = x;
_this.currTouch.y = y;
break;
}
/** @type {?} */
var listeners = _this.listeners;
for (var i_1 = 0; i_1 < listeners.length; i_1++) {
listeners[i_1].down(_this.currTouch.x, _this.currTouch.y);
}
console.log("Start " + _this.currTouch.x + ", " + _this.currTouch.y);
_this.lastX = _this.currTouch.x;
_this.lastY = _this.currTouch.y;
_this.buttonDown = true;
ev.preventDefault();
}), false);
element.addEventListener("touchend", (/**
* @param {?} ev
* @return {?}
*/
function (ev) {
/** @type {?} */
var touches = ev.changedTouches;
for (var i = 0; i < touches.length; i++) {
/** @type {?} */
var touch = touches[i];
if (_this.currTouch.identifier === touch.identifier) {
/** @type {?} */
var rect = element.getBoundingClientRect();
/** @type {?} */
var x = (_this.currTouch.x = touch.clientX - rect.left);
/** @type {?} */
var y = (_this.currTouch.y = touch.clientY - rect.top);
_this.touchesPool.free(_this.currTouch);
/** @type {?} */
var listeners = _this.listeners;
for (var i_2 = 0; i_2 < listeners.length; i_2++) {
listeners[i_2].up(x, y);
}
console.log("End " + x + ", " + y);
_this.lastX = x;
_this.lastY = y;
_this.buttonDown = false;
_this.currTouch = null;
break;
}
}
ev.preventDefault();
}), false);
element.addEventListener("touchcancel", (/**
* @param {?} ev
* @return {?}
*/
function (ev) {
/** @type {?} */
var touches = ev.changedTouches;
for (var i = 0; i < touches.length; i++) {
/** @type {?} */
var touch = touches[i];
if (_this.currTouch.identifier === touch.identifier) {
/** @type {?} */
var rect = element.getBoundingClientRect();
/** @type {?} */
var x = (_this.currTouch.x = touch.clientX - rect.left);
/** @type {?} */
var y = (_this.currTouch.y = touch.clientY - rect.top);
_this.touchesPool.free(_this.currTouch);
/** @type {?} */
var listeners = _this.listeners;
for (var i_3 = 0; i_3 < listeners.length; i_3++) {
listeners[i_3].up(x, y);
}
console.log("End " + x + ", " + y);
_this.lastX = x;
_this.lastY = y;
_this.buttonDown = false;
_this.currTouch = null;
break;
}
}
ev.preventDefault();
}), false);
element.addEventListener("touchmove", (/**
* @param {?} ev
* @return {?}
*/
function (ev) {
if (_this.currTouch == null)
return;
/** @type {?} */
var touches = ev.changedTouches;
for (var i = 0; i < touches.length; i++) {
/** @type {?} */
var touch = touches[i];
if (_this.currTouch.identifier === touch.identifier) {
/** @type {?} */
var rect = element.getBoundingClientRect();
/** @type {?} */
var x = touch.clientX - rect.left;
/** @type {?} */
var y = touch.clientY - rect.top;
/** @type {?} */
var listeners = _this.listeners;
for (var i_4 = 0; i_4 < listeners.length; i_4++) {
listeners[i_4].dragged(x, y);
}
console.log("Drag " + x + ", " + y);
_this.lastX = _this.currTouch.x = x;
_this.lastY = _this.currTouch.y = y;
break;
}
}
ev.preventDefault();
}), false);
};
/**
* @param {?} listener
* @return {?}
*/
Input.prototype.addListener = /**
* @param {?} listener
* @return {?}
*/
function (listener) {
this.listeners.push(listener);
};
/**
* @param {?} listener
* @return {?}
*/
Input.prototype.removeListener = /**
* @param {?} listener
* @return {?}
*/
function (listener) {
/** @type {?} */
var idx = this.listeners.indexOf(listener);
if (idx > -1) {
this.listeners.splice(idx, 1);
}
};
return Input;
}());
export { Input };
if (false) {
/** @type {?} */
Input.prototype.element;
/** @type {?} */
Input.prototype.lastX;
/** @type {?} */
Input.prototype.lastY;
/** @type {?} */
Input.prototype.buttonDown;
/** @type {?} */
Input.prototype.currTouch;
/** @type {?} */
Input.prototype.touchesPool;
/**
* @type {?}
* @private
*/
Input.prototype.listeners;
}
var Touch = /** @class */ (function () {
function Touch(identifier, x, y) {
this.identifier = identifier;
this.x = x;
this.y = y;
}
return Touch;
}());
export { Touch };
if (false) {
/** @type {?} */
Touch.prototype.identifier;
/** @type {?} */
Touch.prototype.x;
/** @type {?} */
Touch.prototype.y;
}
/**
* @record
*/
export function InputListener() { }
if (false) {
/**
* @param {?} x
* @param {?} y
* @return {?}
*/
InputListener.prototype.down = function (x, y) { };
/**
* @param {?} x
* @param {?} y
* @return {?}
*/
InputListener.prototype.up = function (x, y) { };
/**
* @param {?} x
* @param {?} y
* @return {?}
*/
InputListener.prototype.moved = function (x, y) { };
/**
* @param {?} x
* @param {?} y
* @return {?}
*/
InputListener.prototype.dragged = function (x, y) { };
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5wdXQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtc3BpbmUvIiwic291cmNlcyI6WyJsaWIvc3BpbmUtdHMvd2ViZ2wvSW5wdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE2QkEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVyQztJQVVFLGVBQVksT0FBb0I7UUFSaEMsVUFBSyxHQUFHLENBQUMsQ0FBQztRQUNWLFVBQUssR0FBRyxDQUFDLENBQUM7UUFDVixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ25CLGNBQVMsR0FBVSxJQUFJLENBQUM7UUFDeEIsZ0JBQVcsR0FBRyxJQUFJLElBQUk7OztRQUFRO1lBQzVCLE9BQU8sSUFBSSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM1QixDQUFDLEVBQUMsQ0FBQztRQUNLLGNBQVMsR0FBRyxJQUFJLEtBQUssRUFBaUIsQ0FBQztRQUU3QyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9CLENBQUM7Ozs7OztJQUNPLDhCQUFjOzs7OztJQUF0QixVQUF1QixPQUFvQjtRQUEzQyxpQkFnS0M7O1lBL0pLLFNBQVM7Ozs7UUFBRyxVQUFDLEVBQVc7WUFDMUIsSUFBSSxFQUFFLFlBQVksVUFBVSxFQUFFOztvQkFDeEIsSUFBSSxHQUFHLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRTs7b0JBQ3RDLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJOztvQkFDMUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUc7O29CQUN6QixTQUFTLEdBQUcsS0FBSSxDQUFDLFNBQVM7Z0JBQzlCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FB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QXdMQzs7OztJQXZMQyx3QkFBcUI7O0lBQ3JCLHNCQUFVOztJQUNWLHNCQUFVOztJQUNWLDJCQUFtQjs7SUFDbkIsMEJBQXdCOztJQUN4Qiw0QkFFRzs7Ozs7SUFDSCwwQkFBK0M7O0FBZ0xqRDtJQUNFLGVBQW1CLFVBQWtCLEVBQVMsQ0FBUyxFQUFTLENBQVM7UUFBdEQsZUFBVSxHQUFWLFVBQVUsQ0FBUTtRQUFTLE1BQUMsR0FBRCxDQUFDLENBQVE7UUFBUyxNQUFDLEdBQUQsQ0FBQyxDQUFRO0lBQUcsQ0FBQztJQUMvRSxZQUFDO0FBQUQsQ0FBQyxBQUZELElBRUM7Ozs7SUFEYSwyQkFBeUI7O0lBQUUsa0JBQWdCOztJQUFFLGtCQUFnQjs7Ozs7QUFFM0UsbUNBS0M7Ozs7Ozs7SUFKQyxtREFBaUM7Ozs7OztJQUNqQyxpREFBK0I7Ozs7OztJQUMvQixvREFBa0M7Ozs7OztJQUNsQyxzREFBb0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XHJcbiAqIExhc3QgdXBkYXRlZCBNYXkgMSwgMjAxOS4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxyXG4gKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOSwgRXNvdGVyaWMgU29mdHdhcmUgTExDXHJcbiAqXHJcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xyXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxyXG4gKiBjb25kaXRpb25zIG9mIFNlY3Rpb24gMiBvZiB0aGUgU3BpbmUgRWRpdG9yIExpY2Vuc2UgQWdyZWVtZW50OlxyXG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcclxuICpcclxuICogT3RoZXJ3aXNlLCBpdCBpcyBwZXJtaXR0ZWQgdG8gaW50ZWdyYXRlIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlXHJcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcclxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxyXG4gKiBTcGluZSBFZGl0b3IgbGljZW5zZSBhbmQgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2R1Y3RzIGluIGFueSBmb3JtIG11c3RcclxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXHJcbiAqXHJcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVNPVEVSSUMgU09GVFdBUkUgTExDIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1NcclxuICogT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFU1xyXG4gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTlxyXG4gKiBOTyBFVkVOVCBTSEFMTCBFU09URVJJQyBTT0ZUV0FSRSBMTEMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCxcclxuICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyxcclxuICogQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLCBCVVNJTkVTU1xyXG4gKiBJTlRFUlJVUFRJT04sIE9SIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZXHJcbiAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElOR1xyXG4gKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsXHJcbiAqIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXHJcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcbmltcG9ydCB7IFBvb2wgfSBmcm9tIFwiLi4vY29yZS9VdGlsc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIElucHV0IHtcclxuICBlbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICBsYXN0WCA9IDA7XHJcbiAgbGFzdFkgPSAwO1xyXG4gIGJ1dHRvbkRvd24gPSBmYWxzZTtcclxuICBjdXJyVG91Y2g6IFRvdWNoID0gbnVsbDtcclxuICB0b3VjaGVzUG9vbCA9IG5ldyBQb29sPFRvdWNoPigoKSA9PiB7XHJcbiAgICByZXR1cm4gbmV3IFRvdWNoKDAsIDAsIDApO1xyXG4gIH0pO1xyXG4gIHByaXZhdGUgbGlzdGVuZXJzID0gbmV3IEFycmF5PElucHV0TGlzdGVuZXI+KCk7XHJcbiAgY29uc3RydWN0b3IoZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcclxuICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XHJcbiAgICB0aGlzLnNldHVwQ2FsbGJhY2tzKGVsZW1lbnQpO1xyXG4gIH1cclxuICBwcml2YXRlIHNldHVwQ2FsbGJhY2tzKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XHJcbiAgICBsZXQgbW91c2VEb3duID0gKGV2OiBVSUV2ZW50KSA9PiB7XHJcbiAgICAgIGlmIChldiBpbnN0YW5jZW9mIE1vdXNlRXZlbnQpIHtcclxuICAgICAgICBsZXQgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgbGV0IHggPSBldi5jbGllbnRYIC0gcmVjdC5sZWZ0O1xyXG4gICAgICAgIGxldCB5ID0gZXYuY2xpZW50WSAtIHJlY3QudG9wO1xyXG4gICAgICAgIGxldCBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVycztcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgbGlzdGVuZXJzW2ldLmRvd24oeCwgeSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubGFzdFggPSB4O1xyXG4gICAgICAgIHRoaXMubGFzdFkgPSB5O1xyXG4gICAgICAgIHRoaXMuYnV0dG9uRG93biA9IHRydWU7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCBtb3VzZU1vdmUpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIG1vdXNlVXApO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgbGV0IG1vdXNlTW92ZSA9IChldjogVUlFdmVudCkgPT4ge1xyXG4gICAgICBpZiAoZXYgaW5zdGFuY2VvZiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgbGV0IHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIGxldCB4ID0gZXYuY2xpZW50WCAtIHJlY3QubGVmdDtcclxuICAgICAgICBsZXQgeSA9IGV2LmNsaWVudFkgLSByZWN0LnRvcDtcclxuICAgICAgICBsZXQgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnM7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGlmICh0aGlzLmJ1dHRvbkRvd24pIHtcclxuICAgICAgICAgICAgbGlzdGVuZXJzW2ldLmRyYWdnZWQoeCwgeSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsaXN0ZW5lcnNbaV0ubW92ZWQoeCwgeSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubGFzdFggPSB4O1xyXG4gICAgICAgIHRoaXMubGFzdFkgPSB5O1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgbGV0IG1vdXNlVXAgPSAoZXY6IFVJRXZlbnQpID0+IHtcclxuICAgICAgaWYgKGV2IGluc3RhbmNlb2YgTW91c2VFdmVudCkge1xyXG4gICAgICAgIGxldCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICBsZXQgeCA9IGV2LmNsaWVudFggLSByZWN0LmxlZnQ7XHJcbiAgICAgICAgbGV0IHkgPSBldi5jbGllbnRZIC0gcmVjdC50b3A7XHJcbiAgICAgICAgbGV0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBsaXN0ZW5lcnNbaV0udXAoeCwgeSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubGFzdFggPSB4O1xyXG4gICAgICAgIHRoaXMubGFzdFkgPSB5O1xyXG4gICAgICAgIHRoaXMuYnV0dG9uRG93biA9IGZhbHNlO1xyXG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgbW91c2VNb3ZlKTtcclxuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCBtb3VzZVVwKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBtb3VzZURvd24sIHRydWUpO1xyXG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIG1vdXNlTW92ZSwgdHJ1ZSk7XHJcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIG1vdXNlVXAsIHRydWUpO1xyXG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxyXG4gICAgICBcInRvdWNoc3RhcnRcIixcclxuICAgICAgKGV2OiBUb3VjaEV2ZW50KSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VyclRvdWNoICE9IG51bGwpIHJldHVybjtcclxuICAgICAgICB2YXIgdG91Y2hlcyA9IGV2LmNoYW5nZWRUb3VjaGVzO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG91Y2hlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgdmFyIHRvdWNoID0gdG91Y2hlc1tpXTtcclxuICAgICAgICAgIGxldCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgIGxldCB4ID0gdG91Y2guY2xpZW50WCAtIHJlY3QubGVmdDtcclxuICAgICAgICAgIGxldCB5ID0gdG91Y2guY2xpZW50WSAtIHJlY3QudG9wO1xyXG4gICAgICAgICAgdGhpcy5jdXJyVG91Y2ggPSB0aGlzLnRvdWNoZXNQb29sLm9idGFpbigpO1xyXG4gICAgICAgICAgdGhpcy5jdXJyVG91Y2guaWRlbnRpZmllciA9IHRvdWNoLmlkZW50aWZpZXI7XHJcbiAgICAgICAgICB0aGlzLmN1cnJUb3VjaC54ID0geDtcclxuICAgICAgICAgIHRoaXMuY3VyclRvdWNoLnkgPSB5O1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVycztcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgbGlzdGVuZXJzW2ldLmRvd24odGhpcy5jdXJyVG91Y2gueCwgdGhpcy5jdXJyVG91Y2gueSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiU3RhcnQgXCIgKyB0aGlzLmN1cnJUb3VjaC54ICsgXCIsIFwiICsgdGhpcy5jdXJyVG91Y2gueSk7XHJcbiAgICAgICAgdGhpcy5sYXN0WCA9IHRoaXMuY3VyclRvdWNoLng7XHJcbiAgICAgICAgdGhpcy5sYXN0WSA9IHRoaXMuY3VyclRvdWNoLnk7XHJcbiAgICAgICAgdGhpcy5idXR0b25Eb3duID0gdHJ1ZTtcclxuICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB9LFxyXG4gICAgICBmYWxzZVxyXG4gICAgKTtcclxuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcclxuICAgICAgXCJ0b3VjaGVuZFwiLFxyXG4gICAgICAoZXY6IFRvdWNoRXZlbnQpID0+IHtcclxuICAgICAgICB2YXIgdG91Y2hlcyA9IGV2LmNoYW5nZWRUb3VjaGVzO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG91Y2hlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgdmFyIHRvdWNoID0gdG91Y2hlc1tpXTtcclxuICAgICAgICAgIGlmICh0aGlzLmN1cnJUb3VjaC5pZGVudGlmaWVyID09PSB0b3VjaC5pZGVudGlmaWVyKSB7XHJcbiAgICAgICAgICAgIGxldCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgbGV0IHggPSAodGhpcy5jdXJyVG91Y2gueCA9IHRvdWNoLmNsaWVudFggLSByZWN0LmxlZnQpO1xyXG4gICAgICAgICAgICBsZXQgeSA9ICh0aGlzLmN1cnJUb3VjaC55ID0gdG91Y2guY2xpZW50WSAtIHJlY3QudG9wKTtcclxuICAgICAgICAgICAgdGhpcy50b3VjaGVzUG9vbC5mcmVlKHRoaXMuY3VyclRvdWNoKTtcclxuICAgICAgICAgICAgbGV0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgIGxpc3RlbmVyc1tpXS51cCh4LCB5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVuZCBcIiArIHggKyBcIiwgXCIgKyB5KTtcclxuICAgICAgICAgICAgdGhpcy5sYXN0WCA9IHg7XHJcbiAgICAgICAgICAgIHRoaXMubGFzdFkgPSB5O1xyXG4gICAgICAgICAgICB0aGlzLmJ1dHRvbkRvd24gPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5jdXJyVG91Y2ggPSBudWxsO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgfSxcclxuICAgICAgZmFsc2VcclxuICAgICk7XHJcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXHJcbiAgICAgIFwidG91Y2hjYW5jZWxcIixcclxuICAgICAgKGV2OiBUb3VjaEV2ZW50KSA9PiB7XHJcbiAgICAgICAgdmFyIHRvdWNoZXMgPSBldi5jaGFuZ2VkVG91Y2hlcztcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRvdWNoZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIHZhciB0b3VjaCA9IHRvdWNoZXNbaV07XHJcbiAgICAgICAgICBpZiAodGhpcy5jdXJyVG91Y2guaWRlbnRpZmllciA9PT0gdG91Y2guaWRlbnRpZmllcikge1xyXG4gICAgICAgICAgICBsZXQgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgIGxldCB4ID0gKHRoaXMuY3VyclRvdWNoLnggPSB0b3VjaC5jbGllbnRYIC0gcmVjdC5sZWZ0KTtcclxuICAgICAgICAgICAgbGV0IHkgPSAodGhpcy5jdXJyVG91Y2gueSA9IHRvdWNoLmNsaWVudFkgLSByZWN0LnRvcCk7XHJcbiAgICAgICAgICAgIHRoaXMudG91Y2hlc1Bvb2wuZnJlZSh0aGlzLmN1cnJUb3VjaCk7XHJcbiAgICAgICAgICAgIGxldCBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVycztcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBsaXN0ZW5lcnNbaV0udXAoeCwgeSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFbmQgXCIgKyB4ICsgXCIsIFwiICsgeSk7XHJcbiAgICAgICAgICAgIHRoaXMubGFzdFggPSB4O1xyXG4gICAgICAgICAgICB0aGlzLmxhc3RZID0geTtcclxuICAgICAgICAgICAgdGhpcy5idXR0b25Eb3duID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuY3VyclRvdWNoID0gbnVsbDtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGZhbHNlXHJcbiAgICApO1xyXG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxyXG4gICAgICBcInRvdWNobW92ZVwiLFxyXG4gICAgICAoZXY6IFRvdWNoRXZlbnQpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5jdXJyVG91Y2ggPT0gbnVsbCkgcmV0dXJuO1xyXG4gICAgICAgIHZhciB0b3VjaGVzID0gZXYuY2hhbmdlZFRvdWNoZXM7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b3VjaGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICB2YXIgdG91Y2ggPSB0b3VjaGVzW2ldO1xyXG4gICAgICAgICAgaWYgKHRoaXMuY3VyclRvdWNoLmlkZW50aWZpZXIgPT09IHRvdWNoLmlkZW50aWZpZXIpIHtcclxuICAgICAgICAgICAgbGV0IHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICBsZXQgeCA9IHRvdWNoLmNsaWVudFggLSByZWN0LmxlZnQ7XHJcbiAgICAgICAgICAgIGxldCB5ID0gdG91Y2guY2xpZW50WSAtIHJlY3QudG9wO1xyXG4gICAgICAgICAgICBsZXQgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnM7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgbGlzdGVuZXJzW2ldLmRyYWdnZWQoeCwgeSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJEcmFnIFwiICsgeCArIFwiLCBcIiArIHkpO1xyXG4gICAgICAgICAgICB0aGlzLmxhc3RYID0gdGhpcy5jdXJyVG91Y2gueCA9IHg7XHJcbiAgICAgICAgICAgIHRoaXMubGFzdFkgPSB0aGlzLmN1cnJUb3VjaC55ID0geTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGZhbHNlXHJcbiAgICApO1xyXG4gIH1cclxuICBhZGRMaXN0ZW5lcihsaXN0ZW5lcjogSW5wdXRMaXN0ZW5lcikge1xyXG4gICAgdGhpcy5saXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XHJcbiAgfVxyXG4gIHJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyOiBJbnB1dExpc3RlbmVyKSB7XHJcbiAgICBsZXQgaWR4ID0gdGhpcy5saXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XHJcbiAgICBpZiAoaWR4ID4gLTEpIHtcclxuICAgICAgdGhpcy5saXN0ZW5lcnMuc3BsaWNlKGlkeCwgMSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbmV4cG9ydCBjbGFzcyBUb3VjaCB7XHJcbiAgY29uc3RydWN0b3IocHVibGljIGlkZW50aWZpZXI6IG51bWJlciwgcHVibGljIHg6IG51bWJlciwgcHVibGljIHk6IG51bWJlcikge31cclxufVxyXG5leHBvcnQgaW50ZXJmYWNlIElucHV0TGlzdGVuZXIge1xyXG4gIGRvd24oeDogbnVtYmVyLCB5OiBudW1iZXIpOiB2b2lkO1xyXG4gIHVwKHg6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZDtcclxuICBtb3ZlZCh4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQ7XHJcbiAgZHJhZ2dlZCh4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQ7XHJcbn1cclxuIl19