ngx-spine
Version:
[](https://travis-ci.org/PoiScript/ngx-spine)
456 lines • 34.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
/******************************************************************************
* 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 { ManagedWebGLRenderingContext } from "./WebGL";
import { Shader } from "./Shader";
var Mesh = /** @class */ (function () {
function Mesh(context, attributes, maxVertices, maxIndices) {
this.attributes = attributes;
this.verticesLength = 0;
this.dirtyVertices = false;
this.indicesLength = 0;
this.dirtyIndices = false;
this.elementsPerVertex = 0;
this.context =
context instanceof ManagedWebGLRenderingContext
? context
: new ManagedWebGLRenderingContext(context);
this.elementsPerVertex = 0;
for (var i = 0; i < attributes.length; i++) {
this.elementsPerVertex += attributes[i].numElements;
}
this.vertices = new Float32Array(maxVertices * this.elementsPerVertex);
this.indices = new Uint16Array(maxIndices);
this.context.addRestorable(this);
}
/**
* @return {?}
*/
Mesh.prototype.getAttributes = /**
* @return {?}
*/
function () {
return this.attributes;
};
/**
* @return {?}
*/
Mesh.prototype.maxVertices = /**
* @return {?}
*/
function () {
return this.vertices.length / this.elementsPerVertex;
};
/**
* @return {?}
*/
Mesh.prototype.numVertices = /**
* @return {?}
*/
function () {
return this.verticesLength / this.elementsPerVertex;
};
/**
* @param {?} length
* @return {?}
*/
Mesh.prototype.setVerticesLength = /**
* @param {?} length
* @return {?}
*/
function (length) {
this.dirtyVertices = true;
this.verticesLength = length;
};
/**
* @return {?}
*/
Mesh.prototype.getVertices = /**
* @return {?}
*/
function () {
return this.vertices;
};
/**
* @return {?}
*/
Mesh.prototype.maxIndices = /**
* @return {?}
*/
function () {
return this.indices.length;
};
/**
* @return {?}
*/
Mesh.prototype.numIndices = /**
* @return {?}
*/
function () {
return this.indicesLength;
};
/**
* @param {?} length
* @return {?}
*/
Mesh.prototype.setIndicesLength = /**
* @param {?} length
* @return {?}
*/
function (length) {
this.dirtyIndices = true;
this.indicesLength = length;
};
/**
* @return {?}
*/
Mesh.prototype.getIndices = /**
* @return {?}
*/
function () {
return this.indices;
};
/**
* @return {?}
*/
Mesh.prototype.getVertexSizeInFloats = /**
* @return {?}
*/
function () {
/** @type {?} */
var size = 0;
for (var i = 0; i < this.attributes.length; i++) {
/** @type {?} */
var attribute = this.attributes[i];
size += attribute.numElements;
}
return size;
};
/**
* @param {?} vertices
* @return {?}
*/
Mesh.prototype.setVertices = /**
* @param {?} vertices
* @return {?}
*/
function (vertices) {
this.dirtyVertices = true;
if (vertices.length > this.vertices.length)
throw Error("Mesh can't store more than " + this.maxVertices() + " vertices");
this.vertices.set(vertices, 0);
this.verticesLength = vertices.length;
};
/**
* @param {?} indices
* @return {?}
*/
Mesh.prototype.setIndices = /**
* @param {?} indices
* @return {?}
*/
function (indices) {
this.dirtyIndices = true;
if (indices.length > this.indices.length)
throw Error("Mesh can't store more than " + this.maxIndices() + " indices");
this.indices.set(indices, 0);
this.indicesLength = indices.length;
};
/**
* @param {?} shader
* @param {?} primitiveType
* @return {?}
*/
Mesh.prototype.draw = /**
* @param {?} shader
* @param {?} primitiveType
* @return {?}
*/
function (shader, primitiveType) {
this.drawWithOffset(shader, primitiveType, 0, this.indicesLength > 0
? this.indicesLength
: this.verticesLength / this.elementsPerVertex);
};
/**
* @param {?} shader
* @param {?} primitiveType
* @param {?} offset
* @param {?} count
* @return {?}
*/
Mesh.prototype.drawWithOffset = /**
* @param {?} shader
* @param {?} primitiveType
* @param {?} offset
* @param {?} count
* @return {?}
*/
function (shader, primitiveType, offset, count) {
/** @type {?} */
var gl = this.context.gl;
if (this.dirtyVertices || this.dirtyIndices)
this.update();
this.bind(shader);
if (this.indicesLength > 0) {
gl.drawElements(primitiveType, count, gl.UNSIGNED_SHORT, offset * 2);
}
else {
gl.drawArrays(primitiveType, offset, count);
}
this.unbind(shader);
};
/**
* @param {?} shader
* @return {?}
*/
Mesh.prototype.bind = /**
* @param {?} shader
* @return {?}
*/
function (shader) {
/** @type {?} */
var gl = this.context.gl;
gl.bindBuffer(gl.ARRAY_BUFFER, this.verticesBuffer);
/** @type {?} */
var offset = 0;
for (var i = 0; i < this.attributes.length; i++) {
/** @type {?} */
var attrib = this.attributes[i];
/** @type {?} */
var location_1 = shader.getAttributeLocation(attrib.name);
gl.enableVertexAttribArray(location_1);
gl.vertexAttribPointer(location_1, attrib.numElements, gl.FLOAT, false, this.elementsPerVertex * 4, offset * 4);
offset += attrib.numElements;
}
if (this.indicesLength > 0)
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indicesBuffer);
};
/**
* @param {?} shader
* @return {?}
*/
Mesh.prototype.unbind = /**
* @param {?} shader
* @return {?}
*/
function (shader) {
/** @type {?} */
var gl = this.context.gl;
for (var i = 0; i < this.attributes.length; i++) {
/** @type {?} */
var attrib = this.attributes[i];
/** @type {?} */
var location_2 = shader.getAttributeLocation(attrib.name);
gl.disableVertexAttribArray(location_2);
}
gl.bindBuffer(gl.ARRAY_BUFFER, null);
if (this.indicesLength > 0)
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);
};
/**
* @private
* @return {?}
*/
Mesh.prototype.update = /**
* @private
* @return {?}
*/
function () {
/** @type {?} */
var gl = this.context.gl;
if (this.dirtyVertices) {
if (!this.verticesBuffer) {
this.verticesBuffer = gl.createBuffer();
}
gl.bindBuffer(gl.ARRAY_BUFFER, this.verticesBuffer);
gl.bufferData(gl.ARRAY_BUFFER, this.vertices.subarray(0, this.verticesLength), gl.DYNAMIC_DRAW);
this.dirtyVertices = false;
}
if (this.dirtyIndices) {
if (!this.indicesBuffer) {
this.indicesBuffer = gl.createBuffer();
}
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indicesBuffer);
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.indices.subarray(0, this.indicesLength), gl.DYNAMIC_DRAW);
this.dirtyIndices = false;
}
};
/**
* @return {?}
*/
Mesh.prototype.restore = /**
* @return {?}
*/
function () {
this.verticesBuffer = null;
this.indicesBuffer = null;
this.update();
};
/**
* @return {?}
*/
Mesh.prototype.dispose = /**
* @return {?}
*/
function () {
this.context.removeRestorable(this);
/** @type {?} */
var gl = this.context.gl;
gl.deleteBuffer(this.verticesBuffer);
gl.deleteBuffer(this.indicesBuffer);
};
return Mesh;
}());
export { Mesh };
if (false) {
/**
* @type {?}
* @private
*/
Mesh.prototype.context;
/**
* @type {?}
* @private
*/
Mesh.prototype.vertices;
/**
* @type {?}
* @private
*/
Mesh.prototype.verticesBuffer;
/**
* @type {?}
* @private
*/
Mesh.prototype.verticesLength;
/**
* @type {?}
* @private
*/
Mesh.prototype.dirtyVertices;
/**
* @type {?}
* @private
*/
Mesh.prototype.indices;
/**
* @type {?}
* @private
*/
Mesh.prototype.indicesBuffer;
/**
* @type {?}
* @private
*/
Mesh.prototype.indicesLength;
/**
* @type {?}
* @private
*/
Mesh.prototype.dirtyIndices;
/**
* @type {?}
* @private
*/
Mesh.prototype.elementsPerVertex;
/**
* @type {?}
* @private
*/
Mesh.prototype.attributes;
}
var VertexAttribute = /** @class */ (function () {
function VertexAttribute(name, type, numElements) {
this.name = name;
this.type = type;
this.numElements = numElements;
}
return VertexAttribute;
}());
export { VertexAttribute };
if (false) {
/** @type {?} */
VertexAttribute.prototype.name;
/** @type {?} */
VertexAttribute.prototype.type;
/** @type {?} */
VertexAttribute.prototype.numElements;
}
var Position2Attribute = /** @class */ (function (_super) {
tslib_1.__extends(Position2Attribute, _super);
function Position2Attribute() {
return _super.call(this, Shader.POSITION, VertexAttributeType.Float, 2) || this;
}
return Position2Attribute;
}(VertexAttribute));
export { Position2Attribute };
var Position3Attribute = /** @class */ (function (_super) {
tslib_1.__extends(Position3Attribute, _super);
function Position3Attribute() {
return _super.call(this, Shader.POSITION, VertexAttributeType.Float, 3) || this;
}
return Position3Attribute;
}(VertexAttribute));
export { Position3Attribute };
var TexCoordAttribute = /** @class */ (function (_super) {
tslib_1.__extends(TexCoordAttribute, _super);
function TexCoordAttribute(unit) {
if (unit === void 0) { unit = 0; }
return _super.call(this, Shader.TEXCOORDS + (unit == 0 ? "" : unit), VertexAttributeType.Float, 2) || this;
}
return TexCoordAttribute;
}(VertexAttribute));
export { TexCoordAttribute };
var ColorAttribute = /** @class */ (function (_super) {
tslib_1.__extends(ColorAttribute, _super);
function ColorAttribute() {
return _super.call(this, Shader.COLOR, VertexAttributeType.Float, 4) || this;
}
return ColorAttribute;
}(VertexAttribute));
export { ColorAttribute };
var Color2Attribute = /** @class */ (function (_super) {
tslib_1.__extends(Color2Attribute, _super);
function Color2Attribute() {
return _super.call(this, Shader.COLOR2, VertexAttributeType.Float, 4) || this;
}
return Color2Attribute;
}(VertexAttribute));
export { Color2Attribute };
/** @enum {number} */
var VertexAttributeType = {
Float: 0,
};
export { VertexAttributeType };
VertexAttributeType[VertexAttributeType.Float] = 'Float';
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVzaC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1zcGluZS8iLCJzb3VyY2VzIjpbImxpYi9zcGluZS10cy93ZWJnbC9NZXNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTRCQSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUVsQztJQWdERSxjQUNFLE9BQTZELEVBQ3JELFVBQTZCLEVBQ3JDLFdBQW1CLEVBQ25CLFVBQWtCO1FBRlYsZUFBVSxHQUFWLFVBQVUsQ0FBbUI7UUE5Qy9CLG1CQUFjLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBR3RCLGtCQUFhLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLHNCQUFpQixHQUFHLENBQUMsQ0FBQztRQTRDNUIsSUFBSSxDQUFDLE9BQU87WUFDVixPQUFPLFlBQVksNEJBQTRCO2dCQUM3QyxDQUFDLENBQUMsT0FBTztnQkFDVCxDQUFDLENBQUMsSUFBSSw0QkFBNEIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO1FBQzNCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFDLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO1NBQ3JEO1FBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLFlBQVksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDdkUsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztR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ckQ7ZUFDRSxrQkFBTSxNQUFNLENBQUMsUUFBUSxFQUFFLG1CQUFtQixDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUNILHlCQUFDO0FBQUQsQ0FBQyxBQUpELENBQXdDLGVBQWUsR0FJdEQ7O0FBQ0Q7SUFBdUMsNkNBQWU7SUFDcEQsMkJBQVksSUFBZ0I7UUFBaEIscUJBQUEsRUFBQSxRQUFnQjtlQUMxQixrQkFDRSxNQUFNLENBQUMsU0FBUyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFDMUMsbUJBQW1CLENBQUMsS0FBSyxFQUN6QixDQUFDLENBQ0Y7SUFDSCxDQUFDO0lBQ0gsd0JBQUM7QUFBRCxDQUFDLEFBUkQsQ0FBdUMsZUFBZSxHQVFyRDs7QUFDRDtJQUFvQywwQ0FBZTtJQUNqRDtlQUNFLGtCQUFNLE1BQU0sQ0FBQyxLQUFLLEVBQUUsbUJBQW1CLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBQ0gscUJBQUM7QUFBRCxDQUFDLEFBSkQsQ0FBb0MsZUFBZSxHQUlsRDs7QUFDRDtJQUFxQywyQ0FBZTtJQUNsRDtlQUNFLGtCQUFNLE1BQU0sQ0FBQyxNQUFNLEVBQUUsbUJBQW1CLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBQ0gsc0JBQUM7QUFBRCxDQUFDLEFBSkQsQ0FBcUMsZUFBZSxHQUluRDs7OztJQUVDLFFBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XHJcbiAqIExhc3QgdXBkYXRlZCBNYXkgMSwgMjAxOS4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxyXG4gKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOSwgRXNvdGVyaWMgU29mdHdhcmUgTExDXHJcbiAqXHJcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xyXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxyXG4gKiBjb25kaXRpb25zIG9mIFNlY3Rpb24gMiBvZiB0aGUgU3BpbmUgRWRpdG9yIExpY2Vuc2UgQWdyZWVtZW50OlxyXG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcclxuICpcclxuICogT3RoZXJ3aXNlLCBpdCBpcyBwZXJtaXR0ZWQgdG8gaW50ZWdyYXRlIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlXHJcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcclxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxyXG4gKiBTcGluZSBFZGl0b3IgbGljZW5zZSBhbmQgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2R1Y3RzIGluIGFueSBmb3JtIG11c3RcclxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXHJcbiAqXHJcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVNPVEVSSUMgU09GVFdBUkUgTExDIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1NcclxuICogT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFU1xyXG4gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTlxyXG4gKiBOTyBFVkVOVCBTSEFMTCBFU09URVJJQyBTT0ZUV0FSRSBMTEMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCxcclxuICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyxcclxuICogQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLCBCVVNJTkVTU1xyXG4gKiBJTlRFUlJVUFRJT04sIE9SIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZXHJcbiAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElOR1xyXG4gKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsXHJcbiAqIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXHJcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuaW1wb3J0IHsgTWFuYWdlZFdlYkdMUmVuZGVyaW5nQ29udGV4dCB9IGZyb20gXCIuL1dlYkdMXCI7XHJcbmltcG9ydCB7IERpc3Bvc2FibGUsIFJlc3RvcmFibGUgfSBmcm9tIFwiLi4vY29yZS9VdGlsc1wiO1xyXG5pbXBvcnQgeyBTaGFkZXIgfSBmcm9tIFwiLi9TaGFkZXJcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNZXNoIGltcGxlbWVudHMgRGlzcG9zYWJsZSwgUmVzdG9yYWJsZSB7XHJcbiAgcHJpdmF0ZSBjb250ZXh0OiBNYW5hZ2VkV2ViR0xSZW5kZXJpbmdDb250ZXh0O1xyXG4gIHByaXZhdGUgdmVydGljZXM6IEZsb2F0MzJBcnJheTtcclxuICBwcml2YXRlIHZlcnRpY2VzQnVmZmVyOiBXZWJHTEJ1ZmZlcjtcclxuICBwcml2YXRlIHZlcnRpY2VzTGVuZ3RoID0gMDtcclxuICBwcml2YXRlIGRpcnR5VmVydGljZXMgPSBmYWxzZTtcclxuICBwcml2YXRlIGluZGljZXM6IFVpbnQxNkFycmF5O1xyXG4gIHByaXZhdGUgaW5kaWNlc0J1ZmZlcjogV2ViR0xCdWZmZXI7XHJcbiAgcHJpdmF0ZSBpbmRpY2VzTGVuZ3RoID0gMDtcclxuICBwcml2YXRlIGRpcnR5SW5kaWNlcyA9IGZhbHNlO1xyXG4gIHByaXZhdGUgZWxlbWVudHNQZXJWZXJ0ZXggPSAwO1xyXG4gIGdldEF0dHJpYnV0ZXMoKTogVmVydGV4QXR0cmlidXRlW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlcztcclxuICB9XHJcbiAgbWF4VmVydGljZXMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnZlcnRpY2VzLmxlbmd0aCAvIHRoaXMuZWxlbWVudHNQZXJWZXJ0ZXg7XHJcbiAgfVxyXG4gIG51bVZlcnRpY2VzKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy52ZXJ0aWNlc0xlbmd0aCAvIHRoaXMuZWxlbWVudHNQZXJWZXJ0ZXg7XHJcbiAgfVxyXG4gIHNldFZlcnRpY2VzTGVuZ3RoKGxlbmd0aDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmRpcnR5VmVydGljZXMgPSB0cnVlO1xyXG4gICAgdGhpcy52ZXJ0aWNlc0xlbmd0aCA9IGxlbmd0aDtcclxuICB9XHJcbiAgZ2V0VmVydGljZXMoKTogRmxvYXQzMkFycmF5IHtcclxuICAgIHJldHVybiB0aGlzLnZlcnRpY2VzO1xyXG4gIH1cclxuICBtYXhJbmRpY2VzKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5pbmRpY2VzLmxlbmd0aDtcclxuICB9XHJcbiAgbnVtSW5kaWNlcygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuaW5kaWNlc0xlbmd0aDtcclxuICB9XHJcbiAgc2V0SW5kaWNlc0xlbmd0aChsZW5ndGg6IG51bWJlcikge1xyXG4gICAgdGhpcy5kaXJ0eUluZGljZXMgPSB0cnVlO1xyXG4gICAgdGhpcy5pbmRpY2VzTGVuZ3RoID0gbGVuZ3RoO1xyXG4gIH1cclxuICBnZXRJbmRpY2VzKCk6IFVpbnQxNkFycmF5IHtcclxuICAgIHJldHVybiB0aGlzLmluZGljZXM7XHJcbiAgfVxyXG4gIGdldFZlcnRleFNpemVJbkZsb2F0cygpOiBudW1iZXIge1xyXG4gICAgbGV0IHNpemUgPSAwO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlc1tpXTtcclxuICAgICAgc2l6ZSArPSBhdHRyaWJ1dGUubnVtRWxlbWVudHM7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc2l6ZTtcclxuICB9XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBjb250ZXh0OiBNYW5hZ2VkV2ViR0xSZW5kZXJpbmdDb250ZXh0IHwgV2ViR0xSZW5kZXJpbmdDb250ZXh0LFxyXG4gICAgcHJpdmF0ZSBhdHRyaWJ1dGVzOiBWZXJ0ZXhBdHRyaWJ1dGVbXSxcclxuICAgIG1heFZlcnRpY2VzOiBudW1iZXIsXHJcbiAgICBtYXhJbmRpY2VzOiBudW1iZXJcclxuICApIHtcclxuICAgIHRoaXMuY29udGV4dCA9XHJcbiAgICAgIGNvbnRleHQgaW5zdGFuY2VvZiBNYW5hZ2VkV2ViR0xSZW5kZXJpbmdDb250ZXh0XHJcbiAgICAgICAgPyBjb250ZXh0XHJcbiAgICAgICAgOiBuZXcgTWFuYWdlZFdlYkdMUmVuZGVyaW5nQ29udGV4dChjb250ZXh0KTtcclxuICAgIHRoaXMuZWxlbWVudHNQZXJWZXJ0ZXggPSAwO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHRoaXMuZWxlbWVudHNQZXJWZXJ0ZXggKz0gYXR0cmlidXRlc1tpXS5udW1FbGVtZW50cztcclxuICAgIH1cclxuICAgIHRoaXMudmVydGljZXMgPSBuZXcgRmxvYXQzMkFycmF5KG1heFZlcnRpY2VzICogdGhpcy5lbGVtZW50c1BlclZlcnRleCk7XHJcbiAgICB0aGlzLmluZGljZXMgPSBuZXcgVWludDE2QXJyYXkobWF4SW5kaWNlcyk7XHJcbiAgICB0aGlzLmNvbnRleHQuYWRkUmVzdG9yYWJsZSh0aGlzKTtcclxuICB9XHJcbiAgc2V0VmVydGljZXModmVydGljZXM6IEFycmF5PG51bWJlcj4pIHtcclxuICAgIHRoaXMuZGlydHlWZXJ0aWNlcyA9IHRydWU7XHJcbiAgICBpZiAodmVydGljZXMubGVuZ3RoID4gdGhpcy52ZXJ0aWNlcy5sZW5ndGgpXHJcbiAgICAgIHRocm93IEVycm9yKFxyXG4gICAgICAgIFwiTWVzaCBjYW4ndCBzdG9yZSBtb3JlIHRoYW4gXCIgKyB0aGlzLm1heFZlcnRpY2VzKCkgKyBcIiB2ZXJ0aWNlc1wiXHJcbiAgICAgICk7XHJcbiAgICB0aGlzLnZlcnRpY2VzLnNldCh2ZXJ0aWNlcywgMCk7XHJcbiAgICB0aGlzLnZlcnRpY2VzTGVuZ3RoID0gdmVydGljZXMubGVuZ3RoO1xyXG4gIH1cclxuICBzZXRJbmRpY2VzKGluZGljZXM6IEFycmF5PG51bWJlcj4pIHtcclxuICAgIHRoaXMuZGlydHlJbmRpY2VzID0gdHJ1ZTtcclxuICAgIGlmIChpbmRpY2VzLmxlbmd0aCA+IHRoaXMuaW5kaWNlcy5sZW5ndGgpXHJcbiAgICAgIHRocm93IEVycm9yKFxyXG4gICAgICAgIFwiTWVzaCBjYW4ndCBzdG9yZSBtb3JlIHRoYW4gXCIgKyB0aGlzLm1heEluZGljZXMoKSArIFwiIGluZGljZXNcIlxyXG4gICAgICApO1xyXG4gICAgdGhpcy5pbmRpY2VzLnNldChpbmRpY2VzLCAwKTtcclxuICAgIHRoaXMuaW5kaWNlc0xlbmd0aCA9IGluZGljZXMubGVuZ3RoO1xyXG4gIH1cclxuICBkcmF3KHNoYWRlcjogU2hhZGVyLCBwcmltaXRpdmVUeXBlOiBudW1iZXIpIHtcclxuICAgIHRoaXMuZHJhd1dpdGhPZmZzZXQoXHJcbiAgICAgIHNoYWRlcixcclxuICAgICAgcHJpbWl0aXZlVHlwZSxcclxuICAgICAgMCxcclxuICAgICAgdGhpcy5pbmRpY2VzTGVuZ3RoID4gMFxyXG4gICAgICAgID8gdGhpcy5pbmRpY2VzTGVuZ3RoXHJcbiAgICAgICAgOiB0aGlzLnZlcnRpY2VzTGVuZ3RoIC8gdGhpcy5lbGVtZW50c1BlclZlcnRleFxyXG4gICAgKTtcclxuICB9XHJcbiAgZHJhd1dpdGhPZmZzZXQoXHJcbiAgICBzaGFkZXI6IFNoYWRlcixcclxuICAgIHByaW1pdGl2ZVR5cGU6IG51bWJlcixcclxuICAgIG9mZnNldDogbnVtYmVyLFxyXG4gICAgY291bnQ6IG51bWJlclxyXG4gICkge1xyXG4gICAgbGV0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xyXG4gICAgaWYgKHRoaXMuZGlydHlWZXJ0aWNlcyB8fCB0aGlzLmRpcnR5SW5kaWNlcykgdGhpcy51cGRhdGUoKTtcclxuICAgIHRoaXMuYmluZChzaGFkZXIpO1xyXG4gICAgaWYgKHRoaXMuaW5kaWNlc0xlbmd0aCA+IDApIHtcclxuICAgICAgZ2wuZHJhd0VsZW1lbnRzKHByaW1pdGl2ZVR5cGUsIGNvdW50LCBnbC5VTlNJR05FRF9TSE9SVCwgb2Zmc2V0ICogMik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBnbC5kcmF3QXJyYXlzKHByaW1pdGl2ZVR5cGUsIG9mZnNldCwgY291bnQpO1xyXG4gICAgfVxyXG4gICAgdGhpcy51bmJpbmQoc2hhZGVyKTtcclxuICB9XHJcbiAgYmluZChzaGFkZXI6IFNoYWRlcikge1xyXG4gICAgbGV0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xyXG4gICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHRoaXMudmVydGljZXNCdWZmZXIpO1xyXG4gICAgbGV0IG9mZnNldCA9IDA7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgYXR0cmliID0gdGhpcy5hdHRyaWJ1dGVzW2ldO1xyXG4gICAgICBsZXQgbG9jYXRpb24gPSBzaGFkZXIuZ2V0QXR0cmlidXRlTG9jYXRpb24oYXR0cmliLm5hbWUpO1xyXG4gICAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShsb2NhdGlvbik7XHJcbiAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoXHJcbiAgICAgICAgbG9jYXRpb24sXHJcbiAgICAgICAgYXR0cmliLm51bUVsZW1lbnRzLFxyXG4gICAgICAgIGdsLkZMT0FULFxyXG4gICAgICAgIGZhbHNlLFxyXG4gICAgICAgIHRoaXMuZWxlbWVudHNQZXJWZXJ0ZXggKiA0LFxyXG4gICAgICAgIG9mZnNldCAqIDRcclxuICAgICAgKTtcclxuICAgICAgb2Zmc2V0ICs9IGF0dHJpYi5udW1FbGVtZW50cztcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmluZGljZXNMZW5ndGggPiAwKVxyXG4gICAgICBnbC5iaW5kQnVmZmVyKGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCB0aGlzLmluZGljZXNCdWZmZXIpO1xyXG4gIH1cclxuICB1bmJpbmQoc2hhZGVyOiBTaGFkZXIpIHtcclxuICAgIGxldCBnbCA9IHRoaXMuY29udGV4dC5nbDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBhdHRyaWIgPSB0aGlzLmF0dHJpYnV0ZXNbaV07XHJcbiAgICAgIGxldCBsb2NhdGlvbiA9IHNoYWRlci5nZXRBdHRyaWJ1dGVMb2NhdGlvbihhdHRyaWIubmFtZSk7XHJcbiAgICAgIGdsLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShsb2NhdGlvbik7XHJcbiAgICB9XHJcbiAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgbnVsbCk7XHJcbiAgICBpZiAodGhpcy5pbmRpY2VzTGVuZ3RoID4gMCkgZ2wuYmluZEJ1ZmZlcihnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgbnVsbCk7XHJcbiAgfVxyXG4gIHByaXZhdGUgdXBkYXRlKCkge1xyXG4gICAgbGV0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xyXG4gICAgaWYgKHRoaXMuZGlydHlWZXJ0aWNlcykge1xyXG4gICAgICBpZiAoIXRoaXMudmVydGljZXNCdWZmZXIpIHtcclxuICAgICAgICB0aGlzLnZlcnRpY2VzQnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XHJcbiAgICAgIH1cclxuICAgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHRoaXMudmVydGljZXNCdWZmZXIpO1xyXG4gICAgICBnbC5idWZmZXJEYXRhKFxyXG4gICAgICAgIGdsLkFSUkFZX0JVRkZFUixcclxuICAgICAgICB0aGlzLnZlcnRpY2VzLnN1YmFycmF5KDAsIHRoaXMudmVydGljZXNMZW5ndGgpLFxyXG4gICAgICAgIGdsLkRZTkFNSUNfRFJBV1xyXG4gICAgICApO1xyXG4gICAgICB0aGlzLmRpcnR5VmVydGljZXMgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmRpcnR5SW5kaWNlcykge1xyXG4gICAgICBpZiAoIXRoaXMuaW5kaWNlc0J1ZmZlcikge1xyXG4gICAgICAgIHRoaXMuaW5kaWNlc0J1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpO1xyXG4gICAgICB9XHJcbiAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIHRoaXMuaW5kaWNlc0J1ZmZlcik7XHJcbiAgICAgIGdsLmJ1ZmZlckRhdGEoXHJcbiAgICAgICAgZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsXHJcbiAgICAgICAgdGhpcy5pbmRpY2VzLnN1YmFycmF5KDAsIHRoaXMuaW5kaWNlc0xlbmd0aCksXHJcbiAgICAgICAgZ2wuRFlOQU1JQ19EUkFXXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuZGlydHlJbmRpY2VzID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJlc3RvcmUoKSB7XHJcbiAgICB0aGlzLnZlcnRpY2VzQnVmZmVyID0gbnVsbDtcclxuICAgIHRoaXMuaW5kaWNlc0J1ZmZlciA9IG51bGw7XHJcbiAgICB0aGlzLnVwZGF0ZSgpO1xyXG4gIH1cclxuICBkaXNwb3NlKCkge1xyXG4gICAgdGhpcy5jb250ZXh0LnJlbW92ZVJlc3RvcmFibGUodGhpcyk7XHJcbiAgICBsZXQgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XHJcbiAgICBnbC5kZWxldGVCdWZmZXIodGhpcy52ZXJ0aWNlc0J1ZmZlcik7XHJcbiAgICBnbC5kZWxldGVCdWZmZXIodGhpcy5pbmRpY2VzQnVmZmVyKTtcclxuICB9XHJcbn1cclxuZXhwb3J0IGNsYXNzIFZlcnRleEF0dHJpYnV0ZSB7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nLFxyXG4gICAgcHVibGljIHR5cGU6IFZlcnRleEF0dHJpYnV0ZVR5cGUsXHJcbiAgICBwdWJsaWMgbnVtRWxlbWVudHM6IG51bWJlclxyXG4gICkge31cclxufVxyXG5leHBvcnQgY2xhc3MgUG9zaXRpb24yQXR0cmlidXRlIGV4dGVuZHMgVmVydGV4QXR0cmlidXRlIHtcclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHN1cGVyKFNoYWRlci5QT1NJVElPTiwgVmVydGV4QXR0cmlidXRlVHlwZS5GbG9hdCwgMik7XHJcbiAgfVxyXG59XHJcbmV4cG9ydCBjbGFzcyBQb3NpdGlvbjNBdHRyaWJ1dGUgZXh0ZW5kcyBWZXJ0ZXhBdHRyaWJ1dGUge1xyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgc3VwZXIoU2hhZGVyLlBPU0lUSU9OLCBWZXJ0ZXhBdHRyaWJ1dGVUeXBlLkZsb2F0LCAzKTtcclxuICB9XHJcbn1cclxuZXhwb3J0IGNsYXNzIFRleENvb3JkQXR0cmlidXRlIGV4dGVuZHMgVmVydGV4QXR0cmlidXRlIHtcclxuICBjb25zdHJ1Y3Rvcih1bml0OiBudW1iZXIgPSAwKSB7XHJcbiAgICBzdXBlcihcclxuICAgICAgU2hhZGVyLlRFWENPT1JEUyArICh1bml0ID09IDAgPyBcIlwiIDogdW5pdCksXHJcbiAgICAgIFZlcnRleEF0dHJpYnV0ZVR5cGUuRmxvYXQsXHJcbiAgICAgIDJcclxuICAgICk7XHJcbiAgfVxyXG59XHJcbmV4cG9ydCBjbGFzcyBDb2xvckF0dHJpYnV0ZSBleHRlbmRzIFZlcnRleEF0dHJpYnV0ZSB7XHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICBzdXBlcihTaGFkZXIuQ09MT1IsIFZlcnRleEF0dHJpYnV0ZVR5cGUuRmxvYXQsIDQpO1xyXG4gIH1cclxufVxyXG5leHBvcnQgY2xhc3MgQ29sb3IyQXR0cmlidXRlIGV4dGVuZHMgVmVydGV4QXR0cmlidXRlIHtcclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHN1cGVyKFNoYWRlci5DT0xPUjIsIFZlcnRleEF0dHJpYnV0ZVR5cGUuRmxvYXQsIDQpO1xyXG4gIH1cclxufVxyXG5leHBvcnQgZW51bSBWZXJ0ZXhBdHRyaWJ1dGVUeXBlIHtcclxuICBGbG9hdFxyXG59XHJcbiJdfQ==